Lambda レイヤーの作成手順

概要

Lambda レイヤーのデプロイパッケージの作成後の基本的な Lambda レイヤーの作成手順をまとめました。
サンプルとしてこちらの記事で作成した Lambda レイヤーを使用します。

Lamda レイヤーについて

Lambda レイヤーの作成と共有 - AWS Lambda

ライブラリの依存関係をレイヤーに含める
Lambda ランタイムごとに、PATH 変数に /opt ディレクトリ内の特定のフォルダが含まれます。レイヤー .zip ファイルアーカイブに同じフォルダ構造を定義すると、関数コードはパスを指定しなくても、レイヤーコンテンツにアクセスできます。

上記の記述のように、Lambda レイヤーにアップロードする zip ファイルアーカイブに特定のディレクトリにライブラリなどの依存関係を含めておくだけで、パスを指定しなくてもそれを利用することができます。
Lambda レイヤーを使用すると、他の Lambda 関数とのコードの共有と責任の分離ができます。
個人的には、ちょっとでもデプロイパッケージが大きいと、Lmabda のコンソールでコードを修正できなくなるので、外部ライブラリを使用する時点で他の Lambda 関数と共有する・しない関係なく Lambda レイヤー化しています。

Lambda レイヤーの作成手順 ( AWS マネジメントコンソール編 )

Lambda レイヤーの作成

Lambda コンソールのナビゲーションから「レイヤー」を選択して、「レイヤー」ページを開き、「レイヤーの作成」を選択します。

Lambdaコンソール

Lambda レイヤーの 名前と「互換性のあるランタイム - オプション」を入力、「デプロイパッケージ」のアップロードを行います。
「互換性のあるランタイム - オプション」は複数選択可能で、この Lambda レイヤーを利用する予定の Lambda 関数のランタイムを選択します。ここで選択したランタイムを使用している Lambda 関数に対して、Lambda レイヤーを追加することができます。
デプロイパッケージ ( .zip ファイル ) をアップロードします。

画面に明記されているように、デプロイパッケージ ( .zip ファイル ) のサイズが 10 MB を超える場合は、Amazon S3 経由でアップロードするのを推奨しているようです。

Lambda 関数に指定可能なカスタムランタイムは、2021/12/20 時点では「Amazon Linux 1」と「Amazon Linux 2」の 2 種類が選択できます。
しかし、2021/12/20 時点では AWS マネジメントコンソールを使用して、Lambda レイヤーを作成する際に、「互換性のあるランタイム - オプション」で「カスタムランタイム」という選択肢しかありませんでした。
この「カスタムランタイム」とは「Amazon Linux 1」を指しており、「Amazon Linux 2」は選択できませんでした。
一方で、AWS CLI で Lambda レイヤーを作成する際は、「Amazon Linux 2」を選択可能です。
そのため、ランタイム環境が「Amazon Linux 2」の Lambda 関数で使用する Lambda レイヤーを使用したい場合は、AWS CLI で Lambda レイヤーを作成してください。

Lambdaレイヤー作成

Amazon S3 を使用したアップロードを行う場合は、Amazon S3 に アップロードしたデプロイパッケージ ( .zip ファイル ) のオブジェクト URL を入力します。

S3の場合

Lambda 関数に Lambda レイヤーを追加

対象の Lambda 関数のコンソールの「コード」タブを選択し、「レイヤーの追加」を選択します。

レイヤーの追加

「レイヤーソース」としてカスタムレイヤーを選択し、追加する Lambda レイヤーとバージョンを選択し、「追加」を選択します。

レイヤーの追加中

追加が完了です。

レイヤー追加完了

Lambda レイヤーの作成手順 ( AWS CLI 編 )

Lambda レイヤーの作成・更新

Lambda レイヤーを作成または更新する場合は、publish-layer-version コマンドを使用します。

ランタイム環境「Amazon Linux 2」を対象とした Lambda レイヤーを作成したい場合は、--compatible-runtimes オプションで provided.al2 を指定してください。

なお、デプロイパッケージ (.zip ファイルアーカイブ) のサイズ上限は 50 MB です。
デプロイパッケージ (.zip ファイルアーカイブ) が 50 MB 以下であれば、publish-layer-version コマンドで直接アップロードできます。
50 MB を超える場合は、一旦 S3 にアップロードして、格納した場所を publish-layer-version コマンドで指定します。

直接アップロードする場合
Copied!
aws lambda publish-layer-version --layer-name jq_layer \
  --zip-file fileb://jq_layer.zip \
  --compatible-runtimes provided
S3 経由の場合
Copied!
aws s3 cp jq_layer.zip s3://<バケット名>
aws lambda publish-layer-version --layer-name jq_layer \
  --content S3Bucket=<バケット名>,S3Key=jq_layer.zip \
  --compatible-runtimes provided

Lambda 関数を新規に作成する際に Lambda レイヤーを追加する

Lambda 関数を作成する create-function コマンドの --layer オプションに追加したい Lambda レイヤーの ARN を指定します。

直接アップロードする場合
Copied!
aws lambda create-function --function-name sample_function \
  --handler function.handler \
  --runtime provided \
  --role arn:aws:iam::xxxxxxxxxxxxxxxxxx:role/lambda-role \
  --zip-file fileb://function.zip \
  --layers arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxxxxxxxx::layer:jq_layer:1
S3 経由の場合
Copied!
aws s3 cp jq_layer.zip s3://<バケット名>
aws lambda create-function --function-name sample_function \
  --handler function.handler \
  --runtime provided \
  --role arn:aws:iam::xxxxxxxxxxxxxxxxxx:role/lambda-role \
  --content S3Bucket=<バケット名>,S3Key=jq_layer.zip \
  --layers arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxxxxxxxx::layer:jq_layer:1

作成済みの Lmabda 関数に Lambda レイヤーを追加する

作成済みの Lambda 関数の設定を更新する update-function-configuration コマンドの --layer オプションに追加したい Lambda レイヤーの ARN を指定します。

Copied!
aws lambda update-function-configuration --function-name sample_function-runtime \
  --layers arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxxxxxxxx::layer:jq_layer:1

Lambda 関数を直接実行する

Copied!
aws lambda invoke --function-name bash-runtime --payload '{"text":"Hello"}' response.txt