🚀

aws-actions/amazon-ecs-deploy-task-definition を使って DB マイグレーションする

2024/11/03に公開

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: truewait-for-task-stopped: true にすることで RunTask が完了したら Service の更新が走ります。
これで ECS の RunTask 〜 Update Service まで AWS for GitHub Actions で統一することができました。
また、条件に応じてマイグレーションを走らせたい場合も step を分割することで対応できると思います。

脚注
  1. 他のサードパーティが提供している Action で RunTask を実行することもできます ↩︎

Discussion