第5章 [応用]AWS LambdaでAmazon S3上に展開されたPDFを処理する

AWS Lambdaでもコンテナ実行をAWSのサービスと組み合わせことができます。
本章では『第4章 [応用]FargateでAmazon S3上に展開されたPDFを処理する』と同じ処理をAWS Lambdaで実行する方法を解説します。

〔手順5-1〕 Amazon S3にPDFファイルをアップロードする

入力ファイルを配置するためのS3バケットを作成し、PDFをアップロードします。

1. 『〔手順4-1〕 Amazon S3にPDFファイルをアップロードする』の「1.」~「5.」と同じ処理でAmazon S3にバケットを作成(※)します。このとき、以下の変更点があります。

(※):
「バケットのバージョニング」を「有効にする」ことを忘れないようにしてください。
有効にしない場合はプログラムが動作してもS3バケット内にフォルダを作成することができずエラーとなります。

Please enter alt text.

これで、フルバケット名が以下のS3バケットが作成されます。

lambda-toolapi-test-bucket-<aws_account_id>-<region>-an

2. 『〔手順4-1〕 Amazon S3にPDFファイルをアップロードする』の「6.」~「8.」と同じ手順で、今回使用するS3バケットに入力用PDF[input.pdf]をアップロードします。

〔手順5-2〕 Amazon S3にアクセス可能なタスクロールを作成する

AWS Lambdaにおいてもコンテナ実行時にS3を呼び出すためにタスクロールの作成が必要です。AWS IAM上で必要なロールを作成します。

1. 『〔手順4-2〕 Amazon S3にアクセス可能なタスクロールを作成する』の「1.」~「3.」と同じ操作でロール作成画面を開きます。

2. 以下の設定を選び、「次へ」を押します。

Please enter alt text.

3. 『〔手順4-2〕 Amazon S3にアクセス可能なタスクロールを作成する』の「5.」と同様に許可ポリシー「AmazonS3FullAccess(※)」を追加し、「次へ」を押します。

(※):
今回はテストのために全アクセス権限許可のポリシーを付与しています。
実業務でS3を扱う場合は用途に応じて適切にポリシーを管理してください。

Please enter alt text.

4. ロール名を記入し、「ロールを作成」を選択します。(本例ではlambda-toolapi-s3-test-taskrole)

Please enter alt text.

さらに、以下の手順で作成したロールのARNを取得します。ARNは『〔手順5-5〕 AWS Lambda上でコンテナを実行する』にて利用します。

5. 画面左のナビゲーションペインから「ロール」を選択します。

6. 作成したロールを選択します。(本例ではlambda-toolapi-s3-test-taskrole)

Please enter alt text.

7. 開いたタスクロールのページの「ARN」に書いてある値が目的の値です。

Please enter alt text.

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

Lambda関数の入ったDockerコンテナを作成します。コンテナには透かしの挿入処理、S3上のファイルを扱う処理を記述します。

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

【entrypoint.shの内容】

#!/bin/bash
set -eu

aws s3 cp
"s3://lambda-toolapi-test-bucket-<aws_account_id>-<region>-an/input.pdf" \
"/tmp/input.pdf"

AHPDFToolCmd80 -setTextWatermark -text textWaterMark -font -name IPAGothic -d /tmp/input.pdf -o /tmp/out_textWatermark.pdf

aws s3 cp /tmp/out_textWatermark.pdf s3://lambda-toolapi-test-bucket-<aws_account_id>-<region>-an/output_only/

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

【Dockerfile】

FROM public.ecr.aws/lambda/python:3.12
RUN dnf install -y unzip

COPY AHPDFToolLib80-8.0-MR5.x86_64.rpm /tmp/
RUN rpm -i /tmp/AHPDFToolLib80-8.0-MR5.x86_64.rpm

#AWS インストール
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" \
-o "${LAMBDA_TASK_ROOT}/awscliv2.zip" && \
unzip ${LAMBDA_TASK_ROOT}/awscliv2.zip -d ${LAMBDA_TASK_ROOT} && \
${LAMBDA_TASK_ROOT}/aws/install

# ライセンスファイル[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 PTL80_LIC_PATH="${PTL80_LICENSE_FOLDER}"
ENV PTL80_FONT_CONFIGFILE="${PTL80_ETC_FOLDER}/font-config.xml"
ENV PTL80_ICCPROFILE_PATH="${PTL80_ICC_FOLDER}"
ENV LD_LIBRARY_PATH="${PTL80_LIB_FOLDER}"
# PATH 追加
ENV PATH="${PATH}:${PTL80_BIN_FOLDER}"

#Tool API用フォントファイルの追加
WORKDIR /usr/AHPDFToolLib80/fonts
COPY ipag.ttf /usr/AHPDFToolLib80/fonts
RUN chmod -R 755 /usr/AHPDFToolLib80/fonts/.

# 実行用ファイル追加
WORKDIR /tmp/
COPY lambda_function.py ${LAMBDA_TASK_ROOT}
# その他の実行用ファイル追加
COPY entrypoint.sh ${LAMBDA_TASK_ROOT}
RUN chmod -R 755 ${LAMBDA_TASK_ROOT}/.
RUN chmod -R 755 /tmp/.
CMD [ "lambda_function.handler" ]

3. 『〔手順1-1〕 Dockerコンテナの作成』の「6.」と同じ手順でDockerコンテナをビルドします。

docker buildx build -t lambda-toolapi-s3-test .

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

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

1.『〔手順2-2〕 AWS ECR上へコンテナをpushする』の「1.」~「5.」の手順と同じ手順でコンテナをpushします。
イメージ名・リポジトリ名の変更を反映したLinuxコンソール実行コマンドは以下の通りです。

aws login
aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
aws ecr create-repository --repository-name lambda-toolapi-s3-test-repo --region <region>
docker tag lambda-toolapi-s3-test <aws_account_id>.dkr.ecr.<region>.amazonaws.com/lambda-toolapi-s3-test-repo
docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/lambda-toolapi-s3-test-repo

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

AWS LambdaでAWS ECRからコンテナイメージを呼び出して実行します。
本項ではLinuxコンソール上でAWS CLIコマンドを利用してLambda関数を作成し、Lambda関数を呼び出して実行します。

1. 以下の設定を反映したLambda関数を作成します。
本例ではLinuxコンソール上からAWS CLIのコマンドを利用して関数を作成します。

(※)
実行時にLambda関数がタイムアウトする場合はさらに長い時間を設定してください。

【Lambda関数作成コマンド】

aws lambda create-function \
--function-name lambda-toolapi-s3-test-function \
--package-type Image \
--code ImageUri=<aws_account_id>.dkr.ecr.<region>.amazonaws.com/lambda-toolapi-s3-test-repo:latest \
--role arn:aws:iam::<aws_account_id>:role/lambda-toolapi-s3-test-taskrole \
--timeout 45

コマンドを実行すると、作られたLambda関数が持つステータスが表示されます。
Please enter alt text.

「Q」キーを押すことでコンソールに復帰します。

2. Linuxコンソールから以下のコマンドを実行し、Lambda関数を実行します。

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

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

Please enter alt text.

3. 『〔手順4-5〕 AWS Fargate上でコンテナを実行する』の「4.」~「5.」と同じ手順でS3バケットにアクセスし、出力後PDFを取得します。

ダウンロードしたPDFを確認すると、「textWaterMark」という文字透かしが入っています。

Please enter alt text.