コンテナイメージを使用した Java Lambda 関数のデプロイ - AWS Lambda

コンテナイメージを使用した Java Lambda 関数のデプロイ

Java Lambda 関数のコンテナイメージを構築するには 3 つの方法があります。

ヒント

Lambda コンテナ関数がアクティブになるまでの時間を短縮するには、「Docker ドキュメント」の「マルチステージビルドを使用する」を参照してください。効率的なコンテナイメージを構築するには、「Dockerfiles を記述するためのベストプラクティス」に従ってください。

このページでは、Lambda のコンテナイメージを構築、テスト、デプロイする方法について説明します。

Java の AWS ベースイメージ

AWS は、Java の次のベースイメージを提供します。

タグ ランタイム オペレーティングシステム Dockerfile 廃止

21

Java 21 Amazon Linux 2023 GitHub の Java 21 用の Dockerfile

スケジュールされていません

17

Java 17 Amazon Linux 2 GitHub の Java 17 用の Dockerfile

スケジュールされていません

11

Java 11 Amazon Linux 2 GitHub の Java 11 用の Dockerfile

スケジュールされていません

8.al2

Java 8 Amazon Linux 2 GitHub の Java 8 用の Dockerfile

スケジュールされていません

Amazon ECR リポジトリ: gallery.ecr.aws/lambda/java

Java 21 以降のベースイメージは、Amazon Linux 2023 の最小コンテナイメージに基づいています。以前のベースイメージでは Amazon Linux 2 が使用されています。AL2023 ランタイムには、デプロイのフットプリントが小さいことや、glibc などのライブラリのバージョンが更新されていることなど、Amazon Linux 2 に比べていくつかの利点があります。

AL2023 ベースのイメージでは、Amazon Linux 2 のデフォルトのパッケージマネージャである yum の代わりに microdnf (dnf としてシンボリックリンク) がパッケージマネージャとして使用されています。microdnfdnf のスタンドアロン実装です。AL2023 ベースのイメージに含まれるパッケージのリストについては、「Comparing packages installed on Amazon Linux 2023 Container Images」の「Minimal Container」列を参照してください。AL2023 と Amazon Linux 2 の違いの詳細については、AWS コンピューティングブログの「Introducing the Amazon Linux 2023 runtime for AWS Lambda」を参照してください。

注記

AWS Serverless Application Model (AWS SAM) を含む AL2023 ベースのイメージをローカルで実行するには、Docker バージョン 20.10.10 以降を使用する必要があります。

Java の AWS ベースイメージを使用する

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

Maven
  1. 次のコマンドを実行し、「Lambda のアーキタイプ」を使用して Maven プロジェクトを作成します。以下のパラメータは必須です。

    • サービス — Lambda 関数の使用対象となる AWS のサービス クライアント。利用可能なソースのリストについては、GitHub の「aws-sdk-java-v2/services」をご覧ください。

    • region – Lambda 関数を作成する AWS リージョン。

    • groupId — アプリケーションの完全パッケージの名前空間。

    • artifactId — ユーザーのプロジェクト名。これがプロジェクトのディレクトリの名前になります。

    Linux および macOS では、次のコマンドを実行します。

    mvn -B archetype:generate \ -DarchetypeGroupId=software.amazon.awssdk \ -DarchetypeArtifactId=archetype-lambda -Dservice=s3 -Dregion=US_WEST_2 \ -DgroupId=com.example.myapp \ -DartifactId=myapp

    PowerShell で、次のコマンドを実行します。

    mvn -B archetype:generate ` "-DarchetypeGroupId=software.amazon.awssdk" ` "-DarchetypeArtifactId=archetype-lambda" "-Dservice=s3" "-Dregion=US_WEST_2" ` "-DgroupId=com.example.myapp" ` "-DartifactId=myapp"

    Lambda の Maven アーキタイプは、Java SE 8 でコンパイルするように事前設定されており、AWS SDK for Java への依存関係を含みます。別のアーキタイプまたは別の方法でプロジェクトを作成する場合、Maven の Java コンパイラを設定し、SDK を依存関係として宣言する必要があります。

  2. myapp/src/main/java/com/example/myapp ディレクトリを開いて App.java ファイルを探します。これは Lambda 関数のコードです。提供されるサンプルコードをテストに使用することも、独自のサンプルコードで置き換えることもできます。

  3. プロジェクトのルートディレクトリに戻り、次の設定で新しい Dockerfile を作成します。

    • FROM プロパティにベースイメージの URI を設定します。

    • CMD 引数を Lambda 関数ハンドラーに設定します。

    この例の Dockerfile には USER 命令が含まれていないことに注意してください。コンテナイメージを Lambda にデプロイすると、最小特権のアクセス許可を付与したデフォルトの Linux ユーザーを Lambda が自動的に定義します。これは標準の Docker 動作とは異なります。標準の動作とは、USER 命令を指定しなかったときに root ユーザーのデフォルトとなる動作のことです。

    例 Dockerfile
    FROM public.ecr.aws/lambda/java:21 # Copy function code and runtime dependencies from Maven layout COPY target/classes ${LAMBDA_TASK_ROOT} COPY target/dependency/* ${LAMBDA_TASK_ROOT}/lib/ # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "com.example.myapp.App::handleRequest" ]
  4. プロジェクトをコンパイルしてランタイムの依存関係を収集します。

    mvn compile dependency:copy-dependencies -DincludeScope=runtime
  5. Docker イメージを「Docker の構築」コマンドで構築します。次の例では、イメージを docker-image と名付けて test タグを付けます。

    docker build --platform linux/amd64 -t docker-image:test .
    注記

    このコマンドは、ビルドマシンのアーキテクチャに関係なく、コンテナが Lambda の実行環境と互換性があることを確認する --platform linux/amd64 オプションを特定します。ARM64 命令セットアーキテクチャを使用して Lambda 関数を作成する場合は、代わりに --platform linux/arm64 オプションを使用するようにコマンドを変更してください。

