LoginSignup
3
1

More than 3 years have passed since last update.

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

Posted at

やりたいこと

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

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

参考

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1