Docker でシミュレートされた Lambda 環境を使用して、Lambda レイヤーを作成する方法を教えてください。

最終更新日: 2021 年 10 月 11 日

ターゲット環境のランタイムと互換性のある AWS Lambda レイヤーを作成したいと考えています。どうすればできますか?

簡単な説明

Lambda 関数を開発する場合、サポートされている Lambda ランタイムバージョンの中から、いずれかを選択する必要があります。特定のランタイムと互換性のある Lambda 関数と Layers を作成するには、次のいずれかを実行します。

詳細については、「Lambda Layer の作成と共有」を参照してください。

解決方法

注: AWS Command Line Interface (AWS CLI) コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

以下の説明では、Python をコーディング言語として使用し、Linux ベースのコンピュータープラットフォームを例として使用しています。他の言語とプラットフォームに関しては、必要に応じて各ステップを変更します。

コンピューターに Docker をインストールする

インストールが完了していない場合は、LinuxWindows、または macOS 用のいずれかの Docker をコンピュータにインストールします。

適切なディレクトリ構造を作成し、pip Requirements ファイル (requirements.txt) で依存関係を指定します。

ディレクトリ構造の作成の詳細については、「レイヤーへのライブラリの依存関係の追加」をご参照ください。依存関係の指定の詳細については、pip ユーザーガイドの「要件ファイル」を参照してください。

Python バージョン 3.6 および 3.8 と互換性がある Lambda レイヤーのディレクトリ構造の例

├── requirements.txt
└── python/
    └── lib/
        ├── python3.6/
        │   └── site-packages/
        └── python3.8/
            └── site-packages/

注: 関数とすべてのレイヤーを解凍したときの合計サイズは、解凍後デプロイパッケージのサイズ制限である 250 MB を超えることはできません。Lambda がサポートする Python バージョンの詳細については、Python による Lambda 関数のビルドをご参照ください。

ディレクトリ構造で指定したランタイムに基づいて、ライブラリの依存関係を適切なサブフォルダにインストールします。

ディレクトリ構造で指定した各ランタイムに対して、次のコマンドをそれぞれ 1 回実行します。

重要: インストールするライブラリの互換性に応じ、3.63.7 または 3.8 に置き換えます。

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

レイヤーの .zip ファイルアーカイブの作成

次のコマンドを実行して Python フォルダを zip に圧縮し、レイヤパッケージを作成します。

注: mypythonlibs を、必要に応じ任意の名前に置き換えます。

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

.zip ファイルは、Lambda 環境の /opt フォルダーで圧縮されます。/opt フォルダーには、Lambda 関数コードからアクセスできます。

レイヤーを作成または更新する

次のコマンドを実行して、Lambda レイヤーを作成または更新します。

重要:先に指定した、互換性のあるランタイムを含めてください。mypythonlibs を前のステップで使用したパッケージ名に置き換えます。My python libs を適切な説明に置き換えます。

aws lambda publish-layer-version --layer-name mypythonlibs --description "My python libs" --zip-file fileb://mypythonlibs.zip --compatible-runtimes "python3.6" "python3.8"

出力を確認し、レイヤーの Amazon リソースネーム (ARN) をコピーします。次のステップを完了するには、レイヤーの ARN が必要です。

このコマンドで、レイヤーを使用するように Lambda 関数の設定が更新されます。

次のコマンドを実行して、レイヤーを使用するように Lambda 関数設定を更新します。

重要: arn:aws:lambda:us-east-2:123456789012:layer:mypythonlibs:1 を、レイヤーの ARN に置き換えます。

aws lambda update-function-configuration --layers arn:aws:lambda:us-east-2:123456789012:layer:mypythonlibs:1 --function-name my-function

(オプション) AWS SAM ファイルの代わりに Lambda パッケージの Docker イメージを使用するには

AWS SAM ファイルを使用する代わりに、 amazon/aws-sam-cli-build-image Docker イメージを使用して Lambda パッケージを作成することもできます。Docker イメージを使用すると、レイヤーを作成せずにパッケージを作成できます。

1.    次のコマンドを実行して、依存関係で必要なバージョンを取得します。

重要: インストールするライブラリの互換性に応じ、3.63.7 または 3.8 に置き換えます。

docker run -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.6" /bin/sh -c "pip install -r requirements.txt -t libs; exit"

2.    関数コードと適切なライブラリを含む Lambda デプロイパッケージを作成します 。