Gradle
  1. プロジェクト用のディレクトリを作成し、そのディレクトリに切り替えます。

    mkdir example cd example
  2. 次のコマンドを実行して、Gradle が 環境の example ディレクトリに新しい Java アプリケーションプロジェクトを生成するようにします。[ビルドスクリプト DSL を選択] では、[2: Groovy] を選択します。

    gradle init --type java-application
  3. /example/app/src/main/java/example ディレクトリを開いて App.java ファイルを探します。これは Lambda 関数のコードです。次のサンプルコードをテストに使用することも、独自のサンプルコードで置き換えることもできます。

    例 App.java
    package com.example; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; public class App implements RequestHandler<Object, String> { public String handleRequest(Object input, Context context) { return "Hello world!"; } }
  4. build.gradle ファイルを開きます。前のステップのサンプル関数コードを使用している場合、「build.gradle」の内容を次の内容で置き換えてください。独自の関数コードを使用している場合、必要に応じて「build.gradle」ファイルを変更してください。

    例 build.gradle (Groovy DSL)
    plugins { id 'java' } group 'com.example' version '1.0-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { implementation 'com.amazonaws:aws-lambda-java-core:1.2.1' } jar { manifest { attributes 'Main-Class': 'com.example.App' } }
  5. また。ステップ 2 の gradle init コマンドが app/test ディレクトリにダミーのテストケースを生成しました。このチュートリアルの用途のため、/test ディレクトリを削除してテスト実行をスキップします。

  6. プロジェクトをビルドします。

    gradle build
  7. プロジェクトのルートディレクトリ (/example) に、次の設定で Dockerfile を作成します。

    • FROM プロパティを「ベースイメージの URI」に設定します。

    • COPY コマンドを使用し、関数コードおよびランタイムの依存関係を {LAMBDA_TASK_ROOT} (Lambda 定義の環境変数) にコピーします。

    • CMD 引数を Lambda 関数ハンドラーに設定します。

    この例の Dockerfile には USER 命令が含まれていないことに注意してください。コンテナイメージを Lambda にデプロイすると、最小特権のアクセス許可を付与したデフォルトの Linux ユーザーを Lambda が自動的に定義します。これは標準の Docker 動作とは異なります。標準の動作とは、USER 命令を指定しなかったときに root ユーザーのデフォルトとなる動作のことです。

    例 Dockerfile
    FROM public.ecr.aws/lambda/java:21 # Copy function code and runtime dependencies from Gradle layout COPY app/build/classes/java/main ${LAMBDA_TASK_ROOT} # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "com.example.App::handleRequest" ]
  8. Docker イメージを「Docker の構築」コマンドで構築します。次の例では、イメージを docker-image と名付けて test タグを付けます。

    docker build --platform linux/amd64 -t docker-image:test .
    注記

    このコマンドは、ビルドマシンのアーキテクチャに関係なく、コンテナが Lambda の実行環境と互換性があることを確認する --platform linux/amd64 オプションを特定します。ARM64 命令セットアーキテクチャを使用して Lambda 関数を作成する場合は、代わりに --platform linux/arm64 オプションを使用するようにコマンドを変更してください。

  1. docker run コマンドを使用して、Docker イメージを起動します。この例では、docker-image はイメージ名、test はタグです。

    docker run --platform linux/amd64 -p 9000:8080 docker-image:test

    このコマンドはイメージをコンテナとして実行し、localhost:9000/2015-03-31/functions/function/invocations でローカルエンドポイントを作成します。

    注記

    ARM64 命令セットアーキテクチャ用に Docker イメージをビルドした場合は、--platform linux/amd64 の代わりに --platform linux/arm64 オプションを使用してください。

  2. 新しいターミナルウィンドウから、イベントをローカルエンドポイントにポストします。

    Linux/macOS

    Linux および macOS では、次の curl コマンドを実行します。

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

    このコマンドは、空のイベントで関数を呼び出し、応答を返します。サンプル関数コードではなく独自の関数コードを使用している場合は、JSON ペイロードを使用して関数を呼び出すことをお勧めします。例:

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
    PowerShell

    PowerShell で次の Invoke-WebRequest コマンドを実行します。

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"

    このコマンドは、空のイベントで関数を呼び出し、応答を返します。サンプル関数コードではなく独自の関数コードを使用している場合は、JSON ペイロードを使用して関数を呼び出すことをお勧めします。例:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
  3. コンテナ ID を取得します。

    docker ps
  4. docker kill」コマンドを使用してコンテナを停止します。このコマンドでは、3766c4ab331c を前のステップのコンテナ ID で置き換えます。

    docker kill 3766c4ab331c
