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

时间:2016-01-14 09:52:55

标签: java amazon-web-services annotations aws-lambda

我非常喜欢在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的下一个版本......

2 个答案:

答案 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);

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