CloudWatchイベントのAPIを使ってECS ScheduleTaskにスケジュール登録する手順について簡単にまとめた。
下記のブログを書いた時点では理解できておらず、いつか書かないとな思っていたAPI経由でのScheduleTaskの登録手順になります。
Amazon ECS ScheduleTaskで実現するスマートなDockerベースのバッチ実行環境
aws-cliを使ってScheduleTaskを登録する
①CloudWatchEventsにルールを登録
例)毎朝9:00(JST)に起動する「ecs-task-schedule-hogehoge」という名前のイベントを登録する。
※CloudWatchイベントの時刻はGMTなので注意
## イベントの登録
$ aws events put-rule --schedule-expression "cron(0 0 * * ? *)" --name ecs-task-schedule-hogehoge --description "説明"
{
"RuleArn": "arn:aws:events:ap-northeast-1:[ID]:rule/ecs-task-schedule-hogehoge"
}
CloudWatchイベントが登録される。(この時点では、ターゲットが登録されていないのでECS側のScheduleTaskには何も登録されていない)
②スケジュール登録したいクラスタのARNを取得
GUIからだとクラスタのARNを見れる場所が見当たらないのでaws-cliでclusterArnを取得する
## クラスタのARNを取得
$ aws ecs describe-clusters --clusters [クラスタ名]
{
"clusters": [
{
"status": "ACTIVE",
"clusterName": "クラスタ名",
"registeredContainerInstancesCount": 0,
"pendingTasksCount": 0,
"runningTasksCount": 0,
"activeServicesCount": 5,
"clusterArn": "arn:aws:ecs:ap-northeast-1:[ID]:cluster/[クラスタ名]"
}
],
"failures": []
}
## こんな感じでjq使ってで取得すると便利
$ aws ecs describe-clusters --clusters [クラスタ名]|jq '.clusters[].clusterArn'
"arn:aws:ecs:ap-northeast-1:[ID]:cluster/クラスタ名"
③ターゲット(ECSでいうスケジュールルール)を登録する
設定内容は下記
※scheduleのdescriptionを登録出来なさそうなのが運用上は辛いかな。。(後から足すか)
パラメータ名 | 意味 |
---|---|
rule | ①で作ったCloudWatchEventsのルール名 |
targets.Id | ターゲットの名前 |
targets.Arn | ②で取得したターゲットに登録するECSのクラスタのARN |
targets.RoleArn | ecs:RunTaskが実行出来るIAMRoleのARN(GUIから作ると初回にecsEventsRoleという名前で生成される) |
targets.EcsParameters.TaskDefinitionArn | このScheduleTaskで起動したいタスク(コンテナ)のタスク定義ARN |
targets.EcsParameters.TaskCount | 一回ごとに起動するタスク数 |
## スケジュールタスクの登録
aws events put-targets --rule "ecs-task-schedule-hogehoge" --targets "Id"="ecs-task-schedule-hogehoge","Arn"="arn:aws:ecs:ap-northeast-1:[ID]:cluster/[クラスタ名]","RoleArn"="arn:aws:iam::[ID]:role/EcsTaskCommonRole","EcsParameters"="{"TaskDefinitionArn"= "arn:aws:ecs:ap-northeast-1:[ID]:task-definition/tst-mamari-task:1","TaskCount"= 1}"
下記のようにECSのscheduleTaskにタスクが登録される。
terraformの場合でも、同じように下記2つのリソースタイプを使えば実現出来そう。
cloudwatch_event_rule
cloudwatch_event_target
参考