継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

ecspresso をローカルにインストールして ECS デプロイをやってみる

タダです.

業務で ecspresso の利用検討の機会が出てきて触ったことがなかったので,この記事でローカルにツールのインストールとローカルから ECS デプロイをするまでにやったことを備忘録としてまとめます.なお,本記事の備忘録の内容は ecspresso ハンドブックを見させていただきつつ進めた内容になります.

ecspresso

ecspresso とは面白法人カヤックfujiwaraさんが開発された ECS デプロイツールです.

github.com

ecspresso の特徴として以下のものがあり,個人的には業務で Terraform でのリソース管理を扱っているため,tfstate を読み込んで使うことができると点が気になりなので触って動作理解していきます.

  • ECS サービスとタスクに関わるリソースをコード管理・デプロイを実行するためのツール
    • 逆に関連リソースの VPC や ALB といったリソースの作成・管理する機能はない(この辺は AWS Copilot とは管理範囲が違いますね)
  • tfstate ファイルを読んで使ったり,CloudFormation の Outputs や Export の値を読んで扱うことができる
  • 既存の ECS サービスとタスクも管理できるから手で作って管理しきれてなかったリソースも管理対象にしていける

インストールローカルにインストールするためにはいくつか選択肢がありますが,この記事では Homebrew で行いました.

$ brew install kayac/tap/ecspresso
$ ecspressoo version
ecspresso v1.7.12
$ ecspresso help
usage: ecspresso [<flags>] <command> [<args> ...]

Flags:
  --help                    Show context-sensitive help (also try --help-long and --help-man).
  --config="ecspresso.yml"  config file
  --debug                   enable debug log
  --envfile=ENVFILE ...     environment files
  --ext-str=EXT-STR ...     external string values for Jsonnet
  --ext-code=EXT-CODE ...   external code values for Jsonnet
  --color                   enable colored output

Commands:
  help [<command>...]
    Show help.

  version
    show version

  deploy [<flags>]
    deploy service

  scale [<flags>]
    scale service. equivalent to deploy --skip-task-definition --no-update-service

  refresh [<flags>]
    refresh service. equivalent to deploy --skip-task-definition --force-new-deployment --no-update-service

  create [<flags>]
    create service

  status [<flags>]
    show status of service

  rollback [<flags>]
    roll back a service

  delete [<flags>]
    delete service

  run [<flags>]
    run task

  register [<flags>]
    register task definition

  deregister [<flags>]
    deregister task definition

  revisions [<flags>]
    show revisions of task definitions

  wait
    wait until service stable

  init --service=SERVICE [<flags>]
    create service/task definition files by existing ECS service

  diff [<flags>]
    display diff for task definition compared with latest one on ECS

  appspec [<flags>]
    output AppSpec YAML for CodeDeploy to STDOUT

  verify [<flags>]
    verify resources in configurations

  render [<flags>]
    render config, service definition or task definition file to stdout

  tasks [<flags>]
    list tasks that are in a service or having the same family

  exec [<flags>]
    execute command in a task

ローカルからデプロイする

デプロイ設定ファイルの生成

ツールを入れられたので,ローカルから ECS デプロイをやってみます.既存の ECS タスクやサービスから設定情報を取り込める機能があるため,個人環境の手で作ったリソースを取り込んでみます.ecs-service-def.jsonecs-task-def.jsonecspresso.yml が生成されました.

$ ecspresso init --region ap-northeast-1 --cluster default --service myservice --config ecspresso.yml
2022/09/10 17:16:54 test/example save service definition to ecs-service-def.json
2022/09/10 17:16:54 test/example save task definition to ecs-task-def.json
2022/09/10 17:16:54 test/example save config to ecspresso.yml

生成された3つのファイルの内容は次の通りです.

  • ecs-service-def.json : ECS サービスの構成定義ファイル
  • ecs-task-def.json : ECS タスク定義ファイル
  • ecspresso.yml : ecspresso 設定ファイル

各ファイルの詳細

