第3章 AWS Lambda上でのコンテナ実行

AWS Lambda上でコンテナを実行します。Lambdaは簡素な関数や処理をAWS上で実行するサービスです。
Lambdaに関数を渡す手段の一つに、コンテナ内に関数を書く方法があります。今回はこれを利用します。

〔手順3-1〕 Dockerコンテナの作成

Lambda関数が入ったDockerコンテナを作成します。

1. 空のディレクトリを用意し、用意した3つのファイルを配置します。

2. 『〔手順1-1〕 Dockerコンテナの作成』の「2.」「3.」と同じ手順で[entrypoint.sh]を生成・記述します。
このとき、[entrypoint.sh]の内容には以下の変更点があります。

【entrypoint.shの内容】

#!/bin/bash
set -eu
AHPDFToolCmd80 -getFileInfo -d ${LAMBDA_TASK_ROOT}/input.pdf

3. Linuxコンソールを用いて空の[lambda_function.py]を作成します。

4. 作成した[lambda_function.py]に、動作内容を記述します。

【lambda_function.pyの内容】

import os
import subprocess

def handler(event, context):
return {"PDFToolCMD": subprocess.getoutput("${LAMBDA_TASK_ROOT}/entrypoint.sh")}

5. 『〔手順1-1〕 Dockerコンテナの作成』の「4.」「5.」と同じ手順で[Dockerfile]を生成・記述します。このとき、[Dockerfile]の内容には以下の変更点があります。

【Dockerfileの内容】

FROM public.ecr.aws/lambda/python:3.12

# PDF Tool API の rpm をコピー
COPY AHPDFToolLib80-8.0-MR5.x86_64.rpm /tmp/
# インストール
RUN rpm -i /tmp/AHPDFToolLib80-8.0-MR5.x86_64.rpm

# ライセンスファイル[ptalic.dat] をコピー
COPY ptalic.dat /usr/AHPDFToolLib80/License
RUN chmod 644 /usr/AHPDFToolLib80/License/ptalic.dat
# ============================
# 環境変数の設定
# ============================

ENV PTL80_HOME="/usr/AHPDFToolLib80"
ENV PTL80_LIB_FOLDER="${PTL80_HOME}/lib"
ENV PTL80_BIN_FOLDER="${PTL80_HOME}/ToolCmd"
ENV PTL80_LICENSE_FOLDER="${PTL80_HOME}/License"
ENV PTL80_ETC_FOLDER="${PTL80_HOME}/fontconfig"
ENV PTL80_ICC_FOLDER="${PTL80_HOME}/icc"

ENV LD_LIBRARY_PATH="${PTL80_LIB_FOLDER}"
ENV PTL80_LIC_PATH="${PTL80_LICENSE_FOLDER}"
ENV PTL80_FONT_CONFIGFILE="${PTL80_ETC_FOLDER}/font-config.xml"
ENV PTL80_ICCPROFILE_PATH="${PTL80_ICC_FOLDER}"

# PATH 追加
ENV PATH="${PATH}:${PTL80_BIN_FOLDER}"

# Copy function code
COPY lambda_function.py ${LAMBDA_TASK_ROOT}
# その他の実行用ファイル追加
COPY input.pdf ${LAMBDA_TASK_ROOT}
COPY entrypoint.sh ${LAMBDA_TASK_ROOT}
RUN chmod -R 755 ${LAMBDA_TASK_ROOT}/.

# CMDでlambdaで呼び出す関数を呼び出す
CMD [ "lambda_function.handler" ]

6. 『〔手順1-1〕 Dockerコンテナの作成』の「4.」と同じ手順でDockerコンテナをビルドします。
このとき、以下の変更点があります。

さらにLambdaで動作させるための変更として、追加で以下のオプション指定が必要です。

【Docker Engine用コンテナビルドコマンド】

docker buildx build --platform linux/amd64 --provenance=false -t lambda-toolapi-test .

〔手順3-2〕 AWS ECR上へコンテナをpushする

AWS ECR上にリポジトリを作り、今回の処理のコンテナをpushします。

1. 『〔手順2-2〕 AWS ECR上へコンテナをpushする』の「1.」~「2.」と同じ手順でAWS CLIにログインし、Amazon ECRレジストリに対してDockerクライアントの認証を通します。
ここのコマンドは完全に同一です。

2.『〔手順2-2〕 AWS ECR上へコンテナをpushする』の「3.」と同じ手順でAWS ECR上にリポジトリを作成します。

aws ecr create-repository --repository-name lambda-toolapi-test-repo --region <region>

4.『〔手順2-2〕 AWS ECR上へコンテナをpushする』の「4.」と同じ手順でpushしたいリポジトリ名のタグを付与します。

docker tag lambda-toolapi-test <aws_account_id>.dkr.ecr.<region>.amazonaws.com/lambda-toolapi-test-repo

5.『〔手順2-2〕 AWS ECR上へコンテナをpushする』の「5.」と同じ手順でイメージをpushします。

docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/lambda-toolapi-test-repo

これでAWS 上でコンテナイメージを利用可能になりました。

〔手順3-3〕 AWS Lambda上でコンテナを実行する

AWS Lambda上でAWS ECRからコンテナイメージを読み込んで実行します。

1. 以下のURLからAWS Lambdaのコンソールを開きます。

https://console.aws.amazon.com/lambda/home#/functions

2. コンソール上のナビゲーションバーから、リージョンを選択します。
『〔手順3-2〕 AWS ECR上へコンテナをpushする』で選択したリージョンを指定してください。

Please enter alt text.

3. 画面左のナビゲーションペインからEvent Functions」を選択します。

4. 画面左上にある「Create Event Functions」を選択します。

Please enter alt text.

5. 以下の設定値でLambda関数を作成します。

Please enter alt text.

これで、Lambda関数が作成されました。

6. Lamda関数を実行します。
Linuxコンソールを開き、以下のコマンドを実行します。

aws lambda invoke --function-name lambda-toolapi-test-function response.json

実行後、Linuxコンソールのカレントディレクトリに実行結果[response.json]が出力されます。
[response.json]の内容は、Pythonスクリプト[lambda_function.py]を実行した際の戻り値です。

内容を見ると、コンテナ内に置いたPDFの情報を取得できています。

【[response.json]の内容】

Please enter alt text.