AWS
ECS

ECS ScheduleTaskの登録をAPI経由で行う

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には何も登録されていない)

2018-04-11-ecs1.png

②スケジュール登録したいクラスタの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にタスクが登録される。

2018-04-11-ecs2.png

2018-04-11-ecs3.png

terraformの場合でも、同じように下記2つのリソースタイプを使えば実現出来そう。

cloudwatch_event_rule
cloudwatch_event_target

参考

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/scheduled_tasks_cli_tutorial.html