ecs-service-def.json 詳細(クリックで展開)

  {
  "deploymentConfiguration": {
    "deploymentCircuitBreaker": {
      "enable": false,
      "rollback": false
    },
    "maximumPercent": 200,
    "minimumHealthyPercent": 50
  },
  "desiredCount": 1,
  "enableECSManagedTags": true,
  "enableExecuteCommand": false,
  "launchType": "FARGATE",
  "loadBalancers": [],
  "networkConfiguration": {
    "awsvpcConfiguration": {
      "assignPublicIp": "ENABLED",
      "securityGroups": [
        "sg-12356789"
      ],
      "subnets": [
        "subnet-123456789",
        "subnet-987654321"
      ]
    }
  },
  "placementConstraints": [],
  "placementStrategy": [],
  "platformFamily": "Linux",
  "platformVersion": "LATEST",
  "schedulingStrategy": "REPLICA",
  "serviceRegistries": [],
  "tags": []
}

ecs-task-def.json の詳細(クリックで展開)

{
  "containerDefinitions": [
    {
      "cpu": 0,
      "environment": [],
      "essential": true,
      "image": "123456789.dkr.ecr.ap-northeast-1.amazonaws.com/hoge:latest",
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/example",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "hoge"
        }
      },
      "mountPoints": [],
      "name": "nginx",
      "portMappings": [
        {
          "containerPort": 80,
          "hostPort": 80,
          "protocol": "tcp"
        }
      ],
      "volumesFrom": []
    },
    {
      "cpu": 0,
      "environment": [
        {
          "name": "MACKEREL_ROLES",
          "value": "mkr-dev:ecs"
        },
        {
          "name": "MACKEREL_CONTAINER_PLATFORM",
          "value": "ecs"
        }
      ],
      "essential": true,
      "image": "mackerel/mackerel-container-agent:latest",
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/example",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "mackerel"
        }
      },
      "memoryReservation": 128,
      "mountPoints": [],
      "name": "mackerel-container-agent",
      "portMappings": [],
      "secrets": [
        {
          "name": "MACKEREL_APIKEY",
          "valueFrom": "mackerel_agent_apikey"
        }
      ],
      "volumesFrom": []
    }
  ],
  "cpu": "256",
  "executionRoleArn": "arn:aws:iam::123456789:role/ecsTaskExecutionRole",
  "family": "nginx",
  "memory": "512",
  "networkMode": "awsvpc",
  "placementConstraints": [],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "volumes": []
}

ecspresso.yml の詳細(クリックで展開)

region: ap-northeast-1
cluster: example
service: test
service_definition: ecs-service-def.json
task_definition: ecs-task-def.json
timeout: 10m0s

デプロイコマンドの実行

3つの設定ファイルが生成されたら,これでデプロイの準備が整ったのでタスクをデプロイしてみます.タスク定義を新規で作り,サービスのタスクを1つ新規タスク定義で起動したものをデプロイしてくれました.すごく簡単にできて体験がよかったです...

ecspresso deploy --config ecspresso.yml
2022/09/10 17:22:28 test/example Starting deploy
Service: test
Cluster: example
TaskDefinition: nginx:23
Deployments:
   PRIMARY nginx:23 desired:1 pending:0 running:1
Events:
2022/09/10 17:22:29 test/example Registering a new task definition...
2022/09/10 17:22:29 test/example Task definition is registered nginx:24
2022/09/10 17:22:29 test/example Updating service attributes...
2022/09/10 17:22:34 test/example desired count: 1
2022/09/10 17:22:34 test/example Updating service tasks...
2022/09/10 17:22:37 test/example Waiting for service stable...(it will take a few minutes)
2022/09/10 17:23:38 test/example  PRIMARY nginx:24 desired:1 pending:0 running:1
2022/09/10 17:23:38 test/example   ACTIVE nginx:23 desired:1 pending:0 running:1

まとめ

今回は ecspresso を理解していくために概要,ツールのインストール,ローカルからのデプロイを試してみました.次の記事以降でも引き続きハンドブックを読んで理解した内容をまとめていきます.