Lambda レイヤー は、補助的なコードやデータを含む .zip ファイルアーカイブです。レイヤーには通常、ライブラリの依存関係、カスタムランタイム、または設定ファイルが含まれています。レイヤーの作成には、次の 3 つの一般的な手順が含まれます。
-
レイヤーコンテンツのパッケージ化。これは、関数で使用する依存関係を含む .zip ファイルアーカイブを作成することを意味します。
-
Lambda でレイヤーを作成します。
-
レイヤーを関数に追加します。
このトピックには、外部ライブラリの依存関係を持つ Ruby Lambda レイヤーを適切にパッケージ化して作成する方法に関する手順とガイダンスが含まれています。
前提条件
このセクションの手順を完了するには、次の事項が必要です。
-
Ruby 3.3
は、 gem
パッケージインストーラで配布されます。
このトピック全体では、awsdocs GitHub リポジトリの「layer-ruby
layer-ruby
サンプルアプリケーションで、tzinfo
layer/
ディレクトリには、レイヤーを生成するスクリプトが含まれています。function/
ディレクトリには、レイヤーが動作するテストを支援するサンプル関数が含まれています。このチュートリアルの大部分では、このレイヤーを作成してパッケージ化する方法について説明します。
Ruby レイヤーの Lambda ランタイム環境との互換性
Ruby レイヤーでコードをパッケージ化する場合は、コードと互換性のある Lambda ランタイム環境を指定します。ランタイムとのコードの互換性を評価するには、Ruby のバージョン、オペレーティングシステム、およびコードが設計されている命令セットアーキテクチャを考慮します。
Lambda Ruby ランタイムでは、Ruby のバージョンとオペレーティングシステムが指定されます。このドキュメントでは、AL2023 に基づく Ruby 3.3 ランタイムを使用します。ランタイムのバージョンの詳細については、「ランタイムのサポート」を参照してください。Lambda 関数を作成するときに、命令セットアーキテクチャを指定します。このドキュメントでは、x86_64
アーキテクチャを使用します。Lambda のアーキテクチャの詳細については、「Lambda 関数の命令セットアーキテクチャの選択と設定」を参照してください。
パッケージで提供されるコードを使用する場合、各パッケージ管理者は互換性を個別に定義します。ほとんどの gem は Ruby で完全に記述され、互換性のある Ruby 言語バージョンを使用する任意のランタイムと互換性があります。
gem は、拡張と呼ばれる Ruby 機能を使用してコードをコンパイルしたり、プリコンパイルされたコードをインストールプロセスの一部として含めたりすることがあります。ネイティブ拡張機能を持つ gem に依存する場合は、オペレーティングシステムと命令セットアーキテクチャの互換性を評価する必要があります。gem と Ruby ランタイムの互換性を評価するには、gem とそのドキュメントを検査する必要があります。extensions
が Gem 仕様で定義されているかどうかを確認することで、gem が拡張機能を使用しているかどうかを特定できます。Ruby は、RUBY_PLATFORM
グローバル定数を通じて実行されているプラットフォームを識別します。Lambda Ruby ランタイムは、arm64
アーキテクチャで実行する場合は aarch64-linux
として、または x86_64
アーキテクチャで実行する場合は x86_64-linux
としてプラットフォームを定義します。Gem がこれらのプラットフォームと互換性があるかどうかを確認する保証はありませんが、platform
Gem 仕様属性を介してサポートされているプラットフォームを宣言する Gem もあります。
Ruby ランタイムのレイヤーパス
関数にレイヤーを追加すると、Lambda はレイヤーのコンテンツをその実行環境の /opt
ディレクトリに読み込みます。Lambda ランタイムごとに、PATH
変数には /opt
ディレクトリ内の特定のフォルダパスがあらかじめ含まれます。Lambda がレイヤーコンテンツを取得できるようにするには、レイヤーの .zip ファイルの依存関係が次のフォルダパスにある必要があります。
-
ruby/gems/
では、x はx
3.3.0
などのランタイムの Ruby バージョンです。 -
ruby/lib/
このドキュメントでは、ruby/gems/
パスを使用します。Lambda は、このディレクトリの内容が Bundler インストールディレクトリの構造に対応することを期待します。gem 依存関係は、他のメタデータサブディレクトリとともに、レイヤーパスの x
/gems
サブディレクトリに保存します。例えば、このチュートリアルで作成するレイヤーの .zip ファイルは、次のディレクトリ構造になっています。
layer_content.zip
└ ruby
└ gems
└ 3.3.0
└ gems
└ tzinfo-2.0.6
└ <other_dependencies> (i.e. dependencies of the tzinfo package)
└ ...
└ <metadata generated by bundle>
「tzinfo
」ライブラリは ruby/gems/3.3.0/
ディレクトリに正しく配置されています。これにより、Lambda は関数の呼び出し中にライブラリを見つけられるようになります。
レイヤーコンテンツのパッケージ化
この例では、Ruby tzinfo
ライブラリをレイヤーの .zip ファイルにパッケージ化します。レイヤーコンテンツをインストールしてパッケージ化するには、次の手順を実行します。
レイヤーコンテンツをインストールしてパッケージ化する方法
-
sample-apps/layer-ruby
ディレクトリで必要なサンプルコードを含む「aws-lambda-developer-guide
GitHub リポジトリ」を複製します。 git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
-
layer-ruby
サンプルアプリのlayer
ディレクトリに移動します。このディレクトリには、レイヤーを適切に作成してパッケージ化するために使用するスクリプトが含まれています。cd aws-lambda-developer-guide/sample-apps/layer-ruby/layer
-
Gemfile
を調べます。このファイルは、レイヤー (つまり tzinfo
ライブラリ) に含める依存関係を定義します。このファイルを更新し、独自のレイヤーに含める依存関係を含めることができます。例 Gemfile
source "https://rubygems.org" gem "tzinfo"
-
両方のスクリプトを実行する許可があることを確認してください。
chmod 744 1-install.sh && chmod 744 2-package.sh
-
次のコマンドを使用して「
1-install.sh
」スクリプトを実行します。 ./1-install.sh
このスクリプトは、プロジェクトディレクトリに依存関係をインストールするようにバンドルを設定します。次に、必要な依存関係をすべて
vendor/bundle/
ディレクトリにインストールします。例 1-install.sh
bundle config set --local path 'vendor/bundle' bundle install
-
次のコマンドを使用して「
2-package.sh
」スクリプトを実行します。 ./2-package.sh
このスクリプトは、
vendor/bundle
ディレクトリからruby
という名前の新しいディレクトリに内容をコピーします。次に、ruby
ディレクトリの内容をlayer_content.zip
という名前のファイルに圧縮します。これはレイヤーの .zip ファイルです。ファイルを解凍し、Ruby ランタイムのレイヤーパス セクションで示されている正しいファイル構造が含まれていることを確認できます。例 2-package.sh
mkdir -p ruby/gems/3.3.0 cp -r vendor/bundle/ruby/3.3.0/* ruby/gems/3.3.0/ zip -r layer_content.zip ruby
レイヤーを作成する
このセクションでは、前のセクションで生成した「layer_content.zip
」ファイルを取得し、Lambda レイヤーとしてアップロードします。AWS Command Line Interface (AWS CLI) を介して AWS Management Consoleまたは Lambda API を使用してレイヤーをアップロードできます。レイヤーの .zip ファイルをアップロードするとき、次の「PublishLayerVersion」 AWS CLI コマンドで ruby3.3
を互換性のあるランタイムとして指定し、arm64
を互換性のあるアーキテクチャとして指定します。
aws lambda publish-layer-version --layer-name ruby-requests-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes ruby3.3 \ --compatible-architectures "arm64"
レスポンスでは、arn:aws:lambda:us-east-1:
に似ている 123456789012
:layer:ruby-requests-layer:1LayerVersionArn
に注目してください。この Amazon リソースネーム (ARN) は、このチュートリアルの次の手順で、レイヤーを関数に追加するときに必要になります。
レイヤーを関数に追加する
このセクションでは、関数コードで tzinfo
ライブラリを使用するサンプル Lambda 関数をデプロイし、Layer をアタッチします。関数をデプロイするには、実行ロールを使用した Lambda 関数のアクセス許可の定義 が必要です。既存の実行ロールをお持ちでない場合、折りたたみ可能なセクションの手順を実行してください。
実行ロールを作成する
-
IAM コンソールの [ロールページ
] を開きます。 -
[ロールの作成] を選択します。
-
次のプロパティでロールを作成します。
-
信頼されたエンティティ – Lambda。
-
アクセス許可 – AWSLambdaBasicExecutionRole。
-
ロール名 –
lambda-role
。
AWSLambdaBasicExecutionRole ポリシーには、ログを CloudWatch Logs に書き込むために関数が必要とするアクセス許可があります。
-
Lambda 関数コードtzinfo
ライブラリをインポートし、ステータスコードとローカライズされた日付文字列を返します。
require 'json'
require 'tzinfo'
def lambda_handler(event:, context:)
tz = TZInfo::Timezone.get('America/New_York')
{ statusCode: 200, body: tz.to_local(Time.utc(2018, 2, 1, 12, 30, 0)) }
end
Lambda 関数をデプロイする方法
-
function/
ディレクトリに移動します。現在、layer/
ディレクトリにいる場合、次のコマンドを実行します。cd ../function
-
次のコマンドを使用し、.zip ファイルのデプロイパッケージを作成します。
zip my_deployment_package.zip lambda_function.rb
-
関数をデプロイします。次の AWS CLI コマンドで、
--role
パラメータを実行ロール ARN に置き換えます。aws lambda create-function --function-name ruby_function_with_layer \ --runtime ruby3.3 \ --architectures "arm64" \ --handler lambda_function.lambda_handler \ --role
arn:aws:iam::
\ --zip-file fileb://my_deployment_package.zip123456789012
:role/lambda-role -
次に、レイヤーを関数にアタッチします。次の AWS CLI コマンドで、
--layers
パラメーターを先にメモしたレイヤーバージョン ARN に置き換えます。aws lambda update-function-configuration --function-name ruby_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "
arn:aws:lambda:us-east-1:
"123456789012
:layer:ruby-requests-layer:1 -
最後に、次の AWS CLI コマンドを使用して関数の呼び出しを試みます。
aws lambda invoke --function-name ruby_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{ "key": "value" }' response.json
次のような出力が表示されます。
{ "StatusCode": 200, "ExecutedVersion": "$LATEST" }
出力
response.json
ファイルには、レスポンスに関する詳細が含まれています。
このチュートリアル用に作成したリソースは、保持しない場合は削除できます。使用しなくなった AWS リソースを削除することで、AWS アカウント アカウントに請求される料金の発生を防ぎます。
Lambda レイヤーを削除する方法
-
Lambda コンソールの [Layers (レイヤー)] ページ
を開きます。 -
作成したレイヤーを選択します。
-
[削除] を選択したら、[削除] を再度選択します。
Lambda 関数を削除するには
-
Lambda コンソールの関数
ページを開きます。 -
作成した関数を選択します。
-
[アクション] で、[削除] を選択します。
-
テキスト入力フィールドに
confirm
と入力し、[Delete] (削除) を選択します。