首页  >  文章  >  Java  >  使用 Docker 容器映像的 Lambda 函数 - 使用 Java 开发和部署 Lambda 函数的部分流程(运行时

使用 Docker 容器映像的 Lambda 函数 - 使用 Java 开发和部署 Lambda 函数的部分流程(运行时

WBOY
WBOY原创
2024-08-27 20:00:16352浏览

介绍

在本文中,我将探讨如何使用 Docker 容器映像和 Java 运行时来开发和部署 Lambda 函数。在本文中,我将使用 Java 21 Corretto 运行时。但与容器镜像一样,我们甚至可以使用最新的 Java 运行时(如 Java 22),而不仅仅是长期支持(LTS)Java 运行时(如 Java 17 和 21)。当发布更新的 Java 版本(如 Java)时,很容易更新此示例2024 年 9 月发布第 23 版)。

如何使用 AWS Lambda 基础 Docker 容器映像和 Java (21) 运行时开发和部署 Lambda 函数

AWS 基础映像预加载了语言运行时、用于管理 Lambda 与函数代码之间交互的运行时接口客户端以及用于本地测试的运行时接口模拟器。有关使用适用于 Java 的 AWS 基础映像的信息,请参阅本文。

为了便于解释,我们将使用示例应用程序并为 Lambda 函数使用 Java 21 运行时。

Lambda function using Docker Container Image -Part ow to develop and deploy Lambda function with Java ( runtime

在此应用程序中,我们将创建和检索产品并使用 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"]

重要的部分是:

  • PackageType:表示我们将 Lambda 函数打包为 Docker 容器映像的图像
  • ImageUri: !Sub ${AWS::AccountId}.dkr.ecr.eu-central-1.amazonaws.com/aws-pure-lambda-java21-custom-docker-image:v1 引用的路径Amazon Elastic Container Registry 中的 Docker 容器映像。稍后详细了解如何将图像推送到那里。 -图像配置: 命令:["software.amazonaws.example.product.handler.GetProductByIdHandler::handleRequest"] 被覆盖为我们的 GetProductById 处理程序的 CMD。由于此 CMD 对于每个 Lambda 函数都是唯一的,因此最好在 Lambda 函数级别声明它,就像在 Docker 文件中一样。

现在让我们回答如何创建 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 仅操作系统基础映像和 Java (21) 运行时开发和部署 Lambda 函数

仅限 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 运行时接口客户端的入口类 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 容器映像
  • 仅限 AWS 操作系统的基础映像

在下一篇文章中,我们将使用 AWS Lambda 基础 Docker 容器映像测量 Lambda 函数的冷启动和热启动时间。

以上是使用 Docker 容器映像的 Lambda 函数 - 使用 Java 开发和部署 Lambda 函数的部分流程(运行时的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn