BFT名古屋 TECH BLOG

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

【AWS】Lambda/Batchへのコンテナ利用 -01_コンテナ理解-

コンニチハ、BFT名古屋支店のヤタテです。
今回は、AWSのLambda/Batchでのコンテナイメージを理解するためにやった事を
書いていきたいと思います。

Lambda/Batchへのコンテナ利用 -01_コンテナ理解-

背景

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

検証内容

  1. Lambdaへのコンテナイメージによる関数実装
  2. Batchへのコンテナイメージ流用が可能であるか確認

現状

  • コンテナ使用経験なし
  • Lambdaにて、Python(スクリプト言語)での使用経験あり
  • Batchの使用経験なし
  • AWS使用経験あり (EC2やVPC周りのみ)

AWSについてはある程度イメージがつく。
  コンテナは、使用や作成イメージがほとんどついていない。

コンテナに触れてみる

Dockerインストール

OSの選定

OS:ubuntu 20.04

OSのこだわりは特になく、dockerの導入が容易であるため。
AWS ECS等は、Dockerを使用しているため。
参考:Amazon ECS における Docker の基本

導入手順

本手順は、以下サイト参照にて実施。
Ubuntu 20.04へのDockerのインストールおよび使用方法
Ubuntuにdockerをインストールする(Qiita)

コンテナの基本概念

  • コンテナイメージ:コンテナの元の様なもの。OSイメージやAMIイメージのようなもの。
  • コンテナ    :立ち位置としては仮想マシン。イメージを元に起動する。
  • Pull(プル)    :コンテナイメージを、リポジトリから取得すること。
  • Push(プッシュ)  :コンテナを元に、コンテナイメージを作成/更新すること。

Dockerの基本操作

Dockerコマンド

Docker操作を行うためのコマンド。 実行するためには、実行ユーザをグループ「docker」へ追加する必要あり。 ※Dockerインストール時に自動でグループ作成

$ docker <サブコマンド> <オプション>

Dockerコンテナの起動/停止

稼働中のコンテナ確認
※オプション(-a)を付けることで、非稼働中のコンテナも表示。

$ docker ps

コンテナの起動 (非稼働コンテナ)
※本コマンドで起動できるのは、非稼働中のコンテナのみ。(docker ps -aで確認可能)

$ docker start <コンテナID>

コンテナの起動 (コンテナイメージ)
※オプション(-lt)を付けることで、コンテナ上で操作可能。

$ docker run <コンテナイメージ名(ubuntuなど)>

コンテナの停止

$ docker stop <コンテナID>

Dockerイメージの作成

Dockerfileを利用したイメージ作成

イメージ作成(ビルド)コマンド

docker build -t <イメージ名>:<タグ名> <Dockerfile配置先>)
docker build -t testimage:v1.0  . ←カレントディレクトリ指定
注意
  1. Dockerfileのファイル名は、「Dockerfile」で固定
  2. イメージ作成に使うパッケージやソースコードは、Dockerfileの配置先を規準に決定される
     → Dockerfileを記述する際、COPYやADDで要注意

Dockerfileの作成

Dockerfileの作成時は、Dockerfileを中心にディレクトリ構成を考える。 ※各ディレクトリ名は任意。

./Dockerfile
./Packages.d  ← ビルド時に使用するpkgファイル格納用
./Sources.d  ← ビルド時に使用するソースコード格納用
./Conf.d    ← コンテナ稼働させるMWの設定ファイル格納用 etc...

Dockerfile内のコマンド

以下、代表的なコマンド記載。

  • FORM:ビルドに使用する元イメージを指定。
  • RUN:ビルド時に実行するコマンド。
  • COPY:ビルド時にホストからファイルをコピーする際に使用。
        ディレクトリ指定は、Dockerfile配置場所がルートディレクトリになる点注意。
  • ADD:COPYと異なり、gzなどの圧縮ファイルの解凍まで実施。扱いが難しい。
  • ENV:コンテナ起動時の環境変数指定。
        →起動時に指定のため、コンテナ内部でprofile等による永続設定必要なし。
  • WORKDIR:後述の「CMD」コマンド実施時のカレントディレクトリ指定。
  • CMD:コンテナ起動時に実行するコマンドの指定。
        →コンテナ内のサービス起動やシェル実行などで使用。

ubuntuイメージにoracleJDKを導入し、「Hello world!!」を出力するdockerイメージ

--ディレクトリ構成--
./Dockerfile
./Packages  ←oracleJDKのパッケージ(.tar.gz)を格納ディレクトリ
./Sources   ←「Hello world!!」を出力するJavaのクラスファイルを格納ディレクトリ
./temp     ←一時保存ディレクトリ (今回は特に使用なし)
--Dockerfile--
# ubuntu 20 のベースイメージを取得
FROM ubuntu:latest

RUN mkdir /work
RUN mkdir /work/01_dockerfiles
RUN mkdir /opt/java/

COPY Sources/Main.class /work/01_dockerfiles/
COPY Packages/jdk-15.0.2_linux-x64_bin.tar.gz /tmp/

RUN tar -zxvf /tmp/jdk-15.0.2_linux-x64_bin.tar.gz -C /opt/java/

ENV JAVA_HOME /opt/java/jdk-15.0.2
ENV PATH $PATH:$JAVA_HOME/bin
WORKDIR /work/01_dockerfiles
CMD ["java","Main"]
--Hello worldのコード--
public class Main{
public static void main(String[] args){
    String OneWord;
    OneWord = "Hello World!!";
    System.out.println(OneWord);
    }
}

この後実行してHello worldが出力されたらOKとなります。