我非常喜欢在this blog post中描述的从Java调用AWS lambdas的方法 但是,如果我有3个环境(int / test / live),并且每个环境都有一个略有不同的名称(通过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的下一个版本......
答案 0 :(得分:1)
有些人可能觉得它很有用,这个功能现在包含在1.10.51中并使用LambdaFunctionNameResolver
答案 1 :(得分:1)
我通过使用“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);