Java中在运行时确定AWS Lambda名称

9
我非常喜欢这篇博客文章中介绍的从Java调用AWS Lambdas的方法。
然而,如果我有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为“旧方法”:
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的下一个版本中...
2个回答

7

我使用 "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"))" 根据环境(开发/测试/生产)确定正确的函数名称。

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


6

对于一些人来说,这个功能可能很有用。现在,使用LambdaFunctionNameResolver已经包含在1.10.51版本中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接