コンニチハ、BFT名古屋支店のヤタテです。
今回は、サーバレスアーキテクチャのAWS Batchでコンテナイメージを実装する方法
についてまとめてみました。
【AWS】Lambda/Batchへのコンテナ利用 -03_Batch用コンテナ-
背景
AWS Lambda/Batchにて、コンテナイメージによる実装を開始。
検証内容
- Lambdaへのコンテナイメージによる関数実装
- Batchへのコンテナイメージ流用が可能であるか確認
→流用が難しいため、Batch用に別途コンテナを用意。
現状
- コンテナ使用経験なし
→ 簡単なDockerfileなら作成可能な段階 - Lambdaにて、Python(スクリプト言語)での使用経験あり
- Batchの使用経験なし
- AWS使用経験あり (EC2やVPC周りのみ)
AWS Batchの概要
AWS Batchの詳細は、以下の記事を参照。
AWS Batchのおさらい
AWS Batchの要素
- コンピューティング環境 //ジョブ定義で指定したコンテナが実際に動作する環境
- ジョブキュー //ジョブのキューイング
- ジョブ定義 //ジョブを実行するコンピューティング環境やコンテナイメージなどを指定
AWS Batchの動作の流れ
- ジョブ定義に従って、新規ジョブをキューイング
- ジョブ実行開始
- EC2インスタンスを作成する //Fargateの場合、EC2インスタンス画面には表示されない
- ECRよりコンテナイメージをPullする
- EC2インスタンス上でコンテナを実行する
- ジョブ終了後、EC2インスタンスを削除する //コンピューティング環境の設定次第では削除されない)
今回は、「4」でPullするコンテナイメージの作成が記載対象。
AWS Batch用Dockerイメージ作成の準備
前提条件
※Docker管理用のEC2があると、IAM権限周りがシンプルで楽できる
自分のPCに入れる場合は、aws cliを導入する必要あり
今回は、windows版を使用
Dockerのインストール方法は、以下参照。
◆ubuntuへのインストール◆
サーバ運用したい人向け
bftnagoya.hateblo.jp
◆windows10へのインストール◆
とにかくdocker触ってみたい、aws ecrにアップロードしたいだけの人向け
bftnagoya.hateblo.jp
Dockerfileの作成
今回は、以下の記事で作成したJarファイルを実行するコンテナを作成する。
用意するもの
- Dockerfile
- JDK //今回は、検証時の最新版であるJava15を使用
- Jarファイル
- Amazon Linux 2のコンテナイメージ //記載時点では、amazonlinux:latestでpull可 (2021/3/26)
Amazon Linux 2のコンテナイメージ取得
> docker pull amazonlinux:latest > docker run -it --rm amazonlinux:latest cat /etc/os-release NAME="Amazon Linux" VERSION="2" ID="amzn" ID_LIKE="centos rhel fedora" VERSION_ID="2" PRETTY_NAME="Amazon Linux 2" ANSI_COLOR="0;33" CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2" HOME_URL="https://amazonlinux.com/"
※2行目のコマンドは、以下のことを一連で実施
- amazonlinux:latestのコンテナイメージを起動
- cat /etc/os-releaseコマンドを実行 //Amazon Linux 2のバージョン情報ファイル
- コマンド実行後、停止したコンテナを削除
イメージ作成用ディレクトリ・ファイル準備
.\Dockerfile_Jar
.\Conf
.\Conf\clock
.\Packages
.\Packages\jdk-15.0.2_linux-x64_bin.tar.gz
.\Sources
.\Sources\SqlDo8_v2.jar
ファイル解説
■clock
Amazon Linux 2のタイムゾーン設定用ファイル。
コンテナ内は、ホストの言語設定等を引き継ぐわけではないため、別途設定が必要。
※Batchで実行したときに、CloudWatchLogsにてUTCだったり文字化け(「???」)してたりしたら
OS設定が漏れてる可能性あり
ZONE="Asia/Tokyo" UTC=true
■jdk-15.0.2_linux-x64_bin.tar.gz
今回使用するjava15のインストール資材。
■SqlDo8_v2.jar
今回実行するJarファイル。
動作内容のサマリは以下の通り。
- tstbl1とtstbl2の取得結果を内部結合
- tstbl3へ、結合した結果のレコードを追加
- tstbl3の取得結果を標準出力
Dockerfile_jarの中身
FROM amazonlinux:latest LABEL version='1.0' LABEL description="Dockerfileテスト_Java導入" RUN mkdir /work/ RUN mkdir /app/ RUN mkdir /app/jar/ RUN mkdir /opt/java/ RUN yum install -y glibc-langpack-ja RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime RUN mv /etc/sysconfig/clock /etc/sysconfig/clock_org COPY Conf/clock /etc/sysconfig/clock COPY Sources/SqlDo8_v2.jar /app/jar/ ADD Packages/jdk-15.0.2_linux-x64_bin.tar.gz /opt/java/ ENV LANG ja_JP.UTF-8 ENV LC_ALL ja_JP.UTF-8 ENV JAVA_HOME /opt/java/jdk-15.0.2 ENV PATH $PATH:$JAVA_HOME/bin CMD ["java","-jar","/app/jar/SqlDo8_v2.jar"]
■ファイル内容概要
- OSの日本語化
- OSのタイムゾーン変更
- /app/jar/SqlDo8_v2.jarの配置
- /opt/java/jdk-15.0.2の配置 //ADDにて展開同時実施
- 環境変数の指定($LANG/$LC_ALL/$JAVA_HOME/$PATH)
- Jarの実行
※COPYやADDのファイルパスをOSに合わせて変更する必要なし Windowsでも「/」でOK
コンテナイメージの作成
> docker build -t sqldo:latest -f C:\work\DockerWork\Dockerfile_Jar C:\work\DockerWork [+] Building 24.4s (16/16) FINISHED => [internal] load build definition from Dockerfile_Jar 0.0s => => transferring dockerfile: 694B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/amazonlinux:latest 0.0s => [ 1/11] FROM docker.io/library/amazonlinux:latest 0.0s => [internal] load build context 4.7s => => transferring context: 189.11MB 4.6s => CACHED [ 2/11] RUN mkdir /work/ 0.0s => [ 3/11] RUN mkdir /app/ 0.9s => [ 4/11] RUN mkdir /app/jar/ 1.1s => [ 5/11] RUN mkdir /opt/java/ 1.0s => [ 6/11] RUN yum install -y glibc-langpack-ja 12.7s => [ 7/11] RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime 0.5s => [ 8/11] RUN mv /etc/sysconfig/clock /etc/sysconfig/clock_org 0.6s => [ 9/11] COPY Conf/clock /etc/sysconfig/clock 0.0s => [10/11] COPY Sources/SqlDo8_v2.jar /app/jar/ 0.1s => [11/11] ADD Packages/jdk-15.0.2_linux-x64_bin.tar.gz /opt/java/ 5.1s => exporting to image 2.2s => => exporting layers 2.2s => => writing image sha256:1b39245193fee9e9ed0f74459e6db9a05a9b3ef78a770d5e83eecea86097f3ff 0.0s => => naming to docker.io/library/sqldo:latest > docker images REPOSITORY TAG IMAGE ID CREATED SIZE sqldo latest 1b39245193fe 15 seconds ago 754MB docker/getting-started latest 3ba8f2ff0727 7 days ago 27.9MB amazonlinux latest 935e8db88df5 4 weeks ago 163MB
→ sqldo:latestが無事に完成。
この後、ECRへアップロード
ECRへのアップロード
アップロードの流れ
1. ECRでリポジトリを作成
参考:リポジトリの作成
2. コンテナイメージへ、ECRアップロード用のイメージ名/タグ名を付与
「<コンテナ名>のプッシュコマンド」に従い、コマンドを実施。
- Docker Loginの実施
※プロファイル名を指定している場合は、AWSコマンドの末尾に追加
コンソール上のコマンドには含まれていないので注意
default使用の場合、--profileは不要
> aws ecr get-login-password --region ap-northeast-1 --profile <プロファイル名> | docker login --username AWS --password-stdin 111122223333.dkr.ecr.ap-northeast-1.amazonaws.com Login Succeeded
- 作成したコンテナイメージへタグを付与する
> docker tag sqldo:latest 111122223333.dkr.ecr.ap-northeast-1.amazonaws.com/sqldo:latest > docker images docker images REPOSITORY TAG IMAGE ID CREATED SIZE 111122223333.dkr.ecr.ap-northeast-1.amazonaws.com/sqldo latest 1b39245193fe 3 hours ago 754MB sqldo latest 1b39245193fe 3 hours ago 754MB
- 作成したコンテナイメージへタグを付与する
> docker tag sqldo:latest 111122223333.dkr.ecr.ap-northeast-1.amazonaws.com/sqldo:latest > docker images docker images REPOSITORY TAG IMAGE ID CREATED SIZE 111122223333.dkr.ecr.ap-northeast-1.amazonaws.com/sqldo latest 1b39245193fe 3 hours ago 754MB sqldo latest 1b39245193fe 3 hours ago 754MB
3. ECRで作成したリポジトリへPush
- タグ付与したコンテナイメージをPushする
> docker push 111122223333.dkr.ecr.ap-northeast-1.amazonaws.com/sqldo:latest The push refers to repository [111122223333.dkr.ecr.ap-northeast-1.amazonaws.com/sqldo] xxxxxxxxxxxxxx: Pushed xxxxxxxxxxxxxx: Pushed xxxxxxxxxxxxxx: Pushed xxxxxxxxxxxxxx: Pushed xxxxxxxxxxxxxx: Pushed xxxxxxxxxxxxxx: Pushed xxxxxxxxxxxxxx: Pushed xxxxxxxxxxxxxx: Pushed xxxxxxxxxxxxxx: Pushed xxxxxxxxxxxxxx: Pushed xxxxxxxxxxxxxx: Pushed latest: digest: sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx size: 2614
このコンテナを利用して、
AWS Batchのジョブ定義を作成し、実行する。