Amazon Linux、AWS Lambdaでpdftkをインストール・実行する

AWS,EC2,Lambda,Programming,Python,Shell Script

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