yum for Lambda(yumda)でAWS LambdaのレイヤーにPopplerを入れる
yum for Lambda(yumda)を使って、yum installで入れられるライブラリをLambdaのレイヤーとして導入してみました。これを使うと、LambdaのDockerイメージを使うことなく、日本語対応しつつPopplerのLambdaへの導入が可能になります。
目次
やりたいこと
- AWS Lambdaの中でPDFを読み取って画像化したい
- pdf2imageというPythonライブラリを使えば可能だが、依存ライブラリとしてPopplerが必要
- Amazon Linux 2なら、
yum install poppler-utils
で前提ライブラリをまるっと入れられるが、これをLambdaのレイヤーとして定義する方法がわからない - DockerイメージのLambdaなら一瞬でできてしまうが、管理が面倒になるので(ECR分が課金されてしまう)、Lambdaのレイヤーとして使えればベスト
参考
以下の記事が参考になる。
yumdaの使い方
この記事にあるyumda – yum for Lambdaというライブラリを使うと、
mkdir -p gs-layer
docker run --rm -v "$PWD"/gs-layer:/lambda/opt lambci/yumda:2 yum install -y ghostscript
というように、ローカルでDockerを実行して、yum install
を行い対象のライブラリをマウントしたディレクトリに吐き出してくれるものだ。
pipの場合は、pip install {library_name} -t {target_directory}
のようにインストール先を指定できるが、yum install
の場合はインストール先の指定ができない。そこでyumdaのようなライブラリが便利になる。
実際に使ってみる
yum installの場合
最終コミットが4年前のライブラリで、python3.12のランタイムで動くか半信半疑だったが、以下のようにしてPopplerの必要なバイナリをインストールできた。
docker run --rm -v $(pwd)/layer:/lambda/opt lambci/yumda:2 yum install -y poppler-utils
デプロイの際は、layerフォルダごとZipにかためてLambdaのレイヤーとしてアップロード→アタッチする。ChatGPTに聞くとLambda側でパスの追加が必要などと言われるが、パスを追加しなくても今回は正常に動作した。
apt installで実行した場合
Python3.12のDockerイメージ内でapt install poppeler-utils
を実行したときは、以下のようなメッセージが出て日本語フォントを明示的にインストールされた。
root@ec5121e2b7fa:/source# apt install poppler-utils
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
libnspr4 libnss3 libpoppler126 poppler-data
Suggested packages:
ghostscript fonts-japanese-mincho | fonts-ipafont-mincho fonts-japanese-gothic | fonts-ipafont-gothic
fonts-arphic-ukai fonts-arphic-uming fonts-nanum
The following NEW packages will be installed:
libnspr4 libnss3 libpoppler126 poppler-data poppler-utils
0 upgraded, 5 newly installed, 0 to remove and 35 not upgraded.
Need to get 5089 kB of archives.
After this operation, 23.3 MB of additional disk space will be used.
Get:1 http://deb.debian.org/debian bookworm/main amd64 poppler-data all 0.4.12-1 [1601 kB]
Get:2 http://deb.debian.org/debian bookworm/main amd64 libnspr4 amd64 2:4.35-1 [113 kB]
Get:3 http://deb.debian.org/debian bookworm/main amd64 libnss3 amd64 2:3.87.1-1 [1331 kB]
Get:4 http://deb.debian.org/debian bookworm/main amd64 libpoppler126 amd64 22.12.0-2+b1 [1852 kB]
Get:5 http://deb.debian.org/debian bookworm/main amd64 poppler-utils amd64 22.12.0-2+b1 [192 kB]
Fetched 5089 kB in 0s (40.2 MB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package poppler-data.
(Reading database ... 23958 files and directories currently installed.)
Preparing to unpack .../poppler-data_0.4.12-1_all.deb ...
Unpacking poppler-data (0.4.12-1) ...
Selecting previously unselected package libnspr4:amd64.
Preparing to unpack .../libnspr4_2%3a4.35-1_amd64.deb ...
Unpacking libnspr4:amd64 (2:4.35-1) ...
Selecting previously unselected package libnss3:amd64.
Preparing to unpack .../libnss3_2%3a3.87.1-1_amd64.deb ...
Unpacking libnss3:amd64 (2:3.87.1-1) ...
Selecting previously unselected package libpoppler126:amd64.
Preparing to unpack .../libpoppler126_22.12.0-2+b1_amd64.deb ...
Unpacking libpoppler126:amd64 (22.12.0-2+b1) ...
Selecting previously unselected package poppler-utils.
Preparing to unpack .../poppler-utils_22.12.0-2+b1_amd64.deb ...
Unpacking poppler-utils (22.12.0-2+b1) ...
Setting up poppler-data (0.4.12-1) ...
Setting up libnspr4:amd64 (2:4.35-1) ...
Setting up libnss3:amd64 (2:3.87.1-1) ...
Setting up libpoppler126:amd64 (22.12.0-2+b1) ...
Setting up poppler-utils (22.12.0-2+b1) ...
Processing triggers for libc-bin (2.36-9+deb12u7) ...
Processing triggers for fontconfig (2.14.1-4) ...
デプロイして確認してみる
yumdaでインストールしたときは、インストールメッセージに日本語フォントを入れている気配がなく、本当に日本語フォントが再現されるのか半信半疑だった。しかし、デプロイして確認したら
- Popplerの依存関係のエラーはでなくなった
- PDF→画像の変換結果をS3に吐き出したところ、日本語フォントは正常に再現されているようである
具体例として楽天の領収書を見てみよう。元のPDFは日本語フォントを使ってテキストで書かれている。
これはLambda内でpdf2imageを使い、PDFを画像化したものを一時的にS3に吐き出してダウンロードしたものだ(マスクは後から追加)。
確かにうまくいっているようである。
Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内
技術書コーナー
北海道の駅巡りコーナー