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

最終更新日: 2019 年 12 月 19 日

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

簡単な説明

Lambda 関数を開発する場合、サポートされている Lambda ランタイムバージョンの中から、いずれかを選択する必要があります。lambci/lambda Docker イメージを使用すると、Lambda 環境をライブでシミュレートすることで、指定したランタイムと互換性のあるレイヤーを作成できます。詳細については、Docker ウェブサイトの lambci/lambda をご参照ください。

この lambci/lambda イメージは Lambda 環境の完全なコピーではなく、一部のファイルが欠落している可能性があることにご注意ください。

注: lambci/lambda Docker イメージは、AWS サーバーレスアプリケーション モデル (AWS SAM) において、sam local start-api を実行してサーバーレスアプリケーションをローカルでテストする際にも使用します。

解決方法

注: このチュートリアルでは、例として Python を使用しています。他の言語に関しては、必要に応じて各ステップを変更します。

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

2.    適切なディレクトリ構造を作成し、pip Requirements ファイル (requirements.txt) で依存関係を指定します。詳細については、pip ユーザーガイドの「Requirements Files」をご参照ください。

たとえば、Lambda レイヤーに Python バージョン 3.6 および 3.8 と互換性を持たせる場合、構造は次のようになります。

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

注: 関数とすべてのレイヤーを解凍したときの合計サイズは、解凍後デプロイパッケージのサイズ制限である 250 MB を超えることはできません。

Lambda がサポートする Python バージョンの詳細については、「Python による Lambda 関数のビルド」をご参照ください。

3.    ディレクトリ構造で指定した各ランタイムに対して、次のコマンドをそれぞれ 1 回実行します。これにより、そのランタイムと互換性のあるライブラリが適切なサブフォルダにインストールされます。

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

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

4.    python フォルダを zip 圧縮してレイヤーパッケージを作成します。この .zip ファイルは Lambda 環境の /opt フォルダで圧縮され、Lambda 関数のコードから直接アクセスできるようになります。

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

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

5.    次のコマンドを実行し、レイヤーの作成または更新を行います。先に指定した、互換性のあるランタイムを必ず含めてください。

注: mypythonlibs を前のステップで使用したパッケージ名に置き換えます。My python libs を適切な説明に置き換えます。

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

出力結果を見て、レイヤーの Amazon リソースネーム (ARN) を書き留めておきます。これは、次のステップで必要になります。

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

注: arn:aws:lambda:us-east-2:123456789012:layer:mypythonlibs:1 を、前のステップで書き留めておいた Layer の ARN に置き換えます。

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

(オプション) Lambda パッケージ用に Docker イメージを使用する

レイヤーを作成せずに、Lambda パッケージ用に lambci/lambda Docker イメージを直接使用することもできます。次のコマンドを実行して、依存関係で必要なバージョンを取得します。

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

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

次に 、関数コードと適切なライブラリを含めて Lambda デプロイパッケージを作成します 。