この記事では、yumでインストールできるソフトウェアをAWS Lambdaの環境で使うための方法を解説しています。
この記事で分からない点は @ts_3156 までお気軽にご質問ください。
AWS Lambdaの環境構築
AWS Lambdaの環境には最小限のソフトウェアしかインストールされていません。例えば、less
やcurl
も最初はないです。
そのため、使いたいソフトウェアがある場合は、そのソフトウェアを所定のディレクトリにインストールしておき、AWS Lambdaの環境に読み込み専用でマウントする必要があります。
この記事では、yumでインストールできるソフトウェアを例に、AWS Lambdaの環境にソフトウェアをインストールする方法を解説しています。
この記事で対象とするOSはAmazon Linux 2です。Python、Ruby、nodejsのいずれであっても、最新バージョンはAmazon Linux 2の環境で動かす必要があります。
AWS lambdaレイヤー
AWS lambdaでは、追加でインストールしたソフトウェアをレイヤーという仕組みでAWS Lambdaにマウントします。レイヤーは実行可能ファイルと依存関係をひとまとめにしたzipファイルです。
zipに入れたファイルは、AWS Lambdaの/opt
にマウントされます。zipに/bin
というディレクトリを入れることで、AWS Lambdaには/opt/bin
というパスでマウントされます。
yumでパッケージをインストールすると、/bin
だけでなく/etc
、/lib
、/share
というディレクトリも作成されます。zipファイルにはこれらのディレクトリも入れる必要があります。
yumda – yum for Lambda を使う
1番簡単でおすすめの方法です。
yumのインストール先を/lambda
に変更したAmazon Linux 2をdockerで起動し、インストールしたディレクトリだけをzipに圧縮します。さらに、そのzipからレイヤーを作ることで、yumでインストールしたソフトウェアをAWS Lambdaの環境で使えるようになります。
この方法の良い点は、インストールしたソフトウェアが依存しているソフトウェアも全てzipに含まれる点です。
# インストールできるパッケージの一覧を確認する
docker run --rm lambci/yumda:2 yum list available
# ImageMagickをyumでインストールする
docker run --rm -v "$PWD"/im-layer:/lambda/opt lambci/yumda:2 yum install -y ImageMagick
# ImageMagickがインストールされたレイヤーを作成する
cd im-layer
zip -yr ../im-layer.zip .
cd ..
aws lambda publish-layer-version --layer-name im-layer --zip-file fileb://im-layer.zip --description "ImageMagick Layer"
# インタラクティブなシェルで動作確認をする
docker run -it --rm -v "$PWD"/im-layer:/lambda/opt lambci/yumda:2 /bin/bash
# インストールしたImageMagickの動作確認をする
LD_LIBRARY_PATH=/lambda/opt/lib /lambda/opt/bin/convert --version
ImageMagick for AWS Lambda を使う
GitHub ImageMagick for AWS Lambda
ImageMagickを使いたいだけなら、AWS Lambdaにそのままデプロイできるスクリプトがあります。ボタンをクリックしていくだけでデプロイできますが、このImageMagickは必要最小限の構成でビルドされているため、使いたいフォーマットがある場合は自分でコンパイルする必要があります。
コンパイルするオプション等はリポジトリのMakefileを見れば分かります。また、ImageMagickの他にもrsvg-convertなどもクリックだけでデプロイできるようになっています。
必要なパッケージを自分で集めてzipにする
AWS Lambda デプロイパッケージで Amazon Linux AMI ネイティブバイナリパッケージを使用する方法
特におすすめではないですが、公式ドキュメントに書いてある方法です。
yumdownloader
やrpmdev-extract
を使って、必要なパッケージの中身を1つずつコピーすることになります。この記事には、コマンドだけ書いておきます。
yumdownloader
は依存しているパッケージまで含めないため、依存しているパッケージも集めるにはさらにrepotrack
も必要になります。
# yumdownloaderをインストールする
sudo yum install -y yum-utils rpmdevtools
# パッケージの中身を展開する
cd /tmp
yumdownloader unixODBC.x86_64 freetds.x86_64 libtool-ltdl.x86_64 gnutls.x86_64
rpmdev-extract *rpm
# 必要なファイルをコピーする
sudo mkdir -p /var/task
sudo chown ec2-user:ec2-user /var/task
cd /var/task
/bin/cp /tmp/*/usr/lib64/* /var/task
# zipファイルを作成する
cd /var/task
zip -r9 /tmp/MyCodeWithLibraries.zip *