【AWS Batch】準備から実行までの流れを図解

書くこと

AWS Batchの、事前準備から実行までの流れを書きます。

Batchと聞くと、ちゃちゃっと実行できてしまいそうですが、AWS Batchは事前準備が結構あります。

なるべくわかりやすく書きましたので、参考にしていただければ幸いです。

図解

まず図でやることを示します。AWS Batchでバッチを実行するだけで、結構な作業が必要となります。

作業PC(ローカルPC)でDockerイメージ(AWS Batchで動かすバッチ本体のようなもの)を作り、それをECRレジストリに登録します。

AWS Batchのバッチが実行されると、ECRレジストリのイメージからECRのクラスタ(コンピューティング環境)が起動し、そのクラスタ上でコンテナが起動され実行(バッチの実行)されます。

事前準備

Dockerイメージの作成

Dockerイメージの作成には、Docker for Windowsを使用します。(Docker for MacでやったらCPUのアーキテクチャの違いで全然実行できませんでした。。。)

【AWS Batch】Docker for Macを使用してアーキテクチャの違いでAWS Batchが動かなかった話

Docker for Windowsと、aws cliはすでにインストールされている前提です。インストールがまだの方は、以下のリンクからインストーラーをダウンロードしてインストールしていただければと思います。

Install Docker Desktop on Windows

Windows での AWS CLI バージョン 2 のインストール、更新、アンインストール

今回Dockerに実装すること(最終的にAWS Batchから実行すること)は、Pythonで”Hello from Python.“を表示するだけです。

PowerShellを起動して、コマンドを実行していきます。

centosのコンテナイメージをPull(ダウンロード)します。

PS > docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Already exists
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
PS >

Pullしたイメージを確認。

PS > docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
centos       latest    5d0da3dc9764   2 months ago   231MB
PS >

centosのDockerイメージの中に入ります。

PS > docker run -it centos /bin/bash
[root@1080d37a220b /]#

-i, –interactive コンテナの STDIN にアタッチ
-t, –tty 疑似ターミナル (pseudo-TTY) を割り当て

https://docs.docker.jp/engine/reference/commandline/run.html

Python3をインストール。

[root@1080d37a220b /]# yum install python3 -y
Failed to set locale, defaulting to C.UTF-8
CentOS Linux 8 - AppStream                                                              2.3 MB/s | 8.1 MB     00:03
CentOS Linux 8 - BaseOS                                                                 1.4 MB/s | 3.5 MB     00:02
CentOS Linux 8 - Extras                                                                 5.1 kB/s |  10 kB     00:02
Dependencies resolved.
========================================================================================================================
 Package                      Architecture    Version                                          Repository          Size
========================================================================================================================
Installing:
 python36                     x86_64          3.6.8-38.module_el8.5.0+895+a459eca8             appstream           19 k
Upgrading:
 chkconfig                    x86_64          1.19.1-1.el8                                     baseos             198 k
Installing dependencies:
 platform-python-pip          noarch          9.0.3-20.el8                                     baseos             1.7 M
 python3-pip                  noarch          9.0.3-20.el8                                     appstream           20 k
 python3-setuptools           noarch          39.2.0-6.el8                                     baseos             163 k
Enabling module streams:
 python36                                     3.6

Transaction Summary
========================================================================================================================
Install  4 Packages
Upgrade  1 Package

Total download size: 2.1 M
Downloading Packages:

※※※(省略)※※※

Upgraded:
  chkconfig-1.19.1-1.el8.x86_64
Installed:
  platform-python-pip-9.0.3-20.el8.noarch              python3-pip-9.0.3-20.el8.noarch
  python3-setuptools-39.2.0-6.el8.noarch               python36-3.6.8-38.module_el8.5.0+895+a459eca8.x86_64

Complete!
[root@1080d37a220b /]#

「/app」ディレクトリを作成して、その中に「hello.py」を作成。

[root@1080d37a220b /]# mkdir /app
[root@1080d37a220b /]#
[root@1080d37a220b /]# cd app/
[root@1080d37a220b app]# touch hello.py
[root@1080d37a220b app]#

「hello.py」の内容は「Hello from Python.」を表示するだけの簡単なもの。exitでDockerイメージから抜ける。

[root@1080d37a220b app]# vi hello.py
def hello():
   print("Hello from Python.")

hello()
[root@1080d37a220b app]# exit
exit
PS >

exitしたコンテナを起動して先ほど作ったPythonを実行してみる。

PS > docker start 1080d37a220b
1080d37a220b
PS >
PS > docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
1080d37a220b   centos    "/bin/bash"   59 minutes ago   Up 25 seconds             brave_liskov
PS >
PS > docker exec 1080d37a220b python3 /app/hello.py
Hello from Python.
PS >
PS > docker stop 1080d37a220b
1080d37a220b
PS >
PS > docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                     PORTS     NAMES
1080d37a220b   centos    "/bin/bash"   59 minutes ago   Exited (0) 2 seconds ago             brave_liskov
PS >

コンテナIDを指定して、カスタマイズした内容をコミット。イメージ名は「centospython」としました。

PS > docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED             STATUS                     PORTS     NAMES
1080d37a220b   centos    "/bin/bash"   About an hour ago   Exited (0) 4 minutes ago             brave_liskov
PS >
PS > docker commit 1080d37a220b centospython
sha256:acbbda056fdfd08af7b03b31b4d4de6bb2c4ad44ec7669667e398a2fce58b627
PS >
PS > docker images
REPOSITORY     TAG       IMAGE ID       CREATED              SIZE
centospython   latest    acbbda056fdf   About a minute ago   277MB
             f7c088fb236e   16 minutes ago       277MB
