Fargate ECSで1回限りのバッチ処理を実行する
ECSで1回限りのバッチ処理を実行したい場合はタスクを使用する。
公式ドキュメントだとマネージメントコンソールからの操作方法しか載っていなかったが、cliで実行したかったのでaws cliを使ってecs run-taskコマンドを実行することにした。
Fargate上にClusterやServiceが動いている前提で、1回限りのタスク(今回は例としてRailsのrake routes)を実行する場合は以下のようにする。
aws ecs run-task \
--region ${AWS_DEFAULT_REGION} \
--launch-type FARGATE \
--network-configuration "awsvpcConfiguration={subnets=[${SUBNET_ID}],securityGroups=[${SECURITY_GROUP_ID}],assignPublicIp=ENABLED}" \
--cluster ${CLUSTER_NAME} \
--task-definition ${TASK_NAME} \
--overrides "{\"containerOverrides\": [{\"name\": \"${CONTAINER_NAME}\",\"command\": [\"bundle\", \"exec\", \"rake\", \"routes\"]}]}"
network-configurationオプションを指定しないと↓のエラーになるので注意。
An error occurred (InvalidParameterException) when calling the RunTask operation:
Network Configuration must be provided when networkMode 'awsvpc' is specified.
network-configurationオプションに指定する内容については↓を実行すると確認できる。
aws ecs describe-services --region ${AWS_DEFAULT_REGION} --cluster ${CLUSTER_NAME} --services ${SERVICE_NAME}
これで1回限りのECSタスクを手軽に実行できるようになった。