前回の記事でGithub ActionsからECRへイメージをプッシュする方法を解説しました。
今回はそのイメージを使ってECSのコンテナを更新してみたいと思います。
前回の記事はこちらです。
この記事でやること
- ECSコンテナ更新に必要な権限をIAMユーザに追加
- 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に反映します