環境のランタイムと互換性のある AWS Lambda 層を、Amazon Elastic Container Registry (Amazon ECR) イメージと Docker を使用して作成したいと考えています。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。次の解決策では、Python と Linux を使用しています。手順は、他のコーディング言語やオペレーティングシステム (OS) では異なる場合があります。
前提条件: コンピュータに Docker がインストールされていること。インストール手順については、Docker Docs のウェブサイトで「Docker の取得」および「Docker エンジンのインストール」を参照してください (Linux のみ)。
ディレクトリ構造を作成し、依存関係を指定する
ディレクトリ構造を作成し、pip 要件ファイル requirements.txt で依存関係を指定します。依存関係を指定する方法の詳細については、pip のウェブサイトで「要件ファイル」を参照してください。
次のディレクトリ構造例は、Python 3.x と互換性のある Lambda レイヤーを対象としています。
my-layer/
├── requirements.txt
└── python/
注: 関数とすべてのレイヤーを解凍した後の合計サイズは、未圧縮デプロイパッケージのサイズ制限である 250 MB を超えることはできません。Lambda での Python バージョンのサポートに関する詳細については、「Python を使用して Lambda 関数をビルドする」を参照してください。
ライブラリの依存関係をサブフォルダにインストールする
ディレクトリ構造で指定したランタイムごとに、次のコマンドを 1 回実行します。
docker run -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.x" /bin/sh -c "pip install -r requirements.txt -t python/; exit"
注: 3.x をインストールする、互換性のある Python ライブラリに置き換えてください。
レイヤーの .zip ファイルアーカイブを作成する
python フォルダを圧縮し、レイヤーのパッケージを作成するには、次のコマンドを実行します。
zip -r mypythonlibs.zip python > /dev/null
注: mypythonlibs をレイヤーパッケージの名前に置き換えてください。
レイヤーを作成、更新する
次の AWS CLI コマンド publish-layer-version を実行します。
aws lambda publish-layer-version --layer-name mypythonlibs --description "My python libs" --zip-file fileb://mypythonlibs.zip --compatible-runtimes "python3.x"
注: mypythonlibs をレイヤーパッケージ名に、My python libs をレイヤーパッケージの説明に、python3.x をインストールした Python ライブラリに置き換えてください。
出力を参照し、レイヤーの Amazon リソースネーム (ARN) を書き留めます。
Lambda 関数の構成を更新し、レイヤーを使用する設定を行う
次の update-function-configuration コマンドを実行します。
aws lambda update-function-configuration --layers arn:aws:lambda:us-east-2:123456789012:layer:mypythonlibs:1 --function-name my-function
注: arn:aws:lambda:us-east-2:123456789012:layer:mypythonlibs:1 をレイヤーの ARN に、my-function を関数名に置き換えてください。上記のコマンドは、Lambda 環境内の /opt フォルダにレイヤーを配置します。/opt フォルダには、Lambda 関数のコードからアクセスできます。
関連情報
Python (Boto3) Lambda 関数が返すエラー "unknown service"、"parameter validation failed"、 の解決方法を教えてください"object has no attribute"
AWS Lambda の更新情報 - 任意のプログラミング言語で共通のコンポーネントを共有できます
Amazon ECR Public Gallery