Fargateがタスクスケジュールをサポートし定期実行処理の幅が超広がりました!
「せっかく、EC2インスタンスを気にしなくてよいFargateなんだから、もっとバッチ処理で気軽に使いたいよね」
そんなハマコーの一日千秋の想いが届いたのか突如として、Fargateにごついアップデートが舞い降りました。
AWS Fargate Now Supports Time and Event-Based Task Scheduling
今まで、「AWS Lambdaでは、ライブラリや実行時間に制限があって使いにくい」けど「AWS Batch使うには荷が重い」的なユースケースにバッチリハマる機能だと思うので、全国のコンテナファンは今すぐ使ってみると良いと思います。
Fargateきたか…!! ( ゚д゚) ガタッ / ヾ __L| / ̄ ̄ ̄/_ \/ /
タスクのスケジュール機能とは
ECSクラスター内に存在するタスクを、スケジュールに則り実行する機能です。
構造的に、ECSクラスター内で、タスクスケジュールはサービスと並列して存在します。タスク定義は共通のものを利用し、そこからECSクラスター内に、サービスとして起動するか、タスクスケジュールとして起動するかの違いとなります。
後ほど設定項目を紹介しますが、サービス定義とタスクスケジュール定義で設定項目がある程度重複しています。
タスクスケジュールでコンテナを動かしてみた
以下の公式ページのチュートリアルに従って、タスクスケジューリングを実装していきます。
Scheduled Tasks (cron) - Amazon Elastic Container Service
ECSメニューから、既存クラスターを選択すると、「タスクのスケジューリング」タグが増えています。
「作成」ボタンをクリック。
そうすると、「スケジュールされたタスク作成」画面が表示されます。
注目すべきは、「スケジュールタイプ」。CloudWatch Eventsの定義と同様に、固定間隔 or Cron式を指定可能です。
その下で設定するのが、「ターゲットのスケジュール」。設定項目で、ポイントになるところを解説していきます。
起動タイプ
サービスと同じく「Fargate」or「EC2」から選択できます。ただ、スケジュール実行という性質上、基本的にはEC2インスタンスを気にしない「Fargate」のほうが、使い勝手は良いんじゃないでしょうか。
タスク定義
利用するタスクを選択できます。サービスと同じですね。バージョンも指定できます。
タスクの数
スケジュール実行なのに、タスクの数が指定できます。バッチ処理的なものをスケジュール実行する場合、通常バッチ処理を担当するタスクは1つに限定しないと制御が難しくなりがちですが、並列分散処理できるバッチ処理であれば、お構いなし。1つでも100個でも設定できるのは、柔軟で便利です。
VPCとセキュリティグループ
ここらへんは、通常のサービスの定義と同様。
コンテナの上書き
タスク定義で指定されたパラメータを、タスクスケジュール用に上書きが可能です。
通常はWebサーバとして機能しているタスクを、バッチ処理として利用したい場合などに、コマンドや環境変数の上書きができるのは、使い勝手が良いですね。わざわざバッチ処理用に別のタスクを用意する手間が減りそうです。
「作成」ボタンをクリックすると、無事、タスクのスケジューリング欄にスケジュールルールが追加されています!
しばらくまつと、こんな感じで開始元がevents-ruleで定義されたものが表示されました!今までのサービスで定義されたタスクは開始元がecs-svcだったので、確かに開始元が違うことが確認できます。
CloudWatch Eventのルールにも、新しくタイプが「ECSタスク」のルールが追加されてました。
CloudWatch Logsにもしっかり、起動した形跡が残っていました。
タスクスケジュールの停止方法
定期的なイベントで実行されているタスクを停止したいときは、タスクの編集から「スケジュールルールが有効です」のチェックをオフにします。
最初は、サービスと同じくタスクの数を0にするのかと思ったんですが、タスクスケジュールはサービスと違って、タスクの数を0にすることはできませんでした。
AWS LambdaやAWS Batchに比べて使いやすい点
今回のアップデートを見てテンション上がった人は、似たようなサービスとしてAWS LambdaやAWS Batchが思い浮かんだことと思います。筆者目線で、それぞれのサービスに比べて、使いやすい点を挙げてみます。
AWS Lambdaに比べて実行時間の制限がなく、コンテナなのでライブラリや利用言語の制限がない
AWS Lambdaには、実行時間制限が15分という大きな制約があるため、今までは、長めのバッチ処理を実行するときはAWS Batchを併用するなどの工夫が必要でしたが、タスクスケジュールには実行時間制限がありません。
また、AWS Lambdaで利用できる言語や環境には、マネージドサービスとしての制限があります。AWS Lambda レイヤーの発表により、利用できるコードが飛躍的に広がりましたが、まだまだLambda特有の使いにくさがあるのも事実です。
コンテナをベースとしたタスクスケジュールには、コンテナの利用範囲では基本的に制限はありません。簡易なバッチ処理はシェルスクリプトで組むことも多いですが、AWS Lambdaでは実現が難しかったそういう処理も、タスクスケジュールなら簡単に実現可能です。
もちろん、タスクスケジュールはFargateベースでの起動が可能なので、コンテナ起動時のみの従量課金での利用が可能です。
AWS Batchに比べて、設定が簡単
AWS Batchに比べての最大のメリットは、設定の簡易さでしょう。もともと本格的なコンテナベースのバッチ処理基盤として設計されているAWS Batchは、機能も豊富で、動的なリソースのプロビジョニングや、ホストサーバーにカスタムAMIの利用が可能であったり、パイプライン処理も実現可能で、なんせごついサービスです。
ただ、AWS Batchは裏でECSが動いていますが、Fargateには対応していません。バッチ処理終了後のEC2インスタンスの停止もAWS Batch側で面倒を見てくれるのですが、Fargateベースのタスクスケジュールに比べて、EC2インスタンスの起動・停止のオーバーヘッドがどうしても大きくなりがちです。
EC2ベースであるからこそカスタムAMIを利用できるという大きなメリットがAWS Batchには有るんですが、スケジュール起動されるような簡易なバッチ処理であれば、タスクスケジュールを利用するのが使いやすい場合が多いと思います。
Fargateベースのタスクスケジュールの活用で、より効率的な定期処理を実現しましょう!
以上、新星のごとく現れた、Fargateのタスクスケジュール機能の紹介でした。今までAWS Lambdaで実現できなかったけど、AWS Batchでは大げさすぎるような定期実行バッチ処理に、非常にうまくはまる機能だと思います。
AWS Lambdaに比べて各種マネージドサービスとの連携が貧弱だったり、タイムアウトの概念がなかったり、実際に使うには注意点もありますが、EC2を意識せずに柔軟に使えるFargateの、大きなユースケースとなりうる機能だと思います。
いやぁ、Fargate関連、今後も目が離せません。
それでは、今日はこのへんで。濱田(@hamako9999)でした。