触って理解するAWS Batchプチハンズオン
ちょっとしたバッチ処理であればLambdaを使って簡単に実現できますが、15分制限が大きな壁となるとき、以下の2つの記事のように複数Lambda, ECS, AWS Batchが選択肢になります。
- Dai@FastLabelさんのAWSでバッチ処理を実装する際の選択肢とサービス比較
- Timers Tech BlogさんのAWS Batch, Lambda, ECS Task 比較:バッチやジョブにはどれを使う?
ただ、普通の人はAWS Batchは使う機会などなく想像しにくいです。(私)
ということでAWS Batchのプチハンズオンを作ってみました。これで簡単なバッチ機構ができるので、これをもとにAWS Batchをいじくり回して理解を深めていければと思います。
目次
- AWS Batchおさらい
- 料金
- ベストプラクティス
- AWS Batch構築ハンズオン
- IAMロールの作成
- バッチ機構の作成
- コンピューティング環境作成
- インスタンスの設定
- ※FargateとEC2の使い分け
- ネットワーキング
- ジョブキューの設定
- ジョブ定義
- ジョブを作成
- ジョブを実行する
- おわりに
AWS Batchおさらい
バッチというと「毎日〇〇時にXを実行」といった定期処理を思い浮かべがちですが、AWS Batchにおけるバッチはこの定期バッチではありません。
AWS Batchのバッチは「ジョブを蓄えさせたらそれを良しなに実行してくれる」という意味です。
良しなに、というのは「非同期で・コンピューティングリソースを効率よく使って処理できるようジョブを割り当てて(なおスケーリングもする)」くれることを指します。
お粗末ですがイメージを絵にしてみました。
料金
AWS Batchに関する料金はかかりません。
ECSなどの使用するリソースに対してかかります。
ベストプラクティス
AWS Batchにおいて絶対に達成したいことは「冪等性があるジョブ」を作ることです。
冪等性とは同じ処理を何度行っても同じ結果が得られるという意味で、複数回実行されても問題ない状態です。冪等性が確保されると、たとえ途中で失敗しても何も考えずにリトライするだけで良くなります。
※1000件のデータ加工において551件目で失敗したとき、そのリトライ時には1~550件はスキップする or 501からスタートする、ようなプログラムは冪等性があります)
その他にもたくさんのベストプラクティスがあります。
AWS Batch構築ハンズオン
1. IAMロールの作成
AWSアカウントの初期状態ではタスク実行ロールがないので作成します。
1. IAMロールの作成でElastic Container Serviceを選択
2. ユースケースでElastic Container Serviceを選択
3. ポリシーはAmazonECSTaskExecutionRolePolicyを選択
4. 名前はecsTaskExecutionRole
5. 作成後、信頼関係をecs.amazonaws.comからecs-tasks.amazonaws.comに変更
6. CloudWatchLogsFullAccessもアタッチ
2. バッチ機構の作成
ウィザードから「コンピューティング環境」「ジョブキュー」「ジョブ定義」「ジョブ」を一気に作れます。
コンピューティング環境設定
- マネージド型
- batch-hands-on
- Batch service-linked role(デフォルト)
インスタンスの設定
- Fargate Spot(安いため)
- 256vCPU(デフォルト)
FargateとEC2の使い分けは以下に記載
※FargateとEC2の使い分け
バッチ処理を行うコンピューティング環境としてEC2かFargateを選択することができます。
これらの使い分けは「起動」と「負荷」の面で比較され、以下のような使い分けが推奨されているようです。
Fargate | EC2 | |
---|---|---|
起動 | 1ジョブ=1コンテナ 起動ごとにオーバーヘッド |
複数ジョブ=1インスタンス 起動は遅いが使いまわせる |
負荷 | 0.25vCPUから利用可能 | インスタンスタイプの選択肢が広い |
まとめ | 断続的ジョブ 負荷が少ないジョブ |
1度に大量のジョブ 負荷が大きいジョブ |
参考:[AWS Black Belt Online Seminar] CON465 AWS Batch x Spot: AWS Fargate 対応記念 EC2との使い分けは? 資料公開
ネットワーキング
パブリックサブネットを選択。
ジョブキューの設定
batch-hands-on-job-queue
1
ジョブ定義
batch-hands-on-job-definition
180(なんとなく)
amazonlinux
Bash
echo 'hello world'
0.5
1GB
有効化
ecsTaskExecutionRole(作る必要あり。下で作成方法を紹介)
1.4.0
ジョブを作成
- batch-hands-on-job
- Bash
- echo 'hello world 2'
- 0.5
- 1024
ここまでで一連の作成が終了です。
ジョブを実行する
最後にジョブまで作っているので、1つのジョブがこのジョブ機構で実行されます。
ジョブ一覧でbatch-hands-on-job
を選択し、ログを見るとhello world 2
と出ているはずです。
なお、ジョブ定義ではhello world
と出力するコマンドを定義していますが、ジョブ作成時にあえてそのコマンドは上書きしたのでhello world 2
が出力されています。
ジョブ作成の際に何もコマンドを設定しなければ、hello world
が出力されます。
今回はamazonlinuxをイメージとしてコマンドを流す形でジョブを実行しましたが、独自のアプリケーションを組み込んだイメージを作り、それをジョブ定義に設定してあげれば色々なことができそうです。
おわりに
AWS Batchは複雑そうに見えますが、結局やっていることは「キューイング」と「タスク処理」と「スケーリング」に尽きるので、SQSとECS(EC2)を組み合わせたようなサービスのようにも見えますね。
この記事がAWS Batch理解の参考になりましたら幸いです。
Discussion