BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【AWS】Lambda/Batchへのコンテナ利用 -03_Batch用コンテナ-

コンニチハ、BFT名古屋支店のヤタテです。
今回は、サーバレスアーキテクチャAWS Batchでコンテナイメージを実装する方法
についてまとめてみました。

AWS】Lambda/Batchへのコンテナ利用 -03_Batch用コンテナ-

背景

AWS Lambda/Batchにて、コンテナイメージによる実装を開始。

検証内容

  1. Lambdaへのコンテナイメージによる関数実装
  2. Batchへのコンテナイメージ流用が可能であるか確認
     →流用が難しいため、Batch用に別途コンテナを用意。

現状

  • コンテナ使用経験なし
     → 簡単なDockerfileなら作成可能な段階
  • Lambdaにて、Python(スクリプト言語)での使用経験あり
  • Batchの使用経験なし
  • AWS使用経験あり (EC2やVPC周りのみ)

AWS Batchの概要

AWS Batchの詳細は、以下の記事を参照。

bftnagoya.hateblo.jp

AWS Batchのおさらい

AWS Batchの要素

  • コンピューティング環境  //ジョブ定義で指定したコンテナが実際に動作する環境
  • ジョブキュー       //ジョブのキューイング
  • ジョブ定義        //ジョブを実行するコンピューティング環境やコンテナイメージなどを指定

AWS Batchの動作の流れ

  1. ジョブ定義に従って、新規ジョブをキューイング
  2. ジョブ実行開始
  3. EC2インスタンスを作成する          //Fargateの場合、EC2インスタンス画面には表示されない
  4. ECRよりコンテナイメージをPullする
  5. EC2インスタンス上でコンテナを実行する
  6. ジョブ終了後、EC2インスタンスを削除する  //コンピューティング環境の設定次第では削除されない)

今回は、「4」でPullするコンテナイメージの作成が記載対象。

AWS Batch用Dockerイメージ作成の準備

前提条件

  • Dockerがインストールされていること
  • aws cliがインストールされていること

※Docker管理用のEC2があると、IAM権限周りがシンプルで楽できる
 自分のPCに入れる場合は、aws cliを導入する必要あり
 今回は、windows版を使用

Dockerのインストール方法は、以下参照。

ubuntuへのインストール◆
サーバ運用したい人向け bftnagoya.hateblo.jp

◆windows10へのインストール◆
とにかくdocker触ってみたい、aws ecrにアップロードしたいだけの人向け bftnagoya.hateblo.jp

Dockerfileの作成

今回は、以下の記事で作成したJarファイルを実行するコンテナを作成する。

bftnagoya.hateblo.jp

用意するもの

  • 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ファイル。
動作内容のサマリは以下の通り。

  1. tstbl1とtstbl2の取得結果を内部結合
  2. tstbl3へ、結合した結果のレコードを追加
  3. 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アップロード用のイメージ名/タグ名を付与
  3. ECRで作成したリポジトリへPush

1. ECRでリポジトリを作成

リポジトリの作成方法は、以下AWS公式を参照。

参考:リポジトリの作成

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のジョブ定義を作成し、実行する。

bftnagoya.hateblo.jp