LoginSignup
4
1

ecscheduleでECSクラスタにタスクのスケジューリングを設定する

Last updated at Posted at 2021-04-16

ECSにサービスをデプロイする場合、ecspresso を含めいろいろなツールがあり情報も多いですが、タスクのスケジューリング(cron的なもの)に関してはあまり情報が見つかりません。みんな定期実行どうしてるんでしょう :thinking:

探してみると、ecspressoにインスパイアされた ecschedule というツールがありました。

実際に使ってみてなかなか良かったので、ecscheduleの使い方と注意点を紹介します。

インストール

ecscheduleはGo製なので、go get か自分の開発環境にあった実行ファイルをパスの通った場所に置けば動きます。また、READMEには書いてありませんが、Macを使っている方はHomebrewでインストールできます。

$ brew install Songmu/tap/ecschedule

GUIでスケジューリング設定したものをダンプする

ecspressoと同様に、AWSの管理コンソールで設定したものをecscheduleの設定ファイル(YAML)として吐き出せます。GUIでの設定方法は公式サイトを参考にしてください。

ap-northeast-1.console.aws.amazon.com_ecs_home_region=ap-northeast-1.png

今回は、このような設定を登録してみました。この設定をダンプしてみます。

$ ecschedule dump --cluster sample --region ap-northeast-1 > ecschedule.yaml
$ cat ecschedule.yaml
実行結果
region: ap-northeast-1
cluster: sample
rules:
- name: test
  scheduleExpression: cron(0 3 * * ? *)
  taskDefinition: [TASK_DEFINITION]
  launch_type: FARGATE
  platform_version: LATEST
  network_configuration:
    aws_vpc_configuration:
      subnets:
      - [SUBNET_ID_1]
      - [SUBNET_ID_2]
      - [SUBNET_ID_3]
      security_groups:
      - [SECURITY_GROUP_ID]
      assign_public_ip: ENABLED

設定に変更がある場合、ecschedule.yamlを変更して ecschedule apply で適用できます。

$ ecschedule -conf ecschedule.yaml apply -rule test # test という名前のスケジュールルールのみ対象
$ ecschedule -conf ecschedule.yaml apply -all # すべてのスケジュールルールが対象

楽ちんですね :sparkles:

注意点

ecspressoと同じような感覚で使えて大変良いのですが、いくつか注意点があります。

1. タスク定義を登録する機能はない

ecspressoとは異なり、ecscheduleにはタスク定義を登録する機能はなく、スケジューリングの設定のみ行うことができます。タスク定義は別途行う必要がありますが、ecspressoで作成したタスク定義のJSONファイルを流用し、aws-cliで登録するという方法があります。

$ aws ecs register-task-definition --cli-input-json file://ecs-task-def.json

2. 起動タイプを指定しないとEC2になる

ecschedule自体の問題ではないと思いますが、設定ファイルで起動タイプを指定しないとEC2になります。ECSクラスタでFargateのみ使うようにしている場合、起動タイプがEC2だとタスクを起動できず、起動に失敗したログも(おそらく)出ません。

3. タスク定義にコンテナが1つしかない場合、1コマンドしか実行できない

ECSでは当たり前な気もしますが、KubernetesのCronJobを使っている方だと勘違いしてしまうかもしれません(私のことです)。CronJobがPodを起動するのとタスク定義からタスクを実行するのとでは概念が違うので、要注意です。

4. (v0.9.1まで)設定ファイルからルールを削除してapplyしても、ECSクラスタには適用されない

v0.10.0より、-prune オプション を指定すると、設定ファイルから削除したルールがECSクラスタからも削除されるようになっていました :raised_hands:

ecscheduleコマンドではルールを削除することができないので、

  • GUIで削除する
  • aws-cliで削除する
  • 設定ファイルに disabled: true を追加して無効にする

このような対応を行う必要があります。

5. Cron形式で記述する場合、UTCの日時で設定する

All scheduled events use UTC time zone and the minimum precision for schedules is 1 minute.

日本在住だとついついJSTで書きがちですが、UTCで書きましょう。

最後に

ECSのデプロイは、ベストプラクティスがイマイチ固まっていないような印象です。運用に応じて適切なツールを選びたいですね。

4
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
4
1