🚀
aws-actions/amazon-ecs-deploy-task-definition を使って DB マイグレーションする
Amazon ECS (Fargate) 上で動いているコンテナを GitHub Actions を使ってデプロイする際、サービス更新前にデータベースのマイグレーションを実施することはよくあるやり方かと思います。
私もその方法でやっているのですが、以前は専用の step を用意して AWS CLI
(aws ecs run-task) を使って実施していました。[1]
最近また ECS へのデプロイのワークフローを書く機会があり aws-actions/amazon-ecs-deploy-task-definition
の v2 から RunTask もできるようになっていることを知ったので、これを使って書いてみました。
...(省略)...
- name: Fill in the new image ID in the Amazon ECS task definition
id: task-def
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: task-definition.json
container-name: app
image: ${{ steps.build-image.outputs.image }}
- name: Database migrations and Deploy Amazon ECS task definition
uses: aws-actions/amazon-ecs-deploy-task-definition@v2
with:
task-definition: ${{ steps.task-def.outputs.task-definition }}
cluster: ${{ env.ECS_CLUSTER }}
run-task: true # タスクを実行
run-task-container-overrides: '[{"name": "app", "command": ["db", "migrate"]}]'
run-task-security-groups: ${{ env.ECS_SECURITY_GROUP }}
run-task-subnets: ${{ env.ECS_SUBNETS }}
wait-for-task-stopped: true # タスク完了まで待機
service: ${{ env.ECS_SERVICE }} # サービスを更新
wait-for-service-stability: true # サービス更新完了まで待機
README に書いてあるものとほぼ変わらないですが、run-task-container-overrides
でマイグレーションを実行するコマンドを指定しています。run-task: true
と wait-for-task-stopped: true
にすることで RunTask が完了したら Service の更新が走ります。
これで ECS の RunTask 〜 Update Service まで AWS for GitHub Actions
で統一することができました。
また、条件に応じてマイグレーションを走らせたい場合も step を分割することで対応できると思います。
-
他のサードパーティが提供している Action で RunTask を実行することもできます ↩︎
Discussion