Java Lambda 関数のレイヤーを操作する - AWS Lambda

Java Lambda 関数のレイヤーを操作する

Lambda レイヤー は、補助的なコードやデータを含む .zip ファイルアーカイブです。レイヤーには通常、ライブラリの依存関係、カスタムランタイム、または設定ファイルが含まれています。レイヤーの作成には、次の 3 つの一般的な手順が含まれます。

  1. レイヤーコンテンツのパッケージ化。これは、関数で使用する依存関係を含む .zip ファイルアーカイブを作成することを意味します。

  2. Lambda でレイヤーを作成します。

  3. レイヤーを関数に追加します。

このトピックには、外部ライブラリの依存関係を持つ Java Lambda レイヤーを適切にパッケージ化して作成する方法に関する手順およびガイダンスが含まれています。

前提条件

このセクションの手順を完了するには、次の事項が必要です。

注記

Maven が参照する Java バージョンが、デプロイする関数の Java バージョンと同じであることを確認してください。例えば、Java 21 関数の場合、mvn -v コマンドは出力に Java バージョン 21 をリストする必要があります。

Apache Maven 3.8.6 ... Java version: 21.0.2, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home ...

このトピック全体では、awsdocs GitHub リポジトリの「layer-java」サンプルアプリケーションを参照します。このアプリケーションには、依存関係をダウンロードしてレイヤーを生成するスクリプトが含まれています。アプリケーションには、レイヤーから依存関係を使用する対応の関数も含まれています。レイヤーを作成したら、対応する関数をデプロイして呼び出し、すべてが正しく動作することを確認できます。関数に Java 21 ランタイムを使用するため、レイヤーは Java 21 と互換性がある必要もあります。

layer-java サンプルアプリケーションには、2 つのサブディレクトリ内に 1 つの例が含まれています。layer ディレクトリには、レイヤーの依存関係を定義する pom.xml ファイルに加え、レイヤーを生成するスクリプトが含まれています。function ディレクトリには、レイヤーが動作するテストを支援するサンプル関数が含まれています。このチュートリアルは、このレイヤーを作成してパッケージ化する方法について説明します。

Java レイヤーと Amazon Linux の互換性

レイヤーを作成する最初のステップは、すべてのレイヤーコンテンツを .zip ファイルアーカイブにバンドルすることです。Lambda 関数は Amazon Linux 上で実行されるため、レイヤーコンテンツは Linux 環境でコンパイルおよびビルドできる必要があります。

Java コードはプラットフォームに依存しないように設計されているため、ローカルマシンが Linux 環境を使用しなくてもレイヤーをパッケージ化できます。Lambda に Java レイヤーをアップロードした後も、Amazon Linux との互換性は維持されます。

Java ランタイムのレイヤーパス

関数にレイヤーを追加すると、Lambda はレイヤーのコンテンツをその実行環境の /opt ディレクトリに読み込みます。Lambda ランタイムごとに、PATH 変数には /opt ディレクトリ内の特定のフォルダパスがあらかじめ含まれます。PATH 変数がレイヤーコンテンツを取得できるようにするには、レイヤーの .zip ファイルの依存関係が次のフォルダーパスにある必要があります。

  • java/lib

例えば、このチュートリアルで作成するレイヤーの .zip ファイルは、次のディレクトリ構造になっています。

layer_content.zip └ java └ lib └ layer-java-layer-1.0-SNAPSHOT.jar

layer-java-layer-1.0-SNAPSHOT.jar JAR ファイル (必要な依存関係をすべて含む uber-jar) は、java/lib ディレクトリに正しく配置されています。Lambda は関数の呼び出し中にライブラリを見つけるようになります。

レイヤーコンテンツのパッケージ化

この例では、次の 2 つの Java ライブラリを 1 つの JAR ファイルにパッケージ化します。

  • aws-lambda-java-core」 — AWS Lambda で Java を使用するためのインターフェイス定義の最小限セット

  • Jackson」 — 特に JSON を使用するための一般的なデータ処理ツールのスイート。

レイヤーコンテンツをインストールしてパッケージ化するには、次の手順を実行します。

レイヤーコンテンツをインストールしてパッケージ化する方法
  1. sample-apps/layer-java ディレクトリで必要なサンプルコードを含む「aws-lambda-developer-guide GitHub リポジトリ」を複製します。

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. layer-java サンプルアプリの layer ディレクトリに移動します。このディレクトリには、レイヤーを適切に作成してパッケージ化するために使用するスクリプトが含まれています。

    cd aws-lambda-developer-guide/sample-apps/layer-java/layer
  3. pom.xml ファイルを検証する <dependencies> セクションでは、レイヤーに含める依存関係を定義します(つまり、aws-lambda-java-core および jackson-databind ライブラリ)。このファイルを更新し、独自のレイヤーに含める依存関係を含めることができます。

    例 pom.xml
    <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.17.0</version> </dependency> </dependencies>
    注記

    この pom.xml ファイルの <build> セクションには 2 つのプラグインが含まれています。「maven-compiler-plugin」はソースコードをコンパイルします。「maven-shade-plugin」はアーティファクトを 1 つの uber-jar にパッケージ化します。

  4. 両方のスクリプトを実行する許可があることを確認してください。

    chmod 744 1-install.sh && chmod 744 2-package.sh
  5. 次のコマンドを使用して「1-install.sh」スクリプトを実行します。

    ./1-install.sh

    このスクリプトは現在のディレクトリで mvn clean install を実行します。必要な依存関係をすべて含む uber-jar が target/ ディレクトリに作成されます。

    例 1-install.sh
    mvn clean install
  6. 次のコマンドを使用して「2-package.sh」スクリプトを実行します。

    ./2-package.sh

    このスクリプトは、レイヤーコンテンツを適切にパッケージングするために必要な java/lib ディレクトリ構造を作成します。次に、uber-jar を /target ディレクトリから新しく作成された java/lib ディレクトリにコピーします。最後に、スクリプトは java ディレクトリの内容を layer_content.zip という名前のファイルに圧縮します。これはレイヤーの .zip ファイルです。ファイルを解凍し、Java ランタイムのレイヤーパス セクションで示されている正しいファイル構造が含まれていることを確認できます。

    例 2-package.sh
    mkdir java mkdir java/lib cp -r target/layer-java-layer-1.0-SNAPSHOT.jar java/lib/ zip -r layer_content.zip java

