有没有什么好的文档如何从用java编写的lambda函数调用lambda函数?从lambda函数调用lambda函数或从普通的java应用程序调用是否有区别?
我发现的唯一的东西是普通的AWS Java SDK文档。 http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/index.html
如果有人能帮助我会很高兴。
是的,您可以通常从lambdas调用lambdas,就像您的代码在某个主机上执行一样。
您将有另外一步确保执行对另一个lambda的调用的lambda具有执行其他lambda函数的权限(该权限称为"lambda:InvokeFunction")。
其余步骤与使用AWS SDK的常规java相同,您实例化AWSLambdaClient对象,设置您的凭据和设置(区域等),然后创建一个InvokeRequest
对象,该对象是要调用的子lambda。适当的负载。
Here's some sample java code which does exactly this,但它也是标准sdk文档的一部分。
并且还要记住,您仍将受到第一个lambda的原始超时限制,否则将停止执行。
这里是您应该能够使用的相关代码片段,我已经更改了第二个lamdba在凭证方面的调用方式 - 您可以将用于调用第一个lambda的凭据隐式地传递给第二个,其中可能更简单,更易于维护 - 您只需要确保第一个lambda调用获取凭据,其余的将继承它们。
Region region;
AWSLambdaClient lambdaClient;
lambdaClient = new AWSLambdaClient(new DefaultAWSCredentialsProviderChain());
region = Region.getRegion(Regions.fromName(regionName));
lambdaClient.setRegion(region);
InvokeRequest invokeRequest = new InvokeRequest();
invokeRequest.setFunctionName(FunctionName);
invokeRequest.setPayload(ipInput);
returnDetails = byteBufferToString(
lambdaClient.invoke(invokeRequest).getPayload(),
Charset.forName("UTF-8"),logger);
编辑:我还应该指出,根据您的体系结构,可能会有更清晰的选项,比如使用SQS,或者取决于嵌套lambda的简单程度,将它们直接内嵌在彼此中以避免额外的调用。
许多已使用的API函数已弃用,AWS文档是......我共享一个新的实现示例。 Lambda函数“updateS3Chart”调用另一个Lambda函数“AsyncUpdate”异步:
public class LambdaInvoker {
static final Logger logger = LogManager.getLogger(LambdaInvoker.class);
static final String LambdaFunctionName = "AsyncUpdate";
private class AsyncLambdaHandler implements AsyncHandler<InvokeRequest, InvokeResult>
{
public void onSuccess(InvokeRequest req, InvokeResult res) {
logger.debug("\nLambda function returned:");
ByteBuffer response_payload = res.getPayload();
logger.debug(new String(response_payload.array()));
}
public void onError(Exception e) {
logger.debug(e.getMessage());
}
}
public void updateS3Chart(UpdateS3ChartRequest updateS3ChartRequest) {
Gson gson = new Gson();
try {
//issue: aws region is not set to debug-time. solution for eclipse:
//environment variable is set by lambda container or eclipse ide environment variables
//use instead for eclipse debugging: project -> Run as -> Run Configurations -> Environment -> Add variable: "AWS_REGION": "eu-central-1"
AWSLambdaAsync lambda = AWSLambdaAsyncClientBuilder.defaultClient(); //Default async client using the DefaultAWSCredentialsProviderChain and DefaultAwsRegionProviderChain chain
InvokeRequest req = new InvokeRequest()
.withFunctionName(LambdaFunctionName)
.withPayload(gson.toJson(updateS3ChartRequest));
Future<InvokeResult> future_res = lambda.invokeAsync(req, new AsyncLambdaHandler());
logger.debug("Waiting for async callback");
while (!future_res.isDone() && !future_res.isCancelled()) {
// perform some other tasks...
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
logger.debug("Thread.sleep() was interrupted!");
}
System.out.print(".");
}
} catch (Exception e) {
logger.fatal("Execute async lambda function: " + LambdaFunctionName + " failed: " + e.getMessage());
}
}
}
您必须在IDE中将AWS区域设置为系统属性以进行调试(请参阅Eclipse源代码中的注释)。 UpdateS3ChartRequest是带有属性set / get的简单POJO。