aws-cli
AWS-Batch

AWS CLI で AWS Batch にジョブを送信する (第1回)

AWS CLI を使って AWS Batch を実行するまでを解説します。
このドキュメントを読むためには AWS EC2、AWS S3 および docker に対する基本的な知識が必要です。
なお、ジョブのスケジュール設定については解説しません。

目次

全3回です。

  1. はじめに ← イマココ
  2. パラメータを使ってジョブを送信する
  3. 環境変数を使ってジョブを送信する

AWS Batch とは

※正確な情報はAmazon 公式ドキュメントを参照してください。

AWS が用意したバッチジョブを実行するための仕組みです、と言ってしまえばおしまいですが、もう少し私なりに説明してみようと思います。

バッチジョブ実行システム

以下のような状況を想像してください。
画像処理を行うシステムを作ろうとしています。

  • 元画像(入力データ)は複数あり、AWS S3 に置いてあります。
  • 入力データをいろいろな種類の画像処理システムで加工して AWS S3 に出力します。
  • 処理システムは EC2 インスタンス上の docker コンテナを想定しています。

image.png

上の図(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 インスタンスの定義。

image.png

図の解説

  1. ジョブはキューに送信される。

  2. ジョブはキューの優先度の高い順に実行される。

    • 優先度が同じジョブの数に応じて EC2 インスタンスが作成される
    • Queue-2 は優先度の高いジョブがあるため実行を保留している。
  3. ジョブは docker コンテナで実行される。

    • どのような docker コンテナを作成するかはジョブ定義で定義されている
    • ジョブが複数あるとき、作成した EC2 インスタンスのスペック次第では docker コンテナを2つ立ち上げる。(※)

※実行できるジョブ数はどうやって決めているか
 AWS Batch 側で判断しているため推測ですが、ジョブ定義でジョブ実行に必要なスペックを指定しているため、立ち上げた EC2 インスタンスのスペックと照らし合わせて決めているようです。
 なお、スペックとはここでは vcpus と memory を指します。

実際の AWS CLI コマンドは次回、パラメータを使ってジョブを送信するで解説します。