お久しぶりです
今回はECS用のデプロイツールであるecspresso(エスプレッソ)を使ってみたので、ここに記録しておきます。
なお、触ろうと思ったきっかけは、普段のECS運用ではどうしてもデプロイメント周りがアプリなのかインフラなのか曖昧になることがあり、
そのあたりをいい感じで線引きできるツールがないか探していたところ、ecspresso を見つけたからとなります。
■ecspressoについて
ECS用のデプロイツールとなっており、ECSとそれ以外のインフラリソースの責任範囲を明確にすることができます。
例えば、VPCやALBなどの頻繁に更新が実行されないインフラリソースはTerraformなどのIaCツールで管理し、頻繁に更新されるECSのデプロイのみecspressoで実行するようなイメージです。
このように責任範囲を明確に線引きしておくことで、Terraform関連のリソースはインフラチームで管理し、ECSのデプロイはアプリケーションチームで管理しやすくなります。
また、Terraformと連携しやすい点も大きいです。
■前提
・VPC + ALB + ECS のような基本的なECS環境をTerraformで構築
・ECS用のDockerイメージビルドやECRTへのプッシュは手動で実施
・クライアントはwindows(WSL2)
■流れ
1. ローカルにecspressoのインストール
2. 既存ECSサービスの取り込み
3. ソースコードの書き換え
4. ECSのデプロイ
■手順
1. ローカル(wsl2)にecspressoのインストール
※バージョンは適宜変更してください
curl -L https://github.com/kayac/ecspresso/releases/download/v2.7.0/ecspresso_2.7.0_linux_amd64.tar.gz -o ecspresso.tar.gz
tar -zxvf ecspresso.tar.gz -C /usr/local/bin
sudo chmod +x /usr/local/bin/ecspresso
ecspresso version
→ バージョンが表示されることを確認する
2. 既存ECSサービスの取り込み
ecspresso用の各種設定ファイルを自ら作成することも可能ですが、ECSのタスク定義と同様にかなり中身が複雑になるので、今回はコマンドで自動作成しました
なお、実行前に普段のaws-cliなどを利用する場合と同様に、クレデンシャルの設定などは済ませておいてください
ecspresso init --region ${region-name} --cluster ${cluster-name} --service ${service-name} --config ecspresso.yml
→–config オプションで設定ファイル名を指定しており、 実行後下記のファイルが直下のディレクトリ内へ自動的に作成されます
ecs-service-def.json
→ サービスの定義ファイルです
ecs-task-def.json
→ タスク定義の定義ファイルです
ecspresso.yml
→ ecspressoで利用するクラスター名やサービス名などが記載されています
region: ${region-name}
cluster: ${cluster-name}
service: ${service-name}
service_definition: ecs-service-def.json
task_definition: ecs-task-def.json
timeout: "10m0s"
・ecspressoからAWSリソースが見えることを確認
ecspresso tasks
→ 下記のように見えていることを確認する
2026-02-28T19:41:42.387+09:00 [INFO] ecspresso version: v2.7.0 | ID | TASKDEFINITION | INSTANCE | LASTSTATUS | DESIREDSTATUS | CREATEDAT | GROUP | TYPE | +----------------------------------+-------------------------+----------+------------+---------------+---------------------------+---------------------------------+---------+ | 6a633dd3de5444f29cb497e169016b9b | example-dev-web-task:1 | | RUNNING | RUNNING | 2026-02-28T19:00:13+09:00 | service:example-dev-web-service | FARGATE |
3. ソースコードの書き換え
・てききとうにDokcerファイル側のソースコードを修正し、ビルドとECRへプッシュします
※注意点として、ecspresso はあくまでデプロイがメインとなっているので、コードのデプロイやECRへのプッシュは手動で実施する必要があります
・ecspresso verify でデプロイ前のチェックを実施します
ecspresso verify
→ 最後に Verify OK! が出ればOKです
4. ECSのデプロイ
・ドライランの実行
ecspresso deploy --dry-run --config="ecspresso.yml"
2026-02-28T20:45:15.214+09:00 [INFO] ecspresso version: v2.7.0 2026-02-28T20:45:15.685+09:00 [INFO] [example-dev-web-service/example-dev-web-cluster] Starting deploy DRY RUN Service: example-dev-web-service Cluster: example-dev-web-cluster TaskDefinition: example-dev-web-task: ~省略~ 2026-02-28T20:45:16.178+09:00 [INFO] [example-dev-web-service/example-dev-web-cluster] DRY RUN OK
→ DRY RUN OK がでれば準備完了です
・デプロイの実施
ecspresso deploy
2026-02-28T20:17:25.995+09:00 [INFO] ecspresso version: v2.7.0 2026-02-28T20:17:26.663+09:00 [INFO] [example-dev-web-service/example-dev-web-cluster] Starting deploy Service: example-dev-web-service Cluster: example-dev-web-cluster TaskDefinition: example-dev-web-task:78 Deployments: PRIMARY example-dev-web-task:78 desired:1 pending:0 running:1 COMPLETED(ECS deployment ecs-svc/3535437627254478426 completed.)AutoScaling: Events: 2026-02-28T20:17:27.145+09:00 [INFO] [example-dev-web-service/example-dev-web-cluster] Registering a new task definition... 2026-02-28T20:17:27.350+09:00 [INFO] [example-dev-web-service/example-dev-web-cluster] Task definition is registered example-dev-web-task:1 2026-02-28T20:17:27.351+09:00 [INFO] [example-dev-web-service/example-dev-web-cluster] service attributes will not change 2026-02-28T20:17:27.352+09:00 [INFO] [example-dev-web-service/example-dev-web-cluster] desired count: 1 2026-02-28T20:17:27.352+09:00 [INFO] [example-dev-web-service/example-dev-web-cluster] Updating service tasks... ~省略~ 2026-02-28T20:19:37.742+09:00 [INFO] [example-dev-web-service/example-dev-web-cluster] Service deployment status: SUCCESSFUL 2026-02-28T20:19:37.742+09:00 [INFO] [example-dev-web-service/example-dev-web-cluster] Service deployment completed SUCCESSFUL 2026-02-28T20:19:37.909+09:00 [INFO] [example-dev-web-service/example-dev-web-cluster] Service is deployed now. Completed!
→ Completed! が出ればデプロイ完了です
・AWSコンソール上より新規で起動したタスクのステータスが実行中になっていればOKです
・ブラウザ上から修正したコードが反映されていればOKです
■まとめ
いかがでしたでしょうか?
ECS環境さえ整っていればかなり簡単にデプロイできました。
また、本ツールはシステムが運用に乗った後のことを考えて作られているので、普段からECSを運用しているものとしては、
責任範囲がツール上で明確に分かれるようになるので、複雑な運用ルールが不要になる点もいいなと思いました。
今回はTerraform と連携せずに利用しましたが、セキュリティグループなどは連携したほうがいいと感じましたので、今度はそのあたりも踏まえてもう一度触ってみたいです。
それではまた