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

ここまでの例はDockerコンテナを実行させることに焦点を絞ったものでした。そのため、コンテナ内の処理内容は簡素なものです。しかし実際には、コンテナ実行はAWSのサービスと組み合わせることでさらに多様な用途への応用が可能です。

本章では、Fargateによるコンテナ処理と「Amazon S3」を組み合わせた以下の処理の実現方法を解説します。

  1. Amazon S3にアップロード済みのPDFファイルをコンテナ内に取得する
  2. 取得したPDFファイルをコンテナ内のPDF Tool APIで処理する
  3. 処理後のPDFファイルをAmazon S3にアップロードする

コンテナ実行時に「Amazon S3」にアクセスするためには、タスクロール(※先述)でS3にアクセスする権限を付与する必要があります。ここではその手順も含めて解説します。

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

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

1. 入力ファイル[input.pdf]を用意します。

2. 以下のURLにアクセスし、Amazon S3を開きます。

https://console.aws.amazon.com/s3/

3. 画面左にある左のナビゲーションペインから「汎用バケット」を選択します。

4. ナビゲーションバーでS3バケットを作成するリージョン(※)を選択してください。

(※):
S3に作るバケットは『〔手順4-4〕 AWS ECR上へコンテナをpushする』のリージョンと同一のものにする必要があります。

5. 「バケットを作成」を選択してください。

Please enter alt text.

6. 以下の設定をした後、「バケットを作成」を選択します。

本例のフルバケット名は以下の値となります。

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

(※1):
名前空間を「グローバル」にすることもできます。しかしその場合は、そのリージョンで唯一無二の名前をつける必要があります。そのため、特別な理由が無い限りは「アカウントのリージョナル名前空間」にする方が無難です。

(※2):
バケット内でフォルダを作る場合は必須です。
例えば、入力PDF用フォルダと出力PDF用フォルダを分けることができます。

7. 画面左にある左のナビゲーションペインから「汎用バケット」を選択し、先ほど作成したバケットの「オブジェクト」タブを選択します。

8. 「アップロード」を選択し、[input.pdf]を選択してAmazon S3にアップロードします。
Please enter alt text.

これでS3へのアップロードが完了しました。

9. 「S3 URI」を取得するために、アップロードが完了した「input.pdf」を選択します。
このとき「S3 URI」は「プロパティ」タブに表示されます。この値を用いて、[input.pdf]を指定することになります。

Please enter alt text.

例えば、今回のS3 URIは以下の値になります。

s3://fargate-toolapi-test-bucket-<aws_account_id>-<region>-an/input.pdf

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

タスクロールにするために、「Amazon S3」へのアクセス権限を付与したAmazon ECS用のロールが必要です。AWS IAM上で必要なロールを作成します。

1. 以下のURLにアクセスし、「AWS IAM」管理画面を開きます。

https://console.aws.amazon.com/iam/

2. IAMコンソール左側にあるナビゲーションペインから「ロール」を選択します。

3. 「ロールを作成」を選択します。

Please enter alt text.

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

Please enter alt text.

5. 以下の手順でロールにポリシーを追加し、「次へ」を押します。

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

Please enter alt text.

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

Please enter alt text.

これでS3の操作権限を付与した、タスクロールに指定可能なロールの作成が完了しました。

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

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

(※)
今回は商用利用可能な「IPAGothic」をフォントファイルとして使用します。
以下のURLから取得可能です。
https://moji.or.jp/ipafont/ipa00303/

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

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

【entrypoint.shの内容】

#!/bin/bash
set -eu

aws s3 cp s3://fargate-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://fargate-toolapi-test-bucket-<aws_account_id>-<region>-an/output_only/

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

【Dockerfileの内容】

FROM public.ecr.aws/amazonlinux/amazonlinux:2023

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 CLIのインストール
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" \
-o "/tmp/awscliv2.zip" && \
unzip /tmp/awscliv2.zip -d /tmp && \
/tmp/aws/install

# ライセンスファイル[ptalic.dat] をコピー
COPY ptalic.dat /usr/AHPDFToolLib80/License

# ============================
# 環境変数の設定(正しい書式)
# ============================
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

# 実行用ファイル追加
COPY entrypoint.sh /tmp/entrypoint.sh
RUN chmod -R 755 /tmp/entrypoint.sh
ENTRYPOINT ["/tmp/entrypoint.sh"]

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

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

〔手順4-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 fargate-toolapi-s3-test-repo --region <region>
docker tag fargate-toolapi-s3-test <aws_account_id>.dkr.ecr.<region>.amazonaws.com/fargate-toolapi-s3-test-repo
docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/fargate-toolapi-s3-test-repo

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

AWS ECRにあるコンテナをAWS Fargate上で実行します。実行に成功するとAmazon S3上に出力PDFがアップロードされます。

1. 『〔手順2-3〕 AWS Fargate上でコンテナを実行する』の「1.」~「7.」と同じ手順でAWS ECSにアクセスし、クラスターを作成します。
このとき、以下の変更点があります。

2. 『〔手順2-3〕 AWS Fargate上でコンテナを実行する』の「8.」~「10.」と同じ手順でタスク定義を作成します。
このとき、以下の変更点があります。

Please enter alt text.

3. 『〔手順2-3〕 AWS Fargate上でコンテナを実行する』の「11.」~「13.」と同じ手順でタスクを実行します。
このとき、以下の変更点があります。

4. 実行後、『〔手順4-1〕 Amazon S3にPDFファイルをアップロードする』で作成したAmazon S3バケットにアクセスします。

5. [output_only/]フォルダが作成されていますので、選択します。これはコンテナによって作成された出力ファイル用フォルダです。
フォルダ内の[out_textWatermark.pdf]を選択してダウンロードします。

Please enter alt text.

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

Please enter alt text.