You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 13:09:29