こんにちは、エンジニアのクロ(@kro96_xr)です。バックエンドを中心にフロントエンドやらインフラやら色々担当しています。
今回はTerraformとGithub Actionsを組み合わせてECS Fargateを運用していくにあたり、
- タスク定義の二重管理が発生していた話
- 二重管理を解消するために行った対応
について書いていきたいと思います。
なぜ二重管理が発生したのか
今回の環境ではTerraformでECSのリソースを作成、Github Actionsでデプロイする形で開発しており、リソース作成時、デプロイ時の両方でタスク定義が必要なため二重管理が発生していました。
具体的には、リポジトリ上にタスク定義のjsonファイルを置いて、下記のようなGithubActionsで指定する形を取っていました。
- name: Render Amazon ECS task definition id: render-container uses: aws-actions/amazon-ecs-render-task-definition@v1 with: task-definition: task.json container-name: container_name image: 000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/repo:latest - name: Deploy to Amazon ECS service uses: aws-actions/amazon-ecs-deploy-task-definition@v1 with: task-definition: ${{ steps.render-container.outputs.task-definition }} service: sample-service cluster: sample-cluster
このままだとTerraformからタスク定義を修正した際に、リポジトリ上のファイルの修正を忘れると大変なことになります。
実際に発生する可能性は低いとは思いますが、こういったリスクは少しでも減らしておきたいですね。
対応
対応方法はamazon-ecs-deploy-task-definitionに記載がありました。
If you do not wish to store your task definition as a file in your git repository, your GitHub Actions workflow can download the existing task definition.
- name: Download task definition run: | aws ecs describe-task-definition --task-definition my-task-definition-family --query taskDefinition > task-definition.json
というわけで、修正後のGithub Actionsは以下のようになります。
- name: Download task definition run: | aws ecs describe-task-definition --task-definition sample-definition --query taskDefinition > task-definition.json - name: Deploy to Amazon ECS service uses: aws-actions/amazon-ecs-deploy-task-definition@v1 with: task-definition: task-definition.json service: sample-service cluster: sample-cluster
これでタスク定義の一元管理が行えるようになりました。
おわりに
ECSにGithub Actionsからデプロイする方法を調べると、リポジトリでタスク定義ファイルを管理する方法の方が多くヒットするため、あまり同じ悩みを抱えている方はいないのかもしれませんが参考になれば幸いです。
あるいはこの方法の問題点などございましたらTwitter等でご連絡いただけると幸いです!