タダです.
業務で ecspresso
の利用検討の機会が出てきて触ったことがなかったので,この記事でローカルにツールのインストールとローカルから ECS デプロイをするまでにやったことを備忘録としてまとめます.なお,本記事の備忘録の内容は ecspresso ハンドブックを見させていただきつつ進めた内容になります.
ecspresso
ecspresso
とは面白法人カヤックの fujiwaraさんが開発された ECS デプロイツールです.
ecspresso
の特徴として以下のものがあり,個人的には業務で Terraform でのリソース管理を扱っているため,tfstate を読み込んで使うことができると点が気になりなので触って動作理解していきます.
- ECS サービスとタスクに関わるリソースをコード管理・デプロイを実行するためのツール
- 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.json
と ecs-task-def.json
と ecspresso.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
を理解していくために概要,ツールのインストール,ローカルからのデプロイを試してみました.次の記事以降でも引き続きハンドブックを読んで理解した内容をまとめていきます.