【AWS】用語を整理しながら学ぶAWS AWS Batch

## はじめに

この記事では AWSが提供するAWS Batchを学習していく記事です。主な内容としては実践したときのメモを中心に書きます。（忘れやすいことなど）
誤りなどがあれば書き直していく予定です。

## AWS Batchとは

一時的にコンピューティングリソースを借りて、処理を実行するサービスです。
AWSの公式ドキュメントには以下のように表現されています。

> バッチ処理、ML モデルのトレーニング、あらゆる規模での分析

[参考](https://aws.amazon.com/jp/batch/)

活用事例には分析が多いですが、AWS Batchが提供することは`バッチ処理`というコンピューティングです。そもそもAWS Batchの`Batch`ってどういう意味ですか？と思う方がいると思いますので簡単に説明します。

## Batch(バッチ)とは

英語で意味を調べてみると`ひとまとまり`という意味で表現されており、IT業界においてバッチは手続きのまとまりと表現されます。

特に連続した処理のまとまりのことをバッチと呼び、バッチを処理することはバッチ処理と呼ばれています。別の呼び方をすると`ある程度の期間においてまとめて処理を実行すること`を指します。

また、処理内容のほとんどは重い処理である場合が多く、営業時間外に実行するケースが多いです。

### バッチ処理の具体例

例えば、日中に行われた取引データのバックアップを取得するために営業時間外に処理を実行します。
なお、バッチ処理は大量の処理を実行することもあるため、夜間に実行されるケースがあります。

ちなみに夜間に実行されるバッチ処理は俗に「夜間バッチ処理」または「夜間バッチ」と呼ばれることがあります。

例文：「夜間バッチ」って昨日は問題なく実行された？エラーとかある？

このバッチ処理を実現するサービスとしてAWS Batch が存在します。
AWS Batchは`必要な時だけ、大きなコンピューティング能力を借りる`という特徴があります。

### 補足：バッチ処理は古いのか

バッチ処理についてのよくある誤解として`バッチ処理は時代遅れ`という表現をされている場合がありますが、そんなことはありません。

リアルタイムで全てを更新して保存できるのであれば、バッチ処理は不要なものになると考えられますが、非常にコストのかかるシステムになると考えられます。

バッチ処理が古いという論説は良い考え方ではありません。手段には古いや新しいはありますが、新しいものが必ず要件に合致するとは限りません。(逆も然り)

### バッチ処理には種類がある

バッチ処理には2種類あります。

- `定型業務におけるバッチ処理`
- `大規模計算におけるバッチ処理`

`夜間バッチ`のようなバッチは`定型業務におけるバッチ処理`に位置付けられます。

AWS Batchは`必要な時だけ、大きなコンピューティング能力を借りる`という特徴から`夜間バッチ`のような用途に向いていると思われがちですが、どちらかと言うと`大規模計算におけるバッチ処理`に向いています。

## 話を戻してAWS Batchとは

AWSの公式ドキュメントには以下のように表現されています。

> バッチ処理、ML モデルのトレーニング、あらゆる規模での分析

[参考](https://aws.amazon.com/jp/batch/)

`あらゆる規模`とあるように100 vCPUクラスの大規模な計算にも対応しています。

AWS Batchはジョブという単位でバッチ処理の内容を定義します。これをジョブ定義と呼び、
ジョブはDockerコンテナイメージをもとに作成し、必要な時に呼び出しを実行します。

ジョブは任意のコンピューティング環境で実行され、実行されたジョブはジョブキューとしてキューイングされます。

ジョブ定義？ジョブ？ジョブキュー？コンピューティング環境？Dockerコンテナイメージを使うの？？？

何もわかりませんね。。。。では一つ一つ見ていきましょう。

## ジョブ定義とは

簡単に説明すると`どんなジョブを実行するか`を決める定義です。そのままの意味です。
主に下記のパラメータが必要です。

- コンテナイメージ
- 実行コマンド
- 実行コマンドのパラメータ
- ジョブ使用するIAM Role
- vCPU、メモリ、GPU
- マルチノードの利用
- マウントポイント

定義だと言われていますが、ジョブを起こすためのテンプレート言い換えても差し支えはないでしょう。

## ジョブとは

実際に実行される処理です。AWS Batchの作業単位となります。
ジョブ定義を元に実行され、実行されたジョブはキューイングされます。

## ジョブキューとは

ジョブは実行したらそのまますぐに実行されるわけではありません。実行されたあとは待ち行列（キュー）に格納されます。ジョブが複数実行された際はキューイングしたあと、優先度に応じて実行されます。

## コンピューティング環境とは

ジョブを実行する環境です。コンピューティング環境はECSのクラスター上で動作します。
ジョブはマネージドまたはアンマネージド環境で実行されますが、どちらで実行するかを選択できます。

また、どれくらいのスペックでインスタンスを起動するかを設定できます。
具体的には最小vCPU、最大vCPU、インスタンスタイプの3つの設定項目があります。

最小vCPU、最大vCPUを0にしておくとインスタンスを起動していない状態になるため、コスト最適化につながります。

### コンテナイメージの起動が必要ということはECRも必要？

結論を言うと必要です。ECRにイメージを保存しておき、AWS Bacthから呼び出します。

### データを永続化したい

コンピューティング環境上にあるストレージはコンピューティング環境を削除すると消えてしまいます。データの永続化が必要な場合はS3やEFSを利用してデータを永続化する必要があります。

## 料金

どんなサービスかイメージがついたところで料金を見ていきたいところですが
実はAWS Batchによって発生する料金はありません。

AWS Batchは任意のタイミングでコンピューティングリソースを呼び出すサービスであるため
呼び出したコンピューティングサービスの大きさ（最小vCPU、最大vCPU、インスタンスタイプ）に依存します。

## まとめ

クラウド上でバッチ処理を実行するサービス、AWS Batchを見ていきました。
用途は限られるものの一時的に大きなコンピューティング能力を借りられるというところは大きなポイントです。
また、コンテナベースで実行環境を構築できるので「ECSで構築していたけど、常時起動しなくていいやつだ」みたいな時に役に立つサービスかなと思います。

ただし、少しだけ書いたとおり、定期実行バッチには向いていませんので使い方を見極める必要があります。

## 参考

- [料金](https://aws.amazon.com/jp/batch/pricing/)
- [バッチ処理とは何ですか?](https://aws.amazon.com/jp/what-is/batch-processing/)
- [Black Belt Online Seminar AWS Batch](https://d1.awsstatic.com/webinars/jp/pdf/services/20190911_AWS-BlackBelt-AWS-Batch.pdf)


## おわり