AWS Lambda上でコンテナを実行します。Lambdaは簡素な関数や処理をAWS上で実行するサービスです。
Lambdaに関数を渡す手段の一つに、コンテナ内に関数を書く方法があります。今回はこれを利用します。
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 .
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 上でコンテナイメージを利用可能になりました。
AWS Lambda上でAWS ECRからコンテナイメージを読み込んで実行します。
1. 以下のURLからAWS Lambdaのコンソールを開きます。
https://console.aws.amazon.com/lambda/home#/functions
2. コンソール上のナビゲーションバーから、リージョンを選択します。
『〔手順3-2〕 AWS ECR上へコンテナをpushする』で選択したリージョンを指定してください。

3. 画面左のナビゲーションペインからEvent Functions」を選択します。
4. 画面左上にある「Create Event Functions」を選択します。

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

これで、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]の内容】