Amazon ECR にイメージをアップロードして Lambda 関数を作成するには
  1. get-login-password」コマンドを実行して Amazon ECR レジストリに Docker CLI を認証します。

    • --region 値を Amazon ECR リポジトリを作成する AWS リージョン に設定します。

    • 111122223333 を AWS アカウント ID に置き換えます。

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
  2. create-repository」コマンドを使用して Amazon ECR にリポジトリを作成します。

    aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
    注記

    Amazon ECR リポジトリは Lambda 関数と同じ AWS リージョン に配置されている必要があります。

    成功すると、次のようなレスポンスが表示されます。

    { "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } }
  3. 前のステップの出力から repositoryUri をコピーします。

  4. docker tag」コマンドを実行して、最新バージョンとしてローカルイメージを Amazon ECR リポジトリにタグ付けします。このコマンドで:

    • docker-image:test は、Docker イメージの名前とタグです。これは、docker build コマンドに指定したイメージの名前とタグです。

    • <ECRrepositoryUri> を、コピーした repositoryUri に置き換えます。URI の末尾には必ず :latest を含めてください。

    docker tag docker-image:test <ECRrepositoryUri>:latest

    例:

    docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  5. docker push」コマンドを実行して Amazon ECR リポジトリにローカルイメージをデプロイします リポジトリ URI の末尾には必ず :latest を含めてください。

    docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  6. まだ作成済みでない場合、関数に「実行ロールの作成」を実行してください。次のステップではロールの Amazon リソースネーム (ARN) が必要です。

  7. Lambda 関数を作成します。ImageUri には、先ほど使用したリポジトリ URI を指定します。URI の末尾には必ず :latest を含めてください。

    aws lambda create-function \ --function-name hello-world \ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --role arn:aws:iam::111122223333:role/lambda-ex
    注記

    イメージが Lambda 関数と同じリージョンに配置されていれば、別の AWS アカウントのイメージを使用して関数を作成することができます。詳細については、「 Amazon ECR クロスアカウント許可」を参照してください。

  8. 関数を呼び出します。

    aws lambda invoke --function-name hello-world response.json

    次のような結果が表示されます。

    { "ExecutedVersion": "$LATEST", "StatusCode": 200 }
  9. 関数の出力を確認するには、response.json ファイルをチェックします。

関数コードを更新するには、イメージを再構築し、新しいイメージを Amazon ECR リポジトリにアップロードしてから、update-function-code コマンドを使用してイメージを Lambda 関数にデプロイする必要があります。

Lambda は、イメージタグを特定のイメージダイジェストに解決します。これは、関数のデプロイに使用されたイメージタグを Amazon ECR 内の新しいイメージを指すように変更しても、Lambda は新しいイメージを使用するように自動的に関数を更新しないことを意味します。

新しいイメージを同じ Lambda 関数にデプロイするには、Amazon ECR のイメージタグが同じままであっても、update-function-code コマンドを使用する必要があります。次の例では、--publish オプションが最新のコンテナイメージを使用して関数の新しいバージョンを作成しています。

aws lambda update-function-code \ --function-name hello-world \ --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --publish

ランタイムインターフェイスクライアントで代替ベースイメージを使用する

OS 専用ベースイメージまたは代替のベースイメージを使用する場合、イメージにランタイムインターフェイスクライアントを含める必要があります。ランタイムインターフェイスクライアントは、Lambda と関数コード間の相互作用を管理する カスタムランタイムに Lambda ランタイム API を使用する を拡張します。

Java 用のランタイムインターフェイスクライアントを Dockerfile にインストールするか、プロジェクトの依存関係としてインストールします。たとえば、Maven パッケージマネージャーを使用してランタイムインターフェイスクライアントをインストールするには、pom.xml ファイルに以下を追加します。

<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-runtime-interface-client</artifactId> <version>2.3.2</version> </dependency>

パッケージの詳細については、「Maven Central Repository」の「AWS Lambda Java ランタイムのインターフェイスクライアント」を参照してください。GitHub リポジトリの AWS Lambda Java Support Libraries で、ランタイムインターフェイスクライアントのソースコードを確認することもできます。

次の例は、Amazon Corretto イメージを使用して Java 用のコンテナイメージを構築する方法を示しています。Amazon Corretto は、Open Java Development Kit (OpenJDK) の、マルチプラットフォーム対応の本番稼働可能な、無償ディストリビューションです。Maven プロジェクトには、ランタイムインターフェイスクライアントが依存関係として含まれています。

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

  1. Maven プロジェクトの作成 以下のパラメータは必須です。

    • groupId — アプリケーションの完全パッケージの名前空間。

    • artifactId — ユーザーのプロジェクト名。これがプロジェクトのディレクトリの名前になります。

    Linux/macOS
    mvn -B archetype:generate \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DgroupId=example \ -DartifactId=myapp \ -DinteractiveMode=false
    PowerShell
    mvn -B archetype:generate ` -DarchetypeArtifactId=maven-archetype-quickstart ` -DgroupId=example ` -DartifactId=myapp ` -DinteractiveMode=false
  2. プロジェクトディレクトリを開きます。

    cd myapp
  3. pom.xml ファイルを開き、内容を次に置き換えます。このファイルには、aws-lambda-java-runtime-interface-client が依存関係として含まれています。代わりに、ランタイムインターフェイスクライアントを Dockerfile にインストールすることもできます。ただし、最も簡単な方法は、ライブラリを依存関係として含めることです。

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>example</groupId> <artifactId>hello-lambda</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>hello-lambda</name> <url>http://maven.apache.org</url> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-runtime-interface-client</artifactId> <version>2.3.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.1.2</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
  4. myapp/src/main/java/com/example/myapp ディレクトリを開いて App.java ファイルを探します。これは Lambda 関数のコードです。このコードを、次のコードで置き換えます。

    例 関数ハンドラ
    package example; public class App { public static String sayHello() { return "Hello world!"; } }
  5. ステップ 1 の mvn -B archetype:generate コマンドにより、ダミーのテストケースも src/test ディレクトリに生成されます。このチュートリアルでは、この生成された /test ディレクトリ全体を削除して、実行中のテストをスキップします。

  6. プロジェクトのルートディレクトリに戻り、新しい Dockerfile を作成します。次の Dockerfile の例では、Amazon Corretto イメージを使用しています。Amazon Corretto は、マルチプラットフォーム対応で本番稼働可能な OpenJDK の無償ディストリビューションです。

    • ベースイメージの URI に FROM プロパティを設定します。

    • ENTRYPOINT を、Docker コンテナの起動時に実行させるモジュールに設定します。この場合、モジュールはランタイムインターフェイスクライアントです。

    • CMD 引数を Lambda 関数ハンドラーに設定します。

    この例の Dockerfile には USER 命令が含まれていないことに注意してください。コンテナイメージを Lambda にデプロイすると、最小特権のアクセス許可を付与したデフォルトの Linux ユーザーを Lambda が自動的に定義します。これは標準の Docker 動作とは異なります。標準の動作とは、USER 命令を指定しなかったときに root ユーザーのデフォルトとなる動作のことです。

    例 Dockerfile
    FROM public.ecr.aws/amazoncorretto/amazoncorretto:21 as base # Configure the build environment FROM base as build RUN yum install -y maven WORKDIR /src # Cache and copy dependencies ADD pom.xml . RUN mvn dependency:go-offline dependency:copy-dependencies # Compile the function ADD . . RUN mvn package # Copy the function artifact and dependencies onto a clean base FROM base WORKDIR /function COPY --from=build /src/target/dependency/*.jar ./ COPY --from=build /src/target/*.jar ./ # Set runtime interface client as default command for the container runtime ENTRYPOINT [ "/usr/bin/java", "-cp", "./*", "com.amazonaws.services.lambda.runtime.api.client.AWSLambda" ] # Pass the name of the function handler as an argument to the runtime CMD [ "example.App::sayHello" ]
  7. Docker イメージを「Docker の構築」コマンドで構築します。次の例では、イメージを docker-image と名付けて test タグを付けます。

    docker build --platform linux/amd64 -t docker-image:test .
    注記

    このコマンドは、ビルドマシンのアーキテクチャに関係なく、コンテナが Lambda の実行環境と互換性があることを確認する --platform linux/amd64 オプションを特定します。ARM64 命令セットアーキテクチャを使用して Lambda 関数を作成する場合は、代わりに --platform linux/arm64 オプションを使用するようにコマンドを変更してください。

ランタイムインターフェイスエミュレーターを使用して、イメージをローカルでテストします。エミュレーターはイメージに組み込むことも、次の手順を使用してローカルマシンにインストールすることもできます。

ローカルマシンにランタイムインターフェイスエミュレーターをインストールして実行するには
  1. プロジェクトディレクトリから次のコマンドを実行して、GitHub からランタイムインターフェイスエミュレーター (x86-64 アーキテクチャ) をダウンロードし、ローカルマシンにインストールします。

    Linux/macOS
    mkdir -p ~/.aws-lambda-rie && \ curl -Lo ~/.aws-lambda-rie/aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie && \ chmod +x ~/.aws-lambda-rie/aws-lambda-rie

    arm64 エミュレータをインストールするには、前のコマンドの GitHub リポジトリ URL を次のように置き換えます。

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
    PowerShell
    $dirPath = "$HOME\.aws-lambda-rie" if (-not (Test-Path $dirPath)) { New-Item -Path $dirPath -ItemType Directory } $downloadLink = "https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie" $destinationPath = "$HOME\.aws-lambda-rie\aws-lambda-rie" Invoke-WebRequest -Uri $downloadLink -OutFile $destinationPath

    arm64 エミュレーターをインストールするには、$downloadLink を次のように置き換えます。

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
  2. docker run コマンドを使用して、Docker イメージを起動します。次の点に注意してください。

    • docker-image はイメージ名、test はタグです。

    • /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda example.App::sayHello は ENTRYPOINT で、その後に Dockerfile の CMD が続きます。

    Linux/macOS
    docker run --platform linux/amd64 -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \ --entrypoint /aws-lambda/aws-lambda-rie \ docker-image:test \ /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda example.App::sayHello
    PowerShell
    docker run --platform linux/amd64 -d -v "$HOME\.aws-lambda-rie:/aws-lambda" -p 9000:8080 ` --entrypoint /aws-lambda/aws-lambda-rie ` docker-image:test ` /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda example.App::sayHello

    このコマンドはイメージをコンテナとして実行し、localhost:9000/2015-03-31/functions/function/invocations でローカルエンドポイントを作成します。

    注記

    ARM64 命令セットアーキテクチャ用に Docker イメージをビルドした場合は、--platform linux/amd64 の代わりに --platform linux/arm64 オプションを使用してください。

  3. イベントをローカルエンドポイントにポストします。

    Linux/macOS

    Linux および macOS では、次の curl コマンドを実行します。

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

    このコマンドは、空のイベントで関数を呼び出し、応答を返します。サンプル関数コードではなく独自の関数コードを使用している場合は、JSON ペイロードを使用して関数を呼び出すことをお勧めします。例:

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
    PowerShell

    PowerShell で次の Invoke-WebRequest コマンドを実行します。

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"

    このコマンドは、空のイベントで関数を呼び出し、応答を返します。サンプル関数コードではなく独自の関数コードを使用している場合は、JSON ペイロードを使用して関数を呼び出すことをお勧めします。例:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
  4. コンテナ ID を取得します。

    docker ps
  5. docker kill」コマンドを使用してコンテナを停止します。このコマンドでは、3766c4ab331c を前のステップのコンテナ ID で置き換えます。

    docker kill 3766c4ab331c
Amazon ECR にイメージをアップロードして Lambda 関数を作成するには
  1. get-login-password」コマンドを実行して Amazon ECR レジストリに Docker CLI を認証します。

    • --region 値を Amazon ECR リポジトリを作成する AWS リージョン に設定します。

    • 111122223333 を AWS アカウント ID に置き換えます。

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
  2. create-repository」コマンドを使用して Amazon ECR にリポジトリを作成します。

    aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
    注記

    Amazon ECR リポジトリは Lambda 関数と同じ AWS リージョン に配置されている必要があります。

    成功すると、次のようなレスポンスが表示されます。

    { "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } }
  3. 前のステップの出力から repositoryUri をコピーします。

  4. docker tag」コマンドを実行して、最新バージョンとしてローカルイメージを Amazon ECR リポジトリにタグ付けします。このコマンドで:

    • docker-image:test は、Docker イメージの名前とタグです。これは、docker build コマンドに指定したイメージの名前とタグです。

    • <ECRrepositoryUri> を、コピーした repositoryUri に置き換えます。URI の末尾には必ず :latest を含めてください。

    docker tag docker-image:test <ECRrepositoryUri>:latest

    例:

    docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  5. docker push」コマンドを実行して Amazon ECR リポジトリにローカルイメージをデプロイします リポジトリ URI の末尾には必ず :latest を含めてください。

    docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  6. まだ作成済みでない場合、関数に「実行ロールの作成」を実行してください。次のステップではロールの Amazon リソースネーム (ARN) が必要です。

  7. Lambda 関数を作成します。ImageUri には、先ほど使用したリポジトリ URI を指定します。URI の末尾には必ず :latest を含めてください。

    aws lambda create-function \ --function-name hello-world \ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --role arn:aws:iam::111122223333:role/lambda-ex
    注記

    イメージが Lambda 関数と同じリージョンに配置されていれば、別の AWS アカウントのイメージを使用して関数を作成することができます。詳細については、「 Amazon ECR クロスアカウント許可」を参照してください。

  8. 関数を呼び出します。

    aws lambda invoke --function-name hello-world response.json

    次のような結果が表示されます。

    { "ExecutedVersion": "$LATEST", "StatusCode": 200 }
  9. 関数の出力を確認するには、response.json ファイルをチェックします。

関数コードを更新するには、イメージを再構築し、新しいイメージを Amazon ECR リポジトリにアップロードしてから、update-function-code コマンドを使用してイメージを Lambda 関数にデプロイする必要があります。

Lambda は、イメージタグを特定のイメージダイジェストに解決します。これは、関数のデプロイに使用されたイメージタグを Amazon ECR 内の新しいイメージを指すように変更しても、Lambda は新しいイメージを使用するように自動的に関数を更新しないことを意味します。

新しいイメージを同じ Lambda 関数にデプロイするには、Amazon ECR のイメージタグが同じままであっても、update-function-code コマンドを使用する必要があります。次の例では、--publish オプションが最新のコンテナイメージを使用して関数の新しいバージョンを作成しています。

aws lambda update-function-code \ --function-name hello-world \ --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --publish