Docker でシミュレートされた Lambda 環境を使用して、Lambda レイヤーを作成する方法を教えてください。
最終更新日: 2021 年 10 月 11 日
ターゲット環境のランタイムと互換性のある AWS Lambda レイヤーを作成したいと考えています。どうすればできますか?
簡単な説明
Lambda 関数を開発する場合、サポートされている Lambda ランタイムバージョンの中から、いずれかを選択する必要があります。特定のランタイムと互換性のある Lambda 関数と Layers を作成するには、次のいずれかを実行します。
- AWS Serverless Application Model (AWS SAM) を使用して、新しいリソースを自動的に作成します。
- または - - AWS SAM の基盤となる amazon/aws-sam-cli-build-image の Docker イメージを使って作成します。
詳細については、「Lambda Layer の作成と共有」を参照してください。
解決方法
注: AWS Command Line Interface (AWS CLI) コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
以下の説明では、Python をコーディング言語として使用し、Linux ベースのコンピュータープラットフォームを例として使用しています。他の言語とプラットフォームに関しては、必要に応じて各ステップを変更します。
コンピューターに Docker をインストールする
インストールが完了していない場合は、Linux、Windows、または 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.6 を 3.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.6 を 3.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 デプロイパッケージを作成します 。