ホームページ >Java >&#&チュートリアル >Docker コンテナイメージを使用した Lambda 関数 - Java を使用して Lambda 関数を開発およびデプロイするパートフロー (ランタイム)
この記事では、Docker Container Image と Java ランタイムを使用して Lambda 関数を開発およびデプロイする方法を検討したいと思います。この記事では、Java 21 Corretto ランタイムを使用します。ただし、コンテナー イメージと同様に、Java 17 や 21 のような長期サポート (LTS) Java ランタイムだけでなく、Java 22 などの最近の Java ランタイムも使用できます。新しい Java バージョンがリリースされる場合 (Java など)、この例を更新するのは簡単です。バージョン 23 (2024 年 9 月)。
AWS の基本イメージには、言語ランタイム、Lambda と関数コード間の対話を管理するランタイム インターフェイス クライアント、ローカル テスト用のランタイム インターフェイス エミュレーターがプリロードされています。 Java 用の AWS ベースイメージの使用については、この記事を参照してください。
説明のために、サンプル アプリケーションを使用し、Lambda 関数に Java 21 ランタイムを使用します。
このアプリケーションでは、プロダクトを作成および取得し、NoSQL データベースとして DynamoDB を使用します。 DynamoProductDao.java 実装はここにあります。また、AWS SAM テンプレートで定義されているように、Amazon API Gateway をその前に配置します。このテンプレートでは、PutProductWithPureJava21DockerImage と GetProductByIdWithPureJava21DockerImage という 2 つの Lambda 関数も定義しました。
パブリック Amazon ECR リポジトリからの Java 21 用の AWS Lambda ベース Docker イメージ public.ecr.aws/lambda/java:21 を使用する Dockerfile を定義する必要があります。ここでは、AWS が提供する Java 用のすべての Lambda ベース Docker イメージを見つけることができます。
Docker イメージでは、関数コードとランタイム依存関係も Maven レイアウトからランタイム環境変数 LAMBDA_TASK_ROOT – Lambda 関数コードへのパスにコピーします。
COPY target/classes ${LAMBDA_TASK_ROOT} COPY target/dependency/* ${LAMBDA_TASK_ROOT}/lib/
その他すべては、AWS SAM テンプレートの Lambda 関数宣言で定義されます。
GetProductByIdFunction: Type: AWS::Serverless::Function Properties: FunctionName: GetProductByIdWithPureJava21DockerImage PackageType: Image ImageUri: !Sub ${AWS::AccountId}.dkr.ecr.eu-central-1.amazonaws.com/aws-pure-lambda-java21-custom-docker-image:v1 ImageConfig: Command: ["software.amazonaws.example.product.handler.GetProductByIdHandler::handleRequest"]
重要な部分は次のとおりです:
ここで、Docker コンテナ イメージを作成して ECR リポジトリにプッシュする方法についての質問に答えましょう。 これを自動的に実行して、sam build および samdeploy コマンド チェーンを実行することもできます。または、アプリケーションを SAM の外部でビルドしてパッケージ化し、SAM でのみデプロイする場合は、次のように手動で行う必要があります
Build Docker image with name aws-pure-lambda-java21-custom-docker-image: docker build --no-cache -t aws-pure-lambda-java21-custom-docker-image:v1 . Login to Amazon ECR in case the credentials are expired: aws ecr get-login-password --region eu-central-1 | docker login --username AWS --password-stdin {aws_account_id}.dkr.ecr.eu-central-1.amazonaws.com Create Amazon ECR repository if not exists with the name aws-pure-lambda-java21-custom-docker-image: aws ecr create-repository --repository-name aws-pure-lambda-java21-custom-docker-image --image-scanning-configuration scanOnPush=true --region eu-central-1 Tag our local Docker image and link it with Amazon ECR repository. Exactly this image is referenced as ImageUri in the Lambda function: docker tag aws-pure-lambda-java21-custom-docker-image:v1 {aws_account_id}.dkr.ecr.eu-central-1.amazonaws.com/aws-pure-lambda-java21-custom-docker-image:v1 Push the Docker image to the Amazon ECR repository: docker push {aws_account_id}.dkr.ecr.eu-central-1.amazonaws.com/aws-pure-lambda-java21-custom-docker-image:v1
samdeploy -g を使用して関数をデプロイする場合は、sam パラメータオプション --image-repository を使用して Amazon ECR URL を追加で提供する必要があります。samdeploy パラメータを参照してください。
AWS OS のみのベースイメージには、Amazon Linux ディストリビューションとランタイムインターフェイスエミュレーターが含まれています。これらのイメージは、Java や Rust などのコンパイル済み言語、および Lambda が基本イメージを提供していない言語または言語バージョン (Node.js 19 など) のコンテナ イメージを作成するためによく使用されます。また、OS を使用することもできます。カスタム ランタイムを実装するためのベース イメージのみ。
Java 用の AWS OS のみのベースイメージを使用したい場合は、イメージまたは依存関係の管理にランタイムインターフェイスクライアントを含める必要があります。ランタイム インターフェイス クライアントは、Lambda と関数コード間の対話を管理する Lambda ランタイム API を拡張します。
このユースケース用にもサンプル アプリケーションを提供しました。
次のように AWS Lambda Java Runtime Interface Client を pom.xml に含めました。
<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-runtime-interface-client</artifactId> </dependency>
この場合、Dockerfile も少し異なって見えます。
amazoncorretto:21-alpine をベース Docker イメージとして使用し、AWS Lambda Java Runtime Interface Client からエントリ クラス AWSLambda を明示的に指すエントリ ポイントを定義する必要がありました。
ENTRYPOINT [ "/usr/bin/java", "-cp", "./*", "com.amazonaws.services.lambda.runtime.api.client.AWSLambda" ]
その他すべて: SAM テンプレート、ソースコード、アプリケーション、および Docker イメージの構築とデプロイの手順は、AWS Lambda ベースの Docker コンテナ イメージの例と同じです。
この記事では、Docker コンテナイメージと Java ランタイムを使用して Lambda 関数を開発およびデプロイする方法について説明しました。私たちは 2 つのユースケースを検討しました:
次の記事では、AWS Lambda ベースの Docker コンテナ イメージを使用して、Lambda 関数のコールドおよびウォームの開始時間を測定します。
以上がDocker コンテナイメージを使用した Lambda 関数 - Java を使用して Lambda 関数を開発およびデプロイするパートフロー (ランタイム)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。