Help us understand the problem. What is going on with this article?

CloudFormationでECSタスクのスケジュールに異なる複数の実行時間を指定したい

やりたいこと

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 の定義があります。
ここではその後者の定義だけ抜粋します。

sample.yml
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を実行した結果、スケジュールがそれぞれ登録できていることを確認しました。

image.png

おまけ

YAMLのハッシュのマージなど活用すれば重複して書いているところももっとすっきりするかなと思ったのですが、やってみたところ

An error occurred (ValidationError) when calling the CreateChangeSet operation: Template error: YAML aliases are not allowed in CloudFormation templates

というエラーが出たのでやはりこつこつ書くしかないのかなと思います。

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした