在本文中,我將探討如何使用 Docker 容器映像和 Java 執行階段來開發和部署 Lambda 函數。在本文中,我將使用 Java 21 Corretto 運行時。但與容器鏡像一樣,我們甚至可以使用最新的 Java 執行時間(如 Java 22),而不僅僅是長期支援(LTS)Java 執行時間(如 Java 17 和 21)。當發布更新的 Java 版本(如 Java)時,很容易更新此範例2024 年 9 月發布第 23 版)。
AWS 基礎映像預先載入了語言執行時間、用於管理 Lambda 與函數程式碼之間互動的執行時間介面用戶端以及用於本機測試的執行時間介面模擬器。有關使用適用於 Java 的 AWS 基礎映像的信息,請參閱本文。
為了方便解釋,我們將使用範例應用程式並為 Lambda 函數使用 Java 21 執行時間。
在此應用程式中,我們將建立和檢索產品並使用 DynamoDB 作為 NoSQL 資料庫。您可以在此處找到 DynamoProductDao.java 實作。我們也將 Amazon API Gateway 放在它前面,如 AWS SAM 範本中所定義。在此範本中,我們也定義了 2 個 Lambda 函數:PutProductWithPureJava21DockerImage 和 GetProductByIdWithPureJava21DockerImage。
我們需要定義 Dockerfile,在其中使用來自公用 Amazon ECR 儲存庫的適用於 Java 21 的 AWS Lambda 基礎 Docker 映像 public.ecr.aws/lambda/java:21 。在這裡您可以找到 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 和sam deploy 命令鏈,或者如果您在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
使用 sam deploy -g 部署函數時,我們需要使用 sam 參數選項 --image-repository 額外提供 Amazon ECR URL,請參閱 sam deploy 參數。
僅限 AWS 作業系統的基礎映像包含 Amazon Linux 發行版和執行時期介面模擬器。這些鏡像通常用於為編譯語言(例如 Java 和 Rust)以及 Lambda 不提供基礎鏡像的語言或語言版本(例如 Node.js 19)建立容器鏡像。我們還可以使用 OS-僅用於實現自訂運行時的基礎映像。
如果我們想使用適用於 Java 的 AWS 作業系統基礎映像,我們必須將執行時間介面用戶端包含在我們的映像或相依性管理中。執行時間介面用戶端擴充了 Lambda 執行時間 API,它管理 Lambda 和您的函數程式碼之間的互動。
我也為此用例提供了範例應用程式。
我在 pom.xml 中包含了 AWS Lambda Java Runtime Interface Client,如下所示:
<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中文網其他相關文章!