AWS Lambda 托管实例与 Java 25 和 AWS SAM - 第1部分 介绍与示例应用
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 25 和 AWS SAM 开发一个使用 LMI 的示例应用程序。在本文中,我们将解释 LMI 的理念并介绍我们的示例应用程序。
AWS Lambda 托管实例
Lambda 托管实例 使我们能够在当前代的 Amazon EC2 实例上运行 Lambda 函数——包括 Graviton4、网络优化实例以及其他专用计算选项——而无需管理实例生命周期、操作系统/运行时补丁、路由、负载均衡或扩展策略。
使用 Lambda 托管实例,我们可以受益于 EC2 的定价优势,例如 Savings Plans 和 Reserved 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 有基本了解。
前置条件
要构建并部署示例,您需要在本地安装以下工具:
- Java 25 – Corretto 25 下载
- Maven – 下载页面
- AWS CLI – 安装指南
- SAM CLI – 安装指南
示例: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();
}
}
在这里我们:
- 使用
DynamoDbClient实例构建GetItemRequest,查询 DynamoDB 表。 - 从环境变量 (
System.getenv("PRODUCT_TABLE_NAME")) 中获取表名,该变量在 AWS SAM 模板中设置。 - 如果找到产品,则使用自定义的 ProductMapper 将 DynamoDB 项映射为
Product实体。
我们将在后续文章中介绍 AWS SAM template.yaml 中描述的基础设施即代码(IaC)部分,因为它包含了 LMI‑特定的配置。
构建和部署
-
构建应用程序:
mvn clean package -
使用 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 上关注我,并给我的仓库点个星!
