はじめに
この記事では 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 から起動できるようにしておけると便利な場面が多いかと思います。