概要
Lambdaでは、Python標準ライブラリとAWS SDK for Pythonしか使用できません。
また、Lambda上ではpipによる外部ライブラリのインストールもできません。
そのため、必要なライブラリは自分で調達してくる必要があります。
ここでは、外部ライブラリの調達と設定方法について解説します。
手段
Lambdaでは外部ライブラリを配置できる場所が2つあります。
- Lambdaレイヤー
- Lambda関数ごとのコード置き場(フォルダ/ファイル構成)
配置場所はどちらでもよいのですが、枯れた技術(アップデートの頻度が少ないモジュールや外部ライブラリ)はLambdaレイヤー配置するのが、一般的な作法なようです1。
今回はLambdaレイヤーに外部ライブラリを配置する方法を取ります。
外部ライブラリを取得する
外部ライブラリは公開先からダウンロードしてよいですが、pip install -t
でローカルに落としてしまうのが手っ取り早いです。
AWS環境で完結させるなら、外部ライブラリ調達用にCloud9を1つ作成し、以下を順番に実施すればOKです。
以下、python-joseの最新バージョンをインストールしています。
mkdir lib & cd lib # このフォルダ名は何でもOKです
mkdir python & cd python # Lambdaレイヤーに必要なpythonフォルダの作成
pip install python-jose -t .
Collecting python-jose
Downloading python_jose-3.3.0-py2.py3-none-any.whl (33 kB)
Collecting rsa
Downloading rsa-4.9-py3-none-any.whl (34 kB)
Collecting pyasn1
Downloading pyasn1-0.5.1-py2.py3-none-any.whl (84 kB)
|████████████████████████████████| 84 kB 3.0 MB/s
Collecting ecdsa!=0.15
Downloading ecdsa-0.18.0-py2.py3-none-any.whl (142 kB)
|████████████████████████████████| 142 kB 14.6 MB/s
Collecting six>=1.9.0
Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: six, pyasn1, rsa, ecdsa, python-jose
Successfully installed ecdsa-0.18.0 pyasn1-0.5.1 python-jose-3.3.0 rsa-4.9 six-1.16.0
フォルダ階層はlib/python
としていますが、lib
の部分は他の名前でもOKです。
python
はLambdaレイヤーにアップロードするフォルダ名称と必須なので、ここは変えないようにしてください。
今回インストールしたpython-joseでは、アップデートにより依存関係が変わっています(筆者の場合、v3.1.0->v3.3.0でecdsaが新たに追加)。
公開先からインストールすると依存関係は含まれない場合があるので、依存関係を含むようにpip install
するのが簡単かと思います。
外部ライブラリを固める
インストールした外部ライブラリをzipで固めます。
cd ../ # libフォルダへ移動
zip -r python-jose.zip python
作成したpython-jose.zip
をダウンロードします。
Lambdaレイヤーへのアップロード
再度にダウンロードしたzipファイルを、レイヤーにアップロードすればOKです。
Lambdaレイヤーでは特に注意すべきポイントはないですが、互換性のあるランタイムをきちんと設定しておくことで、レイヤーと互換性のあるラインタイムLambda関数でレイヤーを追加する場合にカスタムレイヤーで表示されます。
上記のカスタムレイヤーのドロップダウンボタンから、レイヤーを簡単に選択できます。
まとめ
AWS LambdaでPythonの外部ライブラリを設定する方法をご紹介しました。
個人的には外部ライブラリはLambdaレイヤーに配置する方針が良いと思いますが、1つのLambda関数につき追加できるLambdaレイヤーの最大数は5個までの制限があります。
その場合はコード側に置いたり、複数の外部ライブラリをまとめたりしておきましょう。
-
確かAWS DevDay2023の講演で聞きました。ただし、Lambdaライブラリは最大5個の制限があるので、ご注意ください。 ↩