Terraform&Github ActionsのCI/CD環境でECSタスク定義の二重管理を解消する方法

こんにちは、エンジニアのクロ(@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に記載がありました。

GitHub - aws-actions/amazon-ecs-deploy-task-definition: Registers an Amazon ECS task definition and deploys it to an ECS service.

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等でご連絡いただけると幸いです!