如何在Java Spring Boot构建的AWS EC2后端中直接调用AWS Lambda(无需API Gateway)
直接从EC2上的Spring Boot应用调用AWS Lambda的实现方案
1. 配置EC2实例的IAM权限
EC2实例必须拥有调用Lambda函数的权限,需为其关联具备lambda:InvokeFunction权限的IAM角色:
- 登录AWS控制台,创建新IAM角色,信任实体选择
EC2服务 - 为角色附加AWSLambdaRole托管策略,或使用更细粒度的自定义策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:<你的区域>:<账号ID>:function:<目标Lambda函数名>" } ] }
- 将该IAM角色关联到运行Spring Boot的EC2实例
2. 添加AWS Lambda SDK依赖
在Spring Boot项目中添加AWS Lambda的SDK依赖:
Maven(pom.xml)
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>lambda</artifactId> <version>2.25.0</version> <!-- 使用最新稳定版 --> </dependency>
Gradle(build.gradle)
implementation 'software.amazon.awssdk:lambda:2.25.0'
3. 编写Lambda调用逻辑
创建Spring服务类,使用AWS SDK的LambdaClient直接调用目标Lambda函数:
import software.amazon.awssdk.core.SdkBytes; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.lambda.LambdaClient; import software.amazon.awssdk.services.lambda.model.InvokeRequest; import software.amazon.awssdk.services.lambda.model.InvokeResponse; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.stereotype.Service; @Service public class LambdaInvokeService { private final LambdaClient lambdaClient; private final ObjectMapper objectMapper; // SDK自动从EC2实例的IAM角色获取临时凭证,无需手动配置密钥 public LambdaInvokeService(ObjectMapper objectMapper) { this.objectMapper = objectMapper; this.lambdaClient = LambdaClient.builder() .region(Region.US_EAST_1) // 替换为你的Lambda所在区域 .build(); } public <T> T invokeLambda(String functionName, Object request, Class<T> responseType) throws Exception { // 序列化请求对象为JSON字节数组 byte[] requestBytes = objectMapper.writeValueAsBytes(request); SdkBytes payload = SdkBytes.fromByteArray(requestBytes); // 构建调用请求 InvokeRequest invokeRequest = InvokeRequest.builder() .functionName(functionName) .payload(payload) .build(); // 调用Lambda并处理响应 InvokeResponse invokeResponse = lambdaClient.invoke(invokeRequest); byte[] responseBytes = invokeResponse.payload().asByteArray(); return objectMapper.readValue(responseBytes, responseType); } }
4. 异常处理与性能优化
- 捕获
LambdaException处理调用失败场景(如权限不足、函数不存在、超时等) - 可配置客户端连接池与超时参数优化性能:
LambdaClient.builder() .region(Region.US_EAST_1) .httpClientBuilder(UrlConnectionHttpClient.builder() .maxConnections(50) .connectionTimeout(Duration.ofSeconds(10)) .socketTimeout(Duration.ofSeconds(30))) .build();
内容的提问来源于stack exchange,提问作者Seung Hoon Lee
相关产品推荐
相关产品推荐

