AWS Lambdaレイヤーを外部ライブラリと自作ライブラリをまとめて作成する

2024.04.12

はじめに

AWS Lambda のレイヤーを作成する際、自作のライブラリと外部ライブラリを 1 つのレイヤーにまとめたかったので試してみます。今回は初めて Lambda レイヤーを試したい場合にも分かりやすいように、AWS コンソールを使った手順で作成します。

やってみる

レイヤーは zip ファイル化したものを Lambda 上で実行できますが、Windows 環境等でビルドするとうまく動作しない可能性があるので Cloud9 を使って実行してみます。問題ない場合は必ずしも Cloud9 を使う必要はありません。適宜EC2やdocker上で作成してください。

レイヤーを作成する最初のステップは、すべてのレイヤーコンテンツを .zip ファイルアーカイブにバンドルすることです。Lambda 関数は Amazon Linux 上で実行されるため、レイヤーコンテンツは Linux 環境でコンパイルおよびビルドできる必要があります。ローカルの Windows または Mac マシンでパッケージをビルドすると、デフォルトでそのオペレーティングシステム用の出力バイナリが取得されます。これらのバイナリは、Lambda にアップロードされたときに正しく機能しない場合があります。 レイヤーコンテンツが Linux 環境で適切に動作するようにするために、AWS Cloud9 を使用してレイヤーコンテンツを作成することをお勧めします。

参考:レイヤーコンテンツのパッケージング - AWS Lambda

今回は pandas と適当な自作した関数を Lambda から呼び出せるか確認します。

Cloud9の立ち上げ

AWS コンソールから Cloud9 を開いて環境の作成をクリックします。

名前は任意のものを入れて、他はデフォルトのまま作成しましょう。作成が完了したら Cloud9 を開きます。

Cloud9 の画面が開けたら OK です。

ターミナルで以下のコマンドを実行して必要な環境をセットアップします。

# 必要なモジュールをインストール。
sudo yum -y install bzip2-devel xz-devel
# Python環境管理ツール pyenv を Git からインストール。
git clone https://github.com/pyenv/pyenv.git ~/.pyenv

# pyenvのパスを通す
echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc

# .bashrcの修正を反映
source ~/.bashrc

# pyenv のバージョンを確認
pyenv --version

# インストール可能なPython3.12のバージョンを確認(バージョンはLambdaで使用するラインタイムと合わせてください。)
pyenv install --list | grep 3.12

# 最新のPython3.12.3をインストール
pyenv install 3.12.3

# Python3.12.3を使用
pyenv global 3.12.3

# Pythonのバージョンを確認
python -V

レイヤー用のzipファイル作成

レイヤーは python フォルダ配下を読み取るので、python フォルダを作成しその中にライブラリを追加していきます。フォルダを作成しないとレイヤー化した後importできないので注意しましょう。

# pythonフォルダ作成
mkdir python
cd python

# pandasをpythonフォルダ直下にインストール
pip install pandas -t .

python フォルダ内を確認すると、依存関係を持ったライブラリも含めてインストールされています。

他に追加したいライブラリがあれば同じように追加しましょう。

今回は自作した関数も含めたいので、python フォルダ内に以下のファイルを作成しました。

/python/sample.py

def hello():
    print("Hello World")

pandas と依存関係があるライブラリと、作成した自作の sample.py が python フォルダ内に作成されている状態です。

最後に Python フォルダを zip ファイルに圧縮します。

cd ../
zip -r python.zip python

zip ファイルが作成されるので、右クリックでダウンロードします。

ここまでで Cloud9 の作業は完了なので、不要であれば削除しておきましょう。

Lambdaレイヤーの作成

Lambda のコンソールを開き、左のナビゲーションバーからレイヤーを選択します。

レイヤー画面が開いたら「レイヤーの作成」から作成しましょう。

レイヤー名と先ほどダウンロードした zip ファイルのアップロード、ランタイムを選択します。今回 Lambda のランタイムは 3.12 を使用します。

レイヤーが作成できたら、追加したい Lambda のコンソール一番下からレイヤーを追加しましょう。

カスタムレイヤーを選択し、先ほど作成したレイヤーとバージョンを選択します。

テスト

それではレイヤーから呼び出せるか確認してみます。

Lambda のコードは以下のようにしました。

import sample
import pandas

def lambda_handler(event, context):
    print("===自作した関数をレイヤーから呼び出し===")
    print(sample.hello())
    print("=========================================")
    
    print("===pandasをレイヤーから呼び出し===")
    df = pandas.DataFrame({
    '名前' :['田中', '山田', '鈴木'],
    '身長' : [170, 171, 172]
    })
    print(df)
    print("=========================================")

sample.pyからhello関数の呼び出しとpandasが使えるかを確認しています。

テストを実行すると、問題なくレイヤーから呼び出せることが確認できました。

まとめ

1つのレイヤーを外部ライブラリと自作ライブラリ合わせてコンソールから作成してみました。

今回は1つのレイヤーにまとめましたが、管理上分けた方がいい場合もあります。1つのLambdaには5つまでレイヤーを追加できるので適宜調整してみてください。

Lambdaレイヤーを試してみたい場合の参考になれば幸いです。

参考