- はじめに
- 設定方法
- 解説
- TASK_DEF_ARN の取得
- ECS の起動
- Task の実行終了まで待機
- ログの取得
- IAM の設定
- おわりに
はじめに
この記事では GitHub Actions から ECS Task を起動する方法を記載します。
設定方法
GitHub Actions での設定は以下のようになります。
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}"解説
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 などで渡してください。
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"
    ]
  }
}おわりに
GitHub Actions から ECS Task を起動する方法を記載しました。
ECS Task の起動はコンソールから行うにしても CLI から行うにしてもやや面倒な場合が多いので、GitHub Actions から起動できるようにしておけると便利な場面が多いかと思います。