ECSにサービスをデプロイする場合、ecspresso を含めいろいろなツールがあり情報も多いですが、タスクのスケジューリング(cron的なもの)に関してはあまり情報が見つかりません。みんな定期実行どうしてるんでしょう
探してみると、ecspressoにインスパイアされた ecschedule というツールがありました。
実際に使ってみてなかなか良かったので、ecscheduleの使い方と注意点を紹介します。
インストール
ecscheduleはGo製なので、go get
か自分の開発環境にあった実行ファイルをパスの通った場所に置けば動きます。また、READMEには書いてありませんが、Macを使っている方はHomebrewでインストールできます。
$ brew install Songmu/tap/ecschedule
GUIでスケジューリング設定したものをダンプする
ecspressoと同様に、AWSの管理コンソールで設定したものをecscheduleの設定ファイル(YAML)として吐き出せます。GUIでの設定方法は公式サイトを参考にしてください。
今回は、このような設定を登録してみました。この設定をダンプしてみます。
$ 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 # すべてのスケジュールルールが対象
楽ちんですね
注意点
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クラスタからも削除されるようになっていました
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のデプロイは、ベストプラクティスがイマイチ固まっていないような印象です。運用に応じて適切なツールを選びたいですね。