Amazon Linux、AWS Lambdaでpdftkをインストール・実行する
Amazon LinuxはAWSとの親和性が高くAWS EC2上にシステムを構築する際には最適な選択肢です。
しかしAmazon Linuxはpdftk、inkscapeなどCentOSでは使用出来るモジュールでもインストールすることが難しいものがいくつか存在するのも事実です。
これは自分の使いたいモジュールが自由にインストールできないAWS Lambdaでは更にハードルが高くなります。
このような場合は素直にCentOSをEC2で使用するか、Amazon Linux、AWS Lambdaで使用できるようにコンパイルし直すかのどちらかになります。
今回はこのようなモジュールのうちpdftkをAmazon Linux、AWS Lambdaで使用する方法について備忘録として記載したいと思います。
Amazon Linux、AWS Lambdaでpdftkをインストール・実行する
CentOS6でAmazon Linux用pdftkモジュールを作成する
必要なパッケージをインストールし、pdftkのソースをダウンロードし解凍する。
[root@localhost ~]# yum install gcc gcc-java libgcj libgcj-devel gcc-c++ [root@localhost ~]# curl -L -O https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/pdftk-2.02-src.zip [root@localhost ~]# unzip pdftk-2.02-src.zip
解凍したpdftk-2.02-distディレクトリ内にlibgcj.so.10ライブラリを保存するディレクトリを作成し、CentOSからlibgcj.so.10ライブラリをコピーする。
[root@localhost ~]# mkdir -p pdftk-2.02-dist/lib64 [root@localhost ~]# \cp -rf /usr/lib64/libgcj.so.10* ~/pdftk-2.02-dist/lib64/
解凍したpdftk-2.02-distディレクトリ内のpdftkディレクトリでpdftkのバイナリを作成する。
[root@localhost ~]# cd pdftk-2.02-dist/pdftk [root@localhost pdftk]# make -f Makefile.Redhat [root@localhost pdftk]# make -f Makefile.Redhat install
libgcj.so.10ライブラリのコピーとpdftkバイナリが作成されたpdftk-2.02-distをzip圧縮する。
[root@localhost pdftk]# cd ~ [root@localhost ~]# zip -r pdftk-2.02-dist.zip pdftk-2.02-dist
Amazon LinuxでAmazon Linux用pdftkモジュールを解凍し実行する
上記で作成したpdftk-2.02-dist.zipをAmazon Linuxに配置する。
pdftk-2.02-dist.zipを解凍し、libgcj.so.10ライブラリをAmazon Linuxの/usr/lib64/ディレクトリに配置する。
[root@localhost ~]# unzip pdftk-2.02-dist.zip [root@localhost ~]# cp pdftk-2.02-dist/lib64/libgcj.so.10 /usr/lib64/
解凍したpdftk-2.02-distディレクトリ内のpdftkディレクトリでpdftkバイナリファイルをインストール(コピー)する。
[root@localhost ~]# cd pdftk-2.02-dist/pdftk/ [root@localhost ~]# make -f Makefile.Redhat install
pdftkコマンドが使用出来るようになっていることを確認。
[root@localhost ~]# pdftk --version
解凍したpdftk-2.02-distディレクトリのライブラリディレクトリとpdftkバイナリを直接指定しても実行できる。
[root@localhost ~]# LD_LIBRARY_PATH=/root/pdftk-2.02-dist/lib64/ /root/pdftk-2.02-dist/pdftk/pdftk --version
AWS LambdaでAmazon Linux用pdftkモジュールを実行するLambda関数モジュールを作成する
AWS Lambdaにアップロードするzipファイルを作成する開発環境で作業を行う。
AWS Lambda用のlambda_pdftkディレクトリを作成する。
[root@localhost ~]# mkdir -p lambda_pdftk
上記で作成したpdftk-2.02-dist.zipを開発環境に配置する。
pdftk-2.02-dist.zipをlambda_pdftkディレクトリに移動させ解凍する。
[root@localhost ~]# mv pdftk-2.02-dist.zip lambda_pdftk/ [root@localhost ~]# cd lambda_pdftk [root@localhost lambda_pdftk]# unzip pdftk-2.02-dist.zip [root@localhost lambda_pdftk]# rm -rf pdftk-2.02-dist.zip
AWS Lambda Pythonで実行するlambda_function.pyを記述する。
[root@localhost lambda_pdftk]# vim lambda_function.py import commands import os print('Loading function') def _(cmd): return commands.getoutput(cmd) def lambda_handler(event, context): print(_("LD_LIBRARY_PATH=./pdftk-2.02-dist/lib64/ ./pdftk-2.02-dist/pdftk/pdftk --version"))
lambda_function.pyが記述できたら権限をAWS Lambdaで実行できるように権限を変更し再度zip圧縮する。
[root@localhost lambda_pdftk]# chmod 777 -R * [root@localhost lambda_pdftk]# zip -r lambda_pdftk.zip *
AWS Lambda Pythonにlambda_pdftk.zipをアップロードし実行する。
Reference: Tech Blog citing related sources