LoginSignup
1
0
記事投稿キャンペーン 「2024年!初アウトプットをしよう」

GitHub ActionsでECSにデプロイ〜最新のタスク定義を取得して〜

Last updated at Posted at 2024-01-29

したいこと

・GitHubActionsを使ってECSにデプロイする
・その際に最新のタスク定義を元にデプロイする

背景

・「GitHubActionsを使ってECSにデプロイ」は調べればすぐドキュメントがあったが、そのドキュメントでは事前にタスク定義のjsonファイルを用意してる前提だった

・そうするとその事前に用意したjsonファイルでデプロイした後に、仮にコンソール上でタスク定義に変更を加えて再度デプロイする場合、コンソールで変更を加えた最新のタスク定義ではなく最初に設定した古いタスク定義のjsonファイルを元にデプロイしてしまう

・そのため最新のタスク定義を取得してそれを元にデプロイさせたいと思った

方法

基本ドキュメントと同じで、最新のタスク定義を取得する部分を変更追加してる

name: Deploy to Amazon ECS

on:
  push:
    branches:
      - main

env:
  AWS_REGION: MY_AWS_REGION                   # set this to your preferred AWS region, e.g. us-west-1
  ECR_REPOSITORY: MY_ECR_REPOSITORY           # set this to your Amazon ECR repository name
  ECS_SERVICE: MY_ECS_SERVICE                 # set this to your Amazon ECS service name
  ECS_CLUSTER: MY_ECS_CLUSTER                 # set this to your Amazon ECS cluster name
  ECS_TASK_DEFINITION: MY_ECS_TASK_DEFINITION # タスク定義名
  CONTAINER_NAME: MY_CONTAINER_NAME           # set this to the name of the container in the
                                               # containerDefinitions section of your task definition

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    environment: production

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@0e613a0980cbf65ed5b322eb7a1e075d28913a83
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ env.AWS_REGION }}

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@62f4f872db3836360b72999f4b87f1ff13310f3a

      - name: Build, tag, and push image to Amazon ECR
        id: build-image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          IMAGE_TAG: ${{ github.sha }}
        run: |
          # Build a docker container and
          # push it to ECR so that it can
          # be deployed to ECS.
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
          echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT

      - name: Latest ECS task definition Json  # 最新のタスク定義を取得
        run: aws ecs describe-task-definition --task-definition ${{ env.ECS_TASK_DEFINITION }} --query taskDefinition > taskdefinition.json

      - name: Fill in the new image ID in the Amazon ECS task definition
        id: task-def
        uses: aws-actions/amazon-ecs-render-task-definition@c804dfbdd57f713b6c079302a4c01db7017a36fc
        with:
          task-definition: taskdefinition.json  # 最新のタスク定義のjsonファイル
          container-name: ${{ env.CONTAINER_NAME }}
          image: ${{ steps.build-image.outputs.image }}

      - name: Deploy Amazon ECS task definition
        uses: aws-actions/amazon-ecs-deploy-task-definition@df9643053eda01f169e64a0e60233aacca83799a
        with:
          task-definition: ${{ steps.task-def.outputs.task-definition }}
          service: ${{ env.ECS_SERVICE }}
          cluster: ${{ env.ECS_CLUSTER }}
          wait-for-service-stability: true

困ったこと

cliでタスク定義を取得した際に、そのままではフォーマットが違い新しいタスク定義を作成するステップでエラーになったので、フィルターをかけて抽出取得する必要があった。
以下の--queryの箇所でフィルター抽出

- name: Latest ECS task definition Json  # 最新のタスク定義を取得
        run: aws ecs describe-task-definition --task-definition ${{ env.ECS_TASK_DEFINITION }} --query taskDefinition > taskdefinition.json

参照

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0