AWS Lambda 托管实例与 Java 25 和 AWS SAM - 第1部分 介绍与示例应用

发布: (2026年1月16日 GMT+8 00:09)
7 min read
原文: Dev.to

I’m happy to translate the article for you, but I need the actual text you’d like translated. Could you please paste the content (or the portion you want translated) here? I’ll keep the source link and all formatting exactly as you requested.

Introduction

在本系列文章中,我们将介绍 AWS Lambda Managed Instances (LMI) 背后的概念。随后,我们将使用 Java 25AWS SAM 开发一个使用 LMI 的示例应用程序。在本文中,我们将解释 LMI 的理念并介绍我们的示例应用程序。

AWS Lambda 托管实例

Lambda 托管实例 使我们能够在当前代的 Amazon EC2 实例上运行 Lambda 函数——包括 Graviton4、网络优化实例以及其他专用计算选项——而无需管理实例生命周期、操作系统/运行时补丁、路由、负载均衡或扩展策略。

使用 Lambda 托管实例,我们可以受益于 EC2 的定价优势,例如 Savings PlansReserved Instances

有关受支持实例类型的列表,请参阅 AWS Lambda 定价页面 并选择您的 AWS 区域。

关键功能

  • 选择合适的实例 – 根据性能和成本需求选择合适的实例,包括最新的 CPU(如 Graviton4)、可配置的内存‑CPU 比例以及高带宽网络。
  • 自动供应 – AWS 自动供应合适的实例并启动函数执行环境。
  • 动态扩展 – 实例会根据函数流量模式动态扩展。
  • 全托管体验 – AWS 负责基础设施管理、扩展、补丁和路由,提供您熟悉的丰富事件源集成。

何时使用 Lambda 托管实例

  • 高容量、可预测的工作负载 – 适用于没有意外流量峰值的稳态工作负载。默认情况下,LMIs 可以在五分钟内将流量翻倍。
  • 性能关键的应用 – 可使用最新的 CPU、灵活的内存‑CPU 比例以及高网络吞吐量。
  • 合规性要求 – 需要对 VPC 和实例放置进行细粒度治理的场景。

示例应用

您可以在 GitHub 仓库 aws-lambda-java-25‑lmi 中找到代码示例。

架构

示例应用架构

该应用创建产品并通过 ID 检索产品,使用 Amazon DynamoDB 作为 NoSQL 持久化层。它通过 Amazon API Gateway 暴露,由 AWS Lambda 执行,并使用 AWS SAM(无服务器应用模型)进行部署。假设您已经对这些服务、AWS 上的无服务器架构以及 SAM 有基本了解。

前置条件

要构建并部署示例,您需要在本地安装以下工具:

示例:GetProductByIdHandler

下面是 GetProductByIdHandler Lambda 函数的源代码。它从 API‑Gateway 请求中提取产品 ID,在 DynamoDB 中查找该产品,并返回相应的响应。

@Override
public APIGatewayProxyResponseEvent handleRequest(
        APIGatewayProxyRequestEvent requestEvent,
        Context context) throws JsonProcessingException {

    var id = requestEvent.getPathParameters().get("id");
    var optionalProduct = productDao.getProduct(id);

    if (optionalProduct.isEmpty()) {
        return new APIGatewayProxyResponseEvent()
                .withStatusCode(HttpStatusCode.NOT_FOUND)
                .withBody("Product with id = " + id + " not found");
    }

    return new APIGatewayProxyResponseEvent()
            .withStatusCode(HttpStatusCode.OK)
            .withBody(objectMapper.writeValueAsString(optionalProduct.get()));
}

handleRequest 方法接收一个 APIGatewayProxyRequestEvent(由 API Gateway 调用)。它通过 requestEvent.getPathParameters().get("id") 获取产品 ID,使用 productDao.getProduct(id) 查询 DynamoDB,然后返回一个包装在 APIGatewayProxyResponseEvent 中的 JSON 序列化响应。如果产品不存在,则返回 404 Not Found 响应;否则返回包含产品数据的 200 OK 响应给 API Gateway。

Lambda 函数概览

我们用于创建和持久化产品的 Lambda 函数 CreateProductHandler 的代码与下面的示例类似。

Product 实体

Product 实体的源代码非常简洁:

public record Product(String id, String name, BigDecimal price) {}

DynamoProductDao 持久化层

DynamoProductDao 持久化层的实现使用 AWS SDK for Java 2.0 来写入或读取 DynamoDB。下面是 getProduct 方法的源代码,该方法在前文描述的 GetProductByIdHandler Lambda 函数中使用:

public Optional getProduct(String id) {
    GetItemResponse getItemResponse = dynamoDbClient.getItem(
        GetItemRequest.builder()
            .key(Map.of("PK", AttributeValue.builder().s(id).build()))
            .tableName(PRODUCT_TABLE_NAME)
            .build()
    );

    if (getItemResponse.hasItem()) {
        return Optional.of(ProductMapper.productFromDynamoDB(getItemResponse.item()));
    } else {
        return Optional.empty();
    }
}

在这里我们:

  1. 使用 DynamoDbClient 实例构建 GetItemRequest,查询 DynamoDB 表。
  2. 从环境变量 (System.getenv("PRODUCT_TABLE_NAME")) 中获取表名,该变量在 AWS SAM 模板中设置。
  3. 如果找到产品,则使用自定义的 ProductMapper 将 DynamoDB 项映射为 Product 实体。

我们将在后续文章中介绍 AWS SAM template.yaml 中描述的基础设施即代码(IaC)部分,因为它包含了 LMI‑特定的配置。

构建和部署

  1. 构建应用程序:

    mvn clean package
  2. 使用 SAM 部署:

    sam deploy -g

部署完成后,SAM 会返回一个自定义的 Amazon API Gateway URL。使用该 URL 创建产品并通过 ID 检索它们。API 通过 API 密钥进行安全保护;在每个请求中加入以下 HTTP 头部:

X-API-Key: a6ZbcDefQW12BN56WEV7LMI

(参见 template.yaml 中的 MyApiKey 定义。)

示例:创建产品

curl -X PUT \
     -d '{ "id": "1", "name": "Print 10x13", "price": 0.15 }' \
     -H "Content-Type: application/json" \
     -H "X-API-Key: a6ZbcDefQW12BN56WEV7LMI" \
     https://{API_GATEWAY_URL}/prod/products

示例:检索产品

curl -H "X-API-Key: a6ZbcDefQW12BN56WEV7LMI" \
     https://{API_GATEWAY_URL}/prod/products/1

结论

在本文中,我们解释了 AWS Lambda Managed Instances 背后的概念,并介绍了我们的示例应用程序。在下一篇文章中,我们将讨论 Lambda Capacity Providers 以及如何创建它。

如果你喜欢我的内容,请在 GitHub 上关注我,并给我的仓库点个星!

Back to Blog

相关文章

阅读更多 »

Rapg:基于 TUI 的密钥管理器

我们都有这种经历。你加入一个新项目,首先听到的就是:“在 Slack 的置顶消息里查找 .env 文件”。或者你有多个 .env …

技术是赋能者,而非救世主

为什么思考的清晰度比你使用的工具更重要。Technology 常被视为一种魔法开关——只要打开,它就能让一切改善。新的 software,...

踏入 agentic coding

使用 Copilot Agent 的经验 我主要使用 GitHub Copilot 进行 inline edits 和 PR reviews,让我的大脑完成大部分思考。最近我决定 t...