AWS CLI を使って AWS Batch を実行するまでを解説します。
このドキュメントを読むためには AWS EC2、AWS S3 および docker に対する基本的な知識が必要です。
なお、ジョブのスケジュール設定については解説しません。
目次
全3回です。
- はじめに ← イマココ
- パラメータを使ってジョブを送信する
- 環境変数を使ってジョブを送信する
AWS Batch とは
※正確な情報はAmazon 公式ドキュメントを参照してください。
AWS が用意したバッチジョブを実行するための仕組みです、と言ってしまえばおしまいですが、もう少し私なりに説明してみようと思います。
バッチジョブ実行システム
以下のような状況を想像してください。
画像処理を行うシステムを作ろうとしています。
- 元画像(入力データ)は複数あり、AWS S3 に置いてあります。
- 入力データをいろいろな種類の画像処理システムで加工して AWS S3 に出力します。
- 処理システムは EC2 インスタンス上の docker コンテナを想定しています。
上の図(1)を見てください。「cat.A を S3 から取ってきて、グレイスケール化して、cat.A.gray として S3 に出力する」という実際の作業単位が 1 つのジョブです。
次に 「cat.B を S3 から取ってきて、グレイスケール化して、cat.B.gray として S3 に出力する」というのも 1 つのジョブです。この 2 つのジョブは入出力データのパスの違いを除くと「データを S3 から取ってきて、グレイスケール化してS3 に出力する」という作業は共通です。この「共通の部分」を定義しておき、入出力だけあとから指定できるようにしておけば、特別な作業なく cat.C も新たに処理できるよね、というのが AWS Batch の考え方です。プログラムの関数化やパッケージ化と同じ発想だと思います。
では実際に「共通の部分」には何が必要になるかを考えてみます。
まずは処理するためのライブラリ群が必要でしょう。AWS Batch においては docker イメージとして用意しておきます。
次にマシン環境が必要です。ジョブを実行するために必要な cpu や memory です。
AWS Batch に対して「共通の部分」そして「ジョブごとの違い」をどのように指定するかを次項で示します。
AWS Batch の構成要素
AWS Batch は以下 4 つの要素から構成されます。簡単に説明します。
ジョブごとに違う
- ジョブ ... 実際の作業単位。ジョブ定義に基づいて作成され、キューに送信される。
共通
- ジョブ定義 ... ジョブの実行環境を定義したもの。例えば、docker イメージや実行に必要な vcpus, memory を定義する。
- キュー ... ジョブを送信する対象であり、コンピュート環境に紐づけられ優先順位を持っている。
- コンピュート環境 ... ジョブを実行するために 1 つ以上作成する EC2 インスタンスの定義。
図の解説
-
ジョブはキューに送信される。
-
ジョブはキューの優先度の高い順に実行される。
- 優先度が同じジョブの数に応じて EC2 インスタンスが作成される
- Queue-2 は優先度の高いジョブがあるため実行を保留している。
-
ジョブは docker コンテナで実行される。
- どのような docker コンテナを作成するかはジョブ定義で定義されている
- ジョブが複数あるとき、作成した EC2 インスタンスのスペック次第では docker コンテナを2つ立ち上げる。(※)
※実行できるジョブ数はどうやって決めているか
AWS Batch 側で判断しているため推測ですが、ジョブ定義でジョブ実行に必要なスペックを指定しているため、立ち上げた EC2 インスタンスのスペックと照らし合わせて決めているようです。
なお、スペックとはここでは vcpus と memory を指します。
実際の AWS CLI コマンドは次回、パラメータを使ってジョブを送信するで解説します。