Tweet
Logo
    GitHub Actions から ECS Task を起動する
    GitHub Actions から ECS Task を起動する

    GitHub Actions から ECS Task を起動する

    • はじめに
    • 設定方法
    • 解説
    • TASK_DEF_ARN の取得
    • ECS の起動
    • Task の実行終了まで待機
    • ログの取得
    • IAM の設定
    • おわりに

    はじめに

    この記事では GitHub Actions から ECS Task を起動する方法を記載します。

    設定方法

    GitHub Actions での設定は以下のようになります。

    ECS Task を起動し、結果のログを表示する

    解説

    TASK_DEF_ARN の取得

    Task 定義は reivision が変わり複数ある可能性があるので動的に最新 revision の ARN を取得します。

    TASK_DEF_ARN=$(aws ecs list-task-definitions --family-prefix "${FAMILY_NAME}" --query "reverse(taskDefinitionArns)[0]" --output text)

    ECS の起動

    下記部分で ECS Task を起動しています

    これは EC2 を利用して Network mode が bridge の場合のコマンドで Fargate などで Network mode awsvpc の場合はネットワークの設定周りを引数として渡す必要があるので注意してください。

    aws ecs run-task --cluster ${CLUSTER_NAME} --task-definition ${TASK_DEF_ARN}

    Task の実行終了まで待機

    こんな感じで Task の実行終了まで待てます。

    aws ecs wait tasks-stopped --cluster ${CLUSTER_NAME} --tasks ${TASK_ARN}

    ただし、非常に実行時間が長い Task の実行終了を待つとそれだけ GitHub Actions の Runner にも課金されるので、実行終了を待たないという選択もありだと思います。

    ログの取得

    あるロググループの決められた時間以降のものを取得して表示します。

    aws logs tail /ecs/logs/prod/${LOG_GROUP_NAME} --since="${NOW}"

    これは簡易的な方法ではあり、並列で Task が起動されるとログが混ざる可能性があるので注意してください。

    IAM の設定

    GitHub Actions には以下の権限をもった IAM を使えるように GitHub の secret などで渡してください。

    terraform での設定例

    おわりに

    GitHub Actions から ECS Task を起動する方法を記載しました。

    ECS Task の起動はコンソールから行うにしても CLI から行うにしてもやや面倒な場合が多いので、GitHub Actions から起動できるようにしておけると便利な場面が多いかと思います。

    © 2025 DROBE All rights reserved.
    run:
        name: run ecs task
        runs-on: ubuntu-latest
    
        steps:
    
        - name: Configure AWS credentials
          uses: aws-actions/configure-aws-credentials@v2
          with:
            aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            aws-region: ap-northeast-1
    
        - name: run-task
          env:
            CLUSTER_NAME: cluster_name
            FAMILY_NAME: task_familiy_name
            LOG_GROUP_NAME: log_group_name
          run: |
    				TASK_DEF_ARN=$(aws ecs list-task-definitions --family-prefix "${FAMILY_NAME}" --query "reverse(taskDefinitionArns)[0]" --output text)
    				echo "${TASK_DEF_ARN}"
    				NOW=$(date +'%Y/%m/%d %H:%M:%S%z')
    				echo "${NOW}"
    				TASK_ARN=$(aws ecs run-task --cluster ${CLUSTER_NAME} --task-definition ${TASK_DEF_ARN} --query tasks[0].taskArn --output text)
    				TASK_ID=$( echo "${TASK_ARN}" | grep -oE "[^/]+$")
    				echo "check https://ap-northeast-1.console.aws.amazon.com/ecs/v2/clusters/${CLUSTER_NAME}/tasks/${TASK_ID} for status"
    				aws ecs wait tasks-stopped --cluster ${CLUSTER_NAME} --tasks ${TASK_ARN}
    				aws logs tail /ecs/logs/prod/${LOG_GROUP_NAME} --since="${NOW}"
    data "aws_iam_policy_document" "github-actions-ci-policy" {
    
      statement {
        actions = [
          "ecs:ListTaskDefinitions"
        ]
        resources = [
          "*",
        ]
      }
    
      statement {
        actions = [
          "ecs:RunTask",
          "ecs:DescribeTasks"
        ]
        resources = [
          "arn:aws:ecs:*:*:task/*",
          "arn:aws:ecs:*:*:task-definition/task-definition-faimily-name"
        ]
      }
    
      statement {
        actions = [
          "iam:PassRole"
        ]
        resources = [
          "arn:aws:iam::*:role/role-to-be-used-to-run-ecs-task"
        ]
      }
    
    }