ECSでバッチ処理をしたい場合、クラスターの「タスクのスケジューリング」を使うことになります。
が、タイトルの通り罠がとても多かったので備忘録がてらまとめです
#概要
そもそもどういう機能かと言いますと、
- スケジューリングを作成する際にコマンドを指定できる
- 指定した時間にタスクが立ち上がってコマンドを実行する
- 終了したらタスクが自動終了する
ということで、今回ECSでバッチ処理をする際にこちらを使用しました。
(コンテナ自体にcronを設定できるかもしれませんがタスク単位で管理できた方が楽)
で、この「時間が来たかどうか」をCloudWatchのイベントでチェックする形になってます。
##コマンドの指定の仕方
タスクスケジュールを作る際、「コンテナの上書き」という項目があります。
ここにコマンドを書くのですが書式ががっちり決まっていて、「半角スペースを,に置き換えた形」である必要があります。
なので、元のバッチのコマンドが下記であれば
bin/cake ImportNews >/dev/null 2>&1
指定する文字列は
bin/cake,ImportNews
である必要があります。
ログは立ち上がったタスクのLogsに吐かれるので指定は不要。
#罠1: ターゲットIDが既存のものと被ったらしれっと上書きされる
タスクのスケジューリングを作成する際、ターゲットIDを指定しろと言われますがこれはそのままCloudWatchのイベント名になります。
ということはすなわち「どこかのクラスターに既存のIDと被ってはいけない」ということ。
被ったIDを指定すると、警告もなしに上書きされることになります。
地味に気付きづらい。。
#罠2: 設定しないとリビジョンの自動更新をしてくれない
タスクのスケジュールを作成したらCloudWatchの「イベント」 > 「ルール」のところに先ほど指定したID名のイベントが増えてると思います。
こちら「アクション」 > 「編集」で中を見るとリビジョンが「最新」になってません。
このままだとリビジョンを変更した際に反映されないので「最新」にするんですが。。。
問題は次の罠です。
#罠3: イベントの設定をどれか変更すると入力内容が全てクリアされる
なんで?????
CloudWatchのイベントをあまり触ることなかったので初めて知ったんですがだいぶ衝撃でした。
しかもサブネットIDとVPCのIDがプルダウンでなく全てテキストな上、「FARGATE」とかのラジオボタンまでクリアされます。
メモってないとここで詰みかねない。
#罠4: ECSのコンソールの方でスケジュールを変更した場合、入力していたコマンドがクリアされる
これが一番しんどかった。。
テストしようと思って5分ごと起動に変更=>タスクが起動したあとずっと落ちないという状態になってました。
これを避けるためにはCloudWatchの方で変更する必要があります。
#まとめ
私は罠を全て通過した先輩に聞けたのでまだマシでしたが、困ってる人の助けになればと思います。
ほとんどの罠が一番上のマニュアルに書いてないのがタチ悪い。。
#2021/11/15追記
どうやらEventBridgeという名前でcloudWatchから独立したみたいですね。
だけど上記の罠は全て健在でした…
3とかかなり致命的だと思うんですが直さないんですかね…
しかも「サブネットIDを入れて更新しようとすると必ずエラーで弾かれる」という現象も追加されてました。
(検証環境と本番環境で2回同じエラーを喰らいました。)
まんま同じテキストを入れ直すと普通に更新できるので裏側の問題か、入力エリアに変なゴミをいれてしまってたかかなと思いますがなんなんだ…