AWS Batchについて試してみた

# 背景・目的
今まで、AWS Batchについて触ったことがなかったため、整理してみます。


# まとめ

|特徴|説明|
|:--|:--|
|概要|・バッチコンピューティングワークロードを実行できる<BR>・下記を提供する<BR>　・リソースのプロビジョニング<BR>　・キャパシティ制限の排除<BR>　・コスト削減<BR>　・結果の迅速な提供|
|AWS　Batchのコンポーネント|・リージョン内の複数のAZ間で実行中のバッチジョブを簡略化する<BR>・VPC内に環境を作成できる<BR>・ジョブキューに関連付けられた後で、ジョブを実行する<BR>・Dockerコンテナイメージを指定するジョブ定義を指定できる|
|ジョブ|・ジョブ定義で指定したパラメータを使用して、コンピューティング環境でコンテナ化されたアプリとしてFargate、EC2リソースで実行される<BR>・ジョブは、他のジョブを名前またはIDで参照できる<BR>・他のジョブの正常な完了に依存する場合もある|
|ジョブ定義|・ジョブ定義とは、ジョブの実行方法を指定する<BR>・ジョブ定義は、ジョブのリソースのブループリント<BR>・ジョブにIAMロールを指定することができる<BR>・メモリとCPUを指定できる<BR>・永続的なストレージのコンテナのプロパティ、環境変数、マウントポイントを制御できる<BR>・個別のジョブを送信する時に新しい値を指定してオーバーライドできる|
|ジョブキュー|・1つのジョブキューには、1つ以上のコンピューティング環境を関連付けることができる<BR>・優先度を割り当てられる。複数のジョブキュー自体にまたがって割り当てられる<BR>・高優先度キューや低優先度キューを持つことができる|
|コンピューティング環境|・JOBを実行するために使用されるマネージドまたは、アンマネージドコンピューティングリソースのセット<BR>・マネージドコンピューティングタイプは、Fargate、EC2を指定できる<BR>・コンピューティング環境は、EC2インスタンスタイプや特定のモデルを使用するように設定できる|

# 概要
[AWS Batchとは？](https://docs.aws.amazon.com/ja_jp/batch/latest/userguide/what-is-batch.html)を元に整理します。

> AWS Batch を使用すると、AWS クラウド でバッチコンピューティングワークロードを実行できます。バッチコンピューティングは、開発者、科学者、エンジニアが大量のコンピューティングリソースにアクセスするための一般的な方法です。AWS Batch は、従来のバッチコンピューティングソフトウェアと同様に、必要なインフラストラクチャの設定および管理に伴う、差別化につながらない力仕事を排除します。このサービスでは、送信されたジョブに応じてリソースを効率的にプロビジョニングし、キャパシティー制限の排除、コンピューティングコストの削減、および結果の迅速な提供を行うことができます。

> AWS Batch はフルマネージドサービスであり、あらゆるスケールのバッチコンピューティングワークロードを実行できます。AWS Batch は、コンピューティングリソースを自動的にプロビジョニングし、ワークロードの量と規模に基づいてワークロードのディストリビューションを最適化します。AWS Batch を使うと、バッチコンピューティングソフトウェアのインストールや管理が不要になり、結果の分析と問題の解決に集中できます。

- バッチコンピューティングワークロードを実行できる
- 下記を提供する
    - リソースのプロビジョニング
    - キャパシティ制限の排除
    - コスト削減
    - 結果の迅速な提供 

## AWS Batch のコンポーネント
> AWS Batch は、リージョン内の複数のアベイラビリティーゾーン間で実行中のバッチジョブを簡略化します。新規または既存の VPC 内に AWS Batch コンピューティング環境を作成できます。コンピューティング環境が稼働し、ジョブキューに関連付けられた後で、ジョブを実行する Docker コンテナイメージを指定するジョブ定義を指定できます。コンテナのイメージは、コンテナレジストリに保存され引き出されます。これは AWS インフラストラクチャの内にある場合も外にある場合もあります。

- リージョン内の複数のAZ間で実行中のバッチジョブンを簡略化する
- VPC内に環境を作成できる
- ジョブキューに関連付けられた後で、ジョブを実行する
- Dockerコンテナイメージを指定するジョブ定義を指定できる

### ジョブ
> AWS Batch に送信する作業単位 (シェルスクリプト、Linux 実行可能ファイル、Docker コンテナイメージなど)。ジョブには名前を付けます。ジョブは、ジョブ定義で指定したパラメーターを使用して、コンピューティング環境でコンテナ化されたアプリケーションとして AWS Fargate または Amazon EC2 リソースで実行されます。ジョブは、他のジョブを名前または ID で参照できます。また、他のジョブの正常な完了に依存する場合があります。詳細については、ジョブを参照してください。

- ジョブ定義で指定したパラメータを使用して、コンピューティング環境でコンテナ化されたアプリとしてFargate、EC2リソースで実行される
- ジョブは、他のジョブを名前またはIDで参照できる
- 他のジョブの正常な完了に依存する場合もある

### ジョブ定義
> ジョブ定義は、ジョブの実行方法を指定します。ジョブ定義は、ジョブのリソースのブループリントであると考えることができます。他の AWS リソースへのアクセスを提供するために、ジョブに IAM ロールを指定することができます。また、メモリ要件と CPU 要件の両方を指定できます。また、ジョブ定義では、永続的ストレージのコンテナのプロパティ、環境変数、マウントポイントを制御できます。ジョブ定義の多くの仕様は、個別のジョブを送信するときに新しい値を指定してオーバーライドできます。詳細については、ジョブ定義を参照してください。

- ジョブ定義とは、ジョブの実行方法を指定する
- ジョブ定義は、ジョブのリソースのブループリント
- ジョブにIAMロールを指定することができる
- メモリとCPUを指定できる
- 永続的なストレージのコンテナのプロパティ、環境変数、マウントポイントを制御できる
- 個別のジョブを送信する時に新しい値を指定してオーバーライドできる

### ジョブキュー
> AWS Batch ジョブを送信するときは、コンピューティング環境にスケジュールされるまでそのジョブが存在する、特定のジョブキューに送信します。1 つのジョブキューには、1 つ以上のコンピューティング環境を関連付けることができます。これらのコンピューティング環境には優先度の値を割り当てることができ、複数のジョブキュー自体にまたがって割り当てることもできます。たとえば、時間が重要なジョブを送信する高優先度キューや、コンピューティングリソースが安価であるときにいつでも実行できるジョブ用の低優先度キューを持つことができます。

- 1つのジョブキューには、1つ以上のコンピューティング環境を関連付けることができる
- 優先度を割り当てられる。複数のジョブキュー自体にまたがって割り当てられる
- 高優先度キューや低優先度キューを持つことができる

### コンピューティング環境
> コンピューティング環境は、ジョブを実行するために使用されるマネージドまたはアンマネージドコンピューティングリソースのセットです。マネージド型のコンピューティング環境では、複数の詳細レベルで目的のコンピューティングタイプ (Fargate または EC2) を指定できます。コンピューティング環境は、特定の EC2 インスタンスタイプや特定のモデル (c5.2xlarge や m5.10xlarge など) を使用するように設定できます。または、最新のインスタンスタイプを使用するように指定することのみを選択できます。また、環境の vCPU の最小数、希望数、最大数を、スポットインスタンスに対して支払う金額と共に、オンデマンドインスタンスの価格と一連のターゲット VPC サブネットの割合として指定できます。AWS Batch によって必要に応じてコンピューティングタイプの起動、管理、終了が効率的に行われます。お客様独自のコンピューティング環境を管理することもできます。その場合は、ユーザー自身が AWS Batch によって作成される Amazon ECS クラスターでインスタンスの設定とスケーリングを行う必要があります。詳細については、コンピューティング環境を参照してください。

- JOBを実行するために使用されるマネージドまたは、アンマネージドコンピューティングリソースのセット
- マネージドコンピューティングタイプは、Fargate、EC2を指定できる
- コンピューティング環境は、EC2インスタンスタイプや特定のモデルを使用するように設定できる

# 実践
## 事前準備
1. AWSにサインインし、VPCに移動します
1. VPCを作成します

## AWS Batchの作成
1. AWS Batchに移動します
1. ナビゲーションペインの「ウィザード」をクリックします
1. オーケストレーションタイプで「Fargate」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/47fb58c8-c41e-49ab-d862-5fe18396cc06.png)