centos         latest    5d0da3dc9764   2 months ago         231MB
PS >

DockerイメージをECRにPushする

作成したイメージを、AWSのECR(Elastic Container Registry)にPush(アップロード)します。

まず、アクセスキーとシークレットアクセスキーを登録します。「atsushi」というプロファイルを作成して、そこにアクセスキーとシークレットアクセスキーを割り当て、「AWS_DEFAULT_PROFILE」という環境変数を指定してプロファイルの切り替えを行います。

PS > aws configure --profile=atsushi
AWS Access Key ID [None]: ********************
AWS Secret Access Key [None]: ****************************************
Default region name [None]: ap-northeast-1
Default output format [None]:
PS >
PS > type .\.aws\credentials
[atsushi]
aws_access_key_id = ********************
aws_secret_access_key = ****************************************
PS >
PS > $env:AWS_DEFAULT_PROFILE = "atsushi"
PS >

AWSのレジストリに対して認証(ログイン)します。

PS > aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin [自分のAWSアカウントID].dkr.ecr.ap-northeast-1.amazonaws.com
Login Succeeded
PS >

AWSコンソール側の作業です。AWSコンソールにログインし、ECS(Elastic Container Service)のダッシュボードから、ECRのレポジトリをクリックし、「レポジトリを作成」をクリックします。

今回は「repo-hello」という名前でECRレポジトリを作成しました。

作成したレポジトリのURIをコピーします。

ローカルのDockerイメージにタグを付けます。コマンドは下記となります。

docker tag [ローカルイメージの名前]:[ローカルイメージのタグ] [さっきコピーしたURI]:[ECRレジストリ側のタグ]

PS > docker images
REPOSITORY     TAG       IMAGE ID       CREATED             SIZE
centospython   latest    acbbda056fdf   53 minutes ago      277MB
             f7c088fb236e   About an hour ago   277MB
centos         latest    5d0da3dc9764   2 months ago        231MB
PS >
PS > docker tag centospython:latest [AWSアカウントID].dkr.ecr.ap-northeast-1.amazonaws.com/repo-hello:latest
PS >

タグを付けたイメージをECRレジストリにPushします。

PS > docker push 212928105054.dkr.ecr.ap-northeast-1.amazonaws.com/repo-hello:latest
The push refers to repository [212928105054.dkr.ecr.ap-northeast-1.amazonaws.com/repo-hello]
571bca935688: Pushed
74ddd0ec08fa: Pushed
latest: digest: sha256:b946a23e352d06df870988daffd634171c93c14798b240805956d28c3821d569 size: 741
PS >

ECRレポジトリの画面を更新してみると、アップロードされていることが確認できます。

AWS Batchの作成

さていよいよAWS Batchの作成に入ります。

AWSコンソールでAWS Batchのダッシュボードを開き、「コンピューティング環境」をクリックして「作成」をクリックします。

以下の通りでコンピューティング環境は作成しました。
○マネージド型とする。
○コンピューティング環境の名前:test-env
○サービスロール:Batch service-linked role(デフォルト値)
○プロビジョニングモデル:Fargate
○ネットワーキングでは、使用するVPCを選択し、インターネットに繋がっているサブネットを選択する←ここ大事!

次はジョブキューを作成します。AWS Batchダッシュボードの左ペインの「ジョブキュー」から、「作成」をクリックします。

ジョブキューでは名前を決めて、先ほど作成したコンピューティング環境を選択するだけです。それ以外はデフォルトとしました。

ジョブ定義の作成に入る前に、ECRレポジトリの画面に戻り、Pushした「latest」イメージのURIをコピーします。

ジョブ定義を作ります。左ペインの「ジョブ定義」から「作成」をクリックします。

ジョブ定義のパラメータにについて、変更箇所のみピックアップして下図に示します。
○名前:「test-def」としました。
○Platform Type:Fargate ←コンピューティング環境で選んだものと同じにします。
○イメージ:先ほどコピった「latest」イメージのURIを貼り付けます。←ここ重要!
○コマンド:ここでは「python3 /app/hello.py」になります。コンテナ作成のときに作ったプログラムです。
○パブリックIP割り当て:「有効化」にチェックを入れます。

ジョブの実行

ジョブの作成と実行

さていよいよジョブの実行です。ここまで長かったな。。。読んでくれてありがとう。(しかしバッチの実行だけでこんなに手間がかかるんだ。。。)

AWS Batchのダッシュボードの左ペインから「ジョブ」をクリックし、「新しいジョブを送信」をクリックします。

抜粋して記載します。
○ジョブの名前:ここでは「test-job」としました。
○ジョブ定義:先ほど作成した「test-def」を選択します。
○ジョブキュー:先ほど作成した「test-queue」を選択します。
○コマンド:ジョブ定義で指定したコマンドが記載されていることを確認します。(ジョブ実行時にコマンドを変えることもできるね)

ジョブの結果確認

AWS Batchダッシュボードの左ペイン「ダッシュボード」をクリックして結果を確認します。
SUCCEEDEDにカウントされていれば成功です。(画面を更新していると、RUNNABLE→STARTING→RUNNING→SUCCEEDEDと遷移するのが確認できます)

右下のSUCCEEDEDの「1」をクリックします。

ジョブ名(ここでは「test-job」)をクリックします。

「ログストリーム名」の下のリンクをクリックします。

CloudWatch Logsの画面に飛びます。ログを確認すると、コンテナのPython(hello.py)に書いた、「Hello from Python.」が表示されています!!

あとがき

最後までお読みいただきありがとうございました。

AWS Batchは結構面倒だな、というのが正直な感想です。

これならLambdaとかを使ったほうがはるかに早いですよね。。。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!

コメント

コメントする

CAPTCHA