Lambdaレイヤーの作り方

AWS
AWS
この記事は約4分で読めます。

注意点

  • LambdaはAmazon Linux(2含む)上で稼働するため、Amazon Linux上でレイヤー用のZipファイルを作成した方が安全
  • Lambdaのランタイム(言語)ごとに設定されたPATH変数に合わせて、Zipファイル内のフォルダ構造を定義する

amazon/aws-sam-cli-build-imageのDockerイメージを利用してレイヤー用のZipファイルを作成する

上記Dockerイメージは、AWS SAMで提供されているイメージです。
以下では、Pythonのレイヤーを作成します。
まず、レイヤーを作成する作業用ディレクトリに移動します。

mkdir layer
cd layer

そして、レイヤーにしたいパッケージを requirements.txt に記述します。

touch requirements.txt
requests

AWS SAMで提供されているイメージを利用して、パッケージをインストールします。
作成したいLambda関数のランタイムと同じイメージを選択します。
これにより、Lambda関数利用時にレイヤーが原因の予期せぬエラーに悩まされることはほぼなくなると思われます。
*パッケージによっては、インストール時のPythonのバージョンやOSなどでパッケージの内容が異なる場合があるため、実行するLambdaの環境と同様のDockerイメージなどでレイヤーを作成した方が好ましい。

docker run -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.9" \
/bin/sh -c "pip install -r requirements.txt -t python/lib/python3.9/site-packages/; exit"

カレントディレクトリに python/lib/python3.9/site-packages/ ができたので、それをZipファイルにします。

zip -r layer.zip python > /dev/null

ツリー形式で表示すると、以下のようになります。

layer
├── layer.zip
├── python
│   └── lib
│       └── python3.9
│           └── site-packages(このフォルダ配下にパッケージあり)
└── requirements.txt

Lambdaランタイムのレイヤーパス python/lib/python3.9(3.8なら3.8)/site-packages の構造になっていることがわかります。

レイヤーの作成

今回はコンソールから作成します。
layer.zipをアップロードします。

Lambda関数の実行

レイヤーを使用するLambda関数を、Python3.9でデフォルトで作成します。

まずは、レイヤーを適用しない状態でLambdaを実行してみます。

import requests

def lambda_handler(event, context):
    
    res = requests.get("https://aws.amazon.com/jp/")
    print(res)

想定通り、以下のエラーが発生しました。

Unable to import module 'lambda_function': No module named 'requests'

次に、Lambda関数にレイヤーを適用してみます。

再度Lambdaを実行すると、エラーなく成功しました。

参考

Lambda レイヤーの作成と共有 - AWS Lambda
組織内またはパブリックにコードを共有するための Lambda レイヤーを作成します。レイヤーには、ライブラリ、カスタムランタイム、またはその他の依存関係を含めることができます。
Docker でシミュレートされた環境を使用して Lambda レイヤーを作成する
タイトルとURLをコピーしました