在 Java 中确定运行时的 AWS lambda 名称

Determine the AWS lambda name on runtime in Java

我非常喜欢 this blog post 中描述的从 Java 调用 AWS lambda 的方法。
但是,如果我有 3 个环境(int/test/live),并且在每个环境中,lambda 的名称略有不同(通过 cloudformation 创建),我想不出一种方法来拥有一个接口,并调用 lambda根据环境不同的名称。
我正在使用 Spring,所以如果我可以这样做:

@Component
interface MyLambdas {
    @Value("${name}")
    String name;

    @LambdaFunction(name = name)
    String callMyLambda(String stuff);
}

//and then
service = LambdaInvokerFactory.build(MyLambdas.class, lambda);

但是显然我不能在接口上这样做,这不会是一个bean!有什么办法可以做到这一点?感觉撞墙了……


现在我正在调用 lambda "the old way":

String readLambdaName = "My_Lambda";

ObjectMapper objectMapper = new ObjectMapper();
AWSLambdaClient lambda = new AWSLambdaClient();
lambda.configureRegion(Regions.EU_WEST_1);

String json = objectMapper.writeValueAsString(request);
InvokeRequest req = new InvokeRequest()
        .withFunctionName(readLambdaName)
        .withPayload(json);

InvokeResult res = lambda.invoke(req);
int result = objectMapper.readTree(res.getPayload().array()).asInt();

显然到处都有一些异常处理。这不是一个很好的解决方案...


对于任何关注此的人,我已经在 aws-sdk github 上提交了一个问题和一个解决方案。希望与我的解决方案类似的东西会出现在 SDK 的下一个版本中...

有些人可能会觉得它很有用,这个功能现在包含在 1.10.51 中,使用 LambdaFunctionNameResolver

我通过使用 "lambdaFunctionNameResolver" 覆盖函数名称解决了这个问题。

//my lambda interface
public interface MyLambdaService {
    @LambdaFunction
    ApiGatewayProxyResponse execute(ApiGatewayRequest bit);
}

这是创建 lambda 客户端的方法:

MyLambdaService lambdaService = LambdaInvokerFactory.builder().lambdaClient(AWSLambdaClientBuilder.defaultClient())
                    .lambdaFunctionNameResolver((method, annotation, config) -> "ENV_SPECIFIC_FUNCTION_NAME").build(MyLambdaService.class);

我的方法调用 "generalConfigHelper.getString("function_name"))" 根据 env (dev/qa/prod) 计算出正确的函数名称。

MyLambdaService lambdaService = LambdaInvokerFactory.builder().lambdaClient(AWSLambdaClientBuilder.defaultClient())
                .lambdaFunctionNameResolver((method, annotation, config) -> generalConfigHelper.getString("function_name")).build(MyLambdaService.class);

官方 aws 问题:https://github.com/aws/aws-sdk-java/pull/603