1. コンピューティング環境設定では、任意の名前を指定します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f8eb803f-dcf3-4d69-aade-04ba22624cde.png)

1. インスタンス設定ではSpot、最大vCPUを指定します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e2c50514-8fa8-4105-288a-f1c88733b434.png)

1. NW設定では、作成したVPCやサブネットワーク、セキュリティグループを選択します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9db58d2d-459a-83dd-052f-a87d8786aeb8.png)

1. 次へをクリックします
1. ジョブキューを作成では、ジョブキュー名と、優先度を指定し「次へ」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0688d33c-40e9-4d4e-cc98-94ea953a7bdb.png)

1. ジョブ定義を作成では、名前、実行タイムアウトを設定します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a72357e6-5bc5-5187-68eb-c4065136e012.png)

1. Fargateプラットフォームの設定では、「CPU」や「ストレージ」を指定します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ec2f8298-f25b-e371-a8af-3101feaa1b11.png)

1. コンテナ設定では、イメージとコマンドを指定します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/669e2ec5-0c4e-12a6-66f7-a7887de6dabd.png)

1. パラメータと環境設定では、ジョブロール設定と、vCPU、メモリを指定し「次へ」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6425a498-00b4-e431-33e7-14a15f93f3a5.png)

1. JOBを作成
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4cfa8756-cc27-3a4f-7e8c-2ab18f42a935.png)

1. レビューおよび作成では、「リソースを作成」をクリックします

1. しばらくすると、リソースは作成されます。「ダッシュボードに移動」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/438b4a19-de08-58c0-cc82-0b8fbf9dd8ef.png)

1. コンソールですぐに、すでにSucceededになっていました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/16d1a4d9-6ee7-22ef-1d67-4899d34434a1.png)

1. ジョブキューの概要で「SUCCEEDED」をクリックします

1. ジョブの一覧が確認できました。ジョブ名をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b6281e19-e856-6d34-f564-6e30a5b99783.png)

1. ジョブの実行結果の詳細がわかります
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f151555a-ef38-ccf8-094b-10da0abe0f9d.png)

# 考察
今回は、AWS Batchについて試してみました。ウィザードを使用することで簡単に作成から実行までできました。
次回以降は、複数のジョブを投入してみたいと思います。

# 参考
https://docs.aws.amazon.com/ja_jp/batch/latest/userguide/what-is-batch.html

https://docs.aws.amazon.com/batch/latest/userguide/execution-IAM-role.html