書くこと
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 にアタッチ
https://docs.docker.jp/engine/reference/commandline/run.html
-t, –tty 疑似ターミナル (pseudo-TTY) を割り当て
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とかを使ったほうがはるかに早いですよね。。。
コメント