📙

触って理解するAWS Batchプチハンズオン

2022/01/30に公開

ちょっとしたバッチ処理であればLambdaを使って簡単に実現できますが、15分制限が大きな壁となるとき、以下の2つの記事のように複数Lambda, ECS, AWS Batchが選択肢になります。

ただ、普通の人は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 ベストプラクティスまとめ

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もアタッチ

参考:AWS Batch タスク実行 IAM ロール

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