2016-01-14 23 views
4

我非常喜歡this blog post中描述的從Java調用Java lambda的方法。但是,如果我有3個環境(int/test/live),並且每個lambda都有一個略微不同的名稱(通過cloudformation創建),我想不出有一個接口的方法,不同名稱的lambda取決於環境。
我使用Spring,所以如果我可以這樣做:在Java中確定運行時的AWS lambda名稱

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

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

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

但很明顯,我不能這樣做在接口上,這不會是一個bean!有沒有辦法做到這一點?我覺得像我撞了南牆......


現在我打電話拉姆達「老辦法」:顯然有些異常處理在這裏和那裏

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

我解決了它通過使用「lambdaFunctionNameResolver」重寫函數名稱。

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

這是如何創建拉姆達客戶端:

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

我的方法調用 「generalConfigHelper.getString(」 函數名 「))」 的身影出局根據正確的函數名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