レイヤーを作成する

このセクションでは、前のセクションで生成した「layer_content.zip」ファイルを取得し、Lambda レイヤーとしてアップロードします。AWS Command Line Interface (AWS CLI) を介して AWS Management Consoleまたは Lambda API を使用してレイヤーをアップロードできます。レイヤーの .zip ファイルをアップロードするとき、次の「PublishLayerVersion」 AWS CLI コマンドで java21 を互換性のあるランタイムとして指定し、arm64 を互換性のあるアーキテクチャとして指定します。

aws lambda publish-layer-version --layer-name java-jackson-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes java21 \ --compatible-architectures "arm64"

レスポンスでは、arn:aws:lambda:us-east-1:123456789012:layer:java-jackson-layer:1 に似ている LayerVersionArn に注目してください。この Amazon リソースネーム (ARN) は、このチュートリアルの次の手順で、レイヤーを関数に追加するときに必要になります。

レイヤーを関数に追加する

このセクションでは、関数コードで Jackson ライブラリを使用する Lambda 関数の例をデプロイしたら、レイヤーをアタッチします。関数をデプロイするには、実行ロールを使用した Lambda 関数のアクセス許可の定義 が必要です。既存の実行ロールをお持ちでない場合、折りたたみ可能なセクションの手順を実行してください。

実行ロールを作成する
  1. IAM コンソールの [ロールページ] を開きます。

  2. [ロールの作成] を選択します。

  3. 次のプロパティでロールを作成します。

    • 信頼されたエンティティLambda

    • アクセス許可AWSLambdaBasicExecutionRole

    • ロール名lambda-role

    AWSLambdaBasicExecutionRole ポリシーには、ログを CloudWatch Logs に書き込むために関数が必要とするアクセス許可があります。

Lambda 関数コードMap<String, String> を入力値として取り込み、Jackson を使用して入力値を JSON 文字列として書き込んでから、事前定義された F1Car の Java オブジェクトに変換します。最後に、関数は F1Car オブジェクトのフィールドを使用し、関数が返す文字列を作成します。

package example; import com.amazonaws.services.lambda.runtime.Context; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.Map; public class Handler { public String handleRequest(Map<String, String> input, Context context) throws IOException { // Parse the input JSON ObjectMapper objectMapper = new ObjectMapper(); F1Car f1Car = objectMapper.readValue(objectMapper.writeValueAsString(input), F1Car.class); StringBuilder finalString = new StringBuilder(); finalString.append(f1Car.getDriver()); finalString.append(" is a driver for team "); finalString.append(f1Car.getTeam()); return finalString.toString(); } }
Lambda 関数をデプロイする方法
  1. function/ ディレクトリに移動します。現在、layer/ ディレクトリにいる場合、次のコマンドを実行します。

    cd ../function
  2. 次の Maven コマンドを実行し、プロジェクトをビルドします。

    mvn package

    このコマンドは、layer-java-function-1.0-SNAPSHOT.jar という名前の target/ ディレクトリの JAR ファイルを生成します。

  3. 関数をデプロイします。次の AWS CLI コマンドで、--role パラメータを実行ロール ARN に置き換えます。

    aws lambda create-function --function-name java_function_with_layer \ --runtime java21 \ --architectures "arm64" \ --handler example.Handler::handleRequest \ --timeout 30 \ --role arn:aws:iam::123456789012:role/lambda-role \ --zip-file fileb://target/layer-java-function-1.0-SNAPSHOT.jar
  4. 次に、レイヤーを関数にアタッチします。次の AWS CLI コマンドで、--layers パラメーターを先にメモしたレイヤーバージョン ARN に置き換えます。

    aws lambda update-function-configuration --function-name java_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "arn:aws:lambda:us-east-1:123456789012:layer:java-jackson-layer:1"
  5. 最後に、次の AWS CLI コマンドを使用して関数の呼び出しを試みます。

    aws lambda invoke --function-name java_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{ "driver": "Max Verstappen", "team": "Red Bull" }' response.json

    次のような出力が表示されます。

    { "StatusCode": 200, "ExecutedVersion": "$LATEST" }

    関数が Jackson の依存関係を使用し、関数を適切に実行できたことを示しています。出力 response.json ファイルに返された正しい文字列が含まれていることを確認できます。

    "Max Verstappen is a driver for team Red Bull"

このチュートリアル用に作成したリソースは、保持しない場合は削除できます。使用しなくなった AWS リソースを削除することで、AWS アカウント アカウントに請求される料金の発生を防ぎます。

Lambda レイヤーを削除する方法
  1. Lambda コンソールの [Layers (レイヤー)] ページを開きます。

  2. 作成したレイヤーを選択します。

  3. [削除] を選択したら、[削除] を再度選択します。

Lambda 関数を削除するには
  1. Lambda コンソールの関数ページを開きます。

  2. 作成した関数を選択します。

  3. [アクション] で、[削除] を選択します。

  4. テキスト入力フィールドに delete と入力し、[Delete] (削除) を選択します。