Breaking News

Default Placeholder Default Placeholder

前回の記事でGithub ActionsからECRへイメージをプッシュする方法を解説しました。

今回はそのイメージを使ってECSのコンテナを更新してみたいと思います。

前回の記事はこちらです。

この記事でやること

  1. ECSコンテナ更新に必要な権限をIAMユーザに追加
  2. Github Actionsにジョブを追加

1. ECSコンテナ更新に必要な権限をIAMユーザに追加

Github Actionsで行うことは以下です。

  • タスク定義取得
  • 新しいイメージのタグに差し替える
  • 新しいタスク定義を反映する

これらを実行するのに必要な権限を以下のようにつけていきます。

resource "aws_iam_policy" "ecs_deploy" {
  name        = "ecs_deploy_policy"
  description = "Allow describe ECS task definitions and deploy new images"

  policy = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Action = [
          "ecs:RegisterTaskDefinition",
          "ecs:UpdateService",
          "ecs:DescribeServices",
          "ecs:DeregisterTaskDefinition",
          "ecs:DescribeTaskDefinition",
          "ecs:ListTaskDefinitions",
          "iam:PassRole"
        ],
        Effect = "Allow",
        Resource = "*"
      }
    ]
  })
}

# IAM ユーザーにポリシーをアタッチ
resource "aws_iam_user_policy_attachment" "ecs_deploy" {
  user       = aws_iam_user.github_actions_user.name
  policy_arn = aws_iam_policy.ecs_deploy.arn
}

これでIAMユーザの権限の準備ができました。

2. Github Actionsにジョブを追加

以下のようにジョブを追加します。前回の記事のdeploy.ymlに追記する形で進めます。

name: Test Github Actions
on: 
  push:
    branches:
      - main
env:
  ...
  ...
  ECS_TASK_DEFINITION: app
  ECS_SERVICE: app
  ECS_CLUSTER: ecs-cluster
jobs:        
  build_and_push:
    ...
    ...
    ...
  deploy:
    runs-on: ubuntu-latest
    needs: build_and_push
    steps:
      - name: Fetch task definition
        run: aws ecs describe-task-definition --task-definition ${{ env.ECS_TASK_DEFINITION }} --query taskDefinition > task-definition.json
      - name: Update django task definition
        id: update-django-task-definition
        uses: aws-actions/amazon-ecs-render-task-definition@v1
        with:
          task-definition: task-definition.json
          container-name: django
          image: ${{ env.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
      - name: Deploy
        uses: aws-actions/amazon-ecs-deploy-task-definition@v1
        with:
          task-definition: ${{ steps.update-django-task-definition.outputs.task-definition }}
          service: ${{ env.ECS_SERVICE }}
          cluster: ${{ env.ECS_CLUSTER }}
          wait-for-service-stability: true

追加した要素の説明をします。

  • 環境変数を設定します
    • ECS_TASK_DEFINITION: 使用するタスク定義の名前
    • ECS_SERVICE: 反映先のECSサービスの名前
    • ECS_CLUSTER: 反映先のECSクラスターの名前
  • deployというジョブを作成します。以下、各ステップです。
    • Fetch task definition: AWS CLIを使ってタスク定義を取得します
    • Update django task definition: ↑で取得したタスク定義のdjangoコンテナのイメージタグを上書きします
    • Deploy: ↑で上書きしたタスク定義をECSに反映します