やりたいこと
CloudFormationでECSのタスクスケジュール定義をしたい。
時・分ともに異なる複数の実行時間を指定したい。
例えば毎日7:45と13:50に実行されるように指定したい。
1つのcron式だとうまく収まらない
cron(45 07 * * ? *)
これだけだと7:45だけになっちゃうし
cron(45,50 07,13 * * ? *)
これだと7:45,7:50,13:45,13:50に実行されちゃうし
crontabだと2行に分けて書いているけど
CloudFormationではどう書くの???
もしかしていいかんじに1行で書けたりする???
と悩んだのでメモしておきます。
※これのScheduleExpressionの指定の話です
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html
まず結論
ワンライナーでがんばるとこじゃなかったっぽい。
無理せずcfnのTaskSchedule部分の定義を7:45実行回分と13:50実行回分のそれぞれ書きます。
書き方
cfnでのecsタスクの定義は
どんなecsタスクかを定義する AWS::ECS::TaskDefinition
の定義があり、
そしてそれをいつ実行するかを定義する AWS::Events::Rule
の定義があります。
ここではその後者の定義だけ抜粋します。
Resources:
# 抜粋
TaskScheduleHoge:
Type: AWS::Events::Rule
Properties:
Name: task_schedule_hoge
State: ENABLED
ScheduleExpression: cron(45 07 * * ? *)
Targets:
- Id: task_schedule_hoge
Arn: !GetAtt Cluster.Arn
RoleArn: !Sub arn:aws:iam::${AWS::AccountId}:role/ecsEventsRole
EcsParameters:
TaskDefinitionArn: !Ref taskDefinition
TaskCount: 1
LaunchType: FARGATE
PlatformVersion: LATEST
NetworkConfiguration:
AwsVpcConfiguration:
AssignPublicIp: DISABLED
SecurityGroups: !Ref ServiceSecurityGroup
Subnets: !Ref Subnets
TaskScheduleHuga:
Type: AWS::Events::Rule
Properties:
Name: task_schedule_huga
State: ENABLED
ScheduleExpression: cron(50 13 * * ? *)
Targets:
- Id: task_schedule_huga
Arn: !GetAtt Cluster.Arn
RoleArn: !Sub arn:aws:iam::${AWS::AccountId}:role/ecsEventsRole
EcsParameters:
TaskDefinitionArn: !Ref taskDefinition
TaskCount: 1
LaunchType: FARGATE
PlatformVersion: LATEST
NetworkConfiguration:
AwsVpcConfiguration:
AssignPublicIp: DISABLED
SecurityGroups: !Ref ServiceSecurityGroup
Subnets: !Ref Subnets
実行するのは同じ内容のECSタスクなのでTarget部分に書く内容が繰り返しになるのが気になるものの、cfnを実行した結果、スケジュールがそれぞれ登録できていることを確認しました。
おまけ
YAMLのハッシュのマージなど活用すれば重複して書いているところももっとすっきりするかなと思ったのですが、やってみたところ
An error occurred (ValidationError) when calling the CreateChangeSet operation: Template error: YAML aliases are not allowed in CloudFormation templates
というエラーが出たのでやはりこつこつ書くしかないのかなと思います。
参考
- ECS(Fargate)のバッチをCloudFormationで作成する 👉 今回抜粋したECS定義の全体的な話はこちら
- 公式ドキュメント AWS::Events::Ruleについて