当两个函数位于同一账户、同一区域时,如何从另一个 AWS Java Lambda 函数调用 aws java lambda 函数
我有一个 java aws lambda 函数或处理程序作为 AHandler 可以做一些事情,例如它已订阅 SNS 事件,它解析该 SNS 事件并将相关数据记录到数据库中.
I have a java aws lambda function or handler as AHandler that does some stuff e.g. It has been subscribed to SNS events, It parses that SNS event and log relevant data to the database.
我有另一个 java aws lambda BHandler,这个 BHandler 的目标是接收来自 AHandler 的请求并将响应提供给 AHandler.因为 BHandler 的目标是提供一些 json 数据的响应.这将被 AHandler 使用.
I have another java aws lambda BHandler, Objective of this BHandler to receive a request from AHandler and provide a response back to AHandler. Because BHandler's objective is to provide a response with some json data. and that would be used by the AHandler.
我可以看到任何清楚的例子来说明我们如何做这样的事情吗?
May I see any clear example which tells how we can do such things ?
我看到了这个例子 调用 lambda 函数来自 java 类 和 从爪哇
I saw this example call lambda function from a java class and Invoke lambda function from java
我的问题是关于那种情况,当一个 aws java lambda 函数(或处理程序)调用另一个 aws java lambda 函数时,两者都在同一区域、同一帐户、相同的 vpc 执行内容、相同的权利. 在这种情况下,aws java lambda 函数可以直接调用(或调用)另一个函数,或者仍然必须提供 aws 密钥、区域等内容(如上面的链接所示)?一个清晰的例子/解释会很有帮助.
My question talks about that situation, when one aws java lambda function (or handler) calls to another aws java lambda function when both are in same region, same account,same vpc execution stuff, same rights. In that case aws java lambda function can directly call( or invoke) to another or still it has to provide aws key,region etc stuff (as in above links) ? A clear example/explanation would be very helpful.
编辑
正在调用另一个 Lambda 函数 (BHandler) 的 AHandler 存在于同一个帐户中,并提供了完整的 AWSLambdaFullAccess 和所有内容,例如
The AHandler who is calling another Lambda function (BHandler) , exist on same account have given complete AWSLambdaFullAccess with everything e.g.
iam:PassRole","lambda:*",
"iam:PassRole", "lambda:*",
这是调用的代码:
注意:当我从普通的java主函数调用相同的函数时,下面的代码有效.但它不像从 lambda 函数调用(如 ALambdaHandler 调用 BLambdaHandler 作为函数调用).即使它没有返回任何异常.它只是显示超时,它卡在了以下代码中:lambdaClient.invoke
Note : Below code works when I call the same function with everything same from a normal java main function. But its not working like calling from on lambda function (like ALambdaHandler calling BLambdaHandler as a function call). Even its not returning any exception. Its just showing timeout, its got stuck at the code of: lambdaClient.invoke
String awsAccessKeyId = PropertyManager.getSetting("awsAccessKeyId");
String awsSecretAccessKey = PropertyManager.getSetting("awsSecretAccessKey");
String regionName = PropertyManager.getSetting("regionName");
String geoIPFunctionName = PropertyManager.getSetting("FunctionName");
Region region;
AWSCredentials credentials;
AWSLambdaClient lambdaClient;
credentials = new BasicAWSCredentials(awsAccessKeyId,
awsSecretAccessKey);
lambdaClient = (credentials == null) ? new AWSLambdaClient()
: new AWSLambdaClient(credentials);
region = Region.getRegion(Regions.fromName(regionName));
lambdaClient.setRegion(region);
String returnGeoIPDetails = null;
try {
InvokeRequest invokeRequest = new InvokeRequest();
invokeRequest.setFunctionName(FunctionName);
invokeRequest.setPayload(ipInput);
returnDetails = byteBufferToString(
lambdaClient.invoke(invokeRequest).getPayload(),
Charset.forName("UTF-8"),logger);
} catch (Exception e) {
logger.log(e.getMessage());
}
编辑我按照别人的建议做了一切,并遵循了一切.最后我联系了 AWS 支持,问题与一些 VPC 配置的东西有关,并得到了解决.如果您遇到类似的东西,那么可能是检查安全配置,VPC 的东西.
EDIT I did everything as suggested by others and followed everything. At the end I reached to AWS support, and the problem was related to some VPC configurations stuff, and that got solved.If you have encountered similar stuff, then may be check security configs, VPC stuff.
我们通过使用 com.amazonaws.services.lambda.model.InvokeRequest 实现了这一点.这是代码示例.
We have achieved this by using com.amazonaws.services.lambda.model.InvokeRequest. Here is code sample.
public class LambdaInvokerFromCode {
public void runWithoutPayload(String functionName) {
runWithPayload(functionName, null);
}
public void runWithPayload(String functionName, String payload) {
AWSLambdaAsyncClient client = new AWSLambdaAsyncClient();
client.withRegion(Regions.US_EAST_1);
InvokeRequest request = new InvokeRequest();
request.withFunctionName(functionName).withPayload(payload);
InvokeResult invoke = client.invoke(request);
System.out.println("Result invoking " + functionName + ": " + invoke);
}
public static void main(String[] args) {
String KeyName ="41159569322017486.json";
String status = "success";
String body = "{"bucketName":""+DBUtils.S3BUCKET_BULKORDER+"","keyName":""+KeyName+"", "status":""+status+""}";
System.out.println(body);
JSONObject inputjson = new JSONObject(body);
String bucketName = inputjson.getString("bucketName");
String keyName = inputjson.getString("keyName");
String Status = inputjson.getString("status");
String destinationKeyName = keyName+"_"+status;
LambdaInvokerFromCode obj = new LambdaInvokerFromCode();
obj.runWithPayload(DBUtils.FILE_RENAME_HANDLER_NAME,body);
}
}