【发布时间】:2021-04-14 05:12:24
【问题描述】:
我有一个 java aws lambda 函数或处理程序作为 AHandler,它可以做一些事情,例如它已订阅 SNS 事件,它解析该 SNS 事件并将相关数据记录到数据库中。
我有另一个 java aws lambda BHandler,这个 BHandler 的目标是接收来自 AHandler 的请求并向 AHandler 提供响应。因为 BHandler 的目标是提供带有一些 json 数据的响应。这将被 AHandler 使用。
我可以看到任何清楚的例子来说明我们如何做这些事情吗?
我看到了这个例子call lambda function from a java class和Invoke lambda function from java
我的问题是关于这种情况,当一个 aws java lambda 函数(或处理程序)调用另一个 aws java lambda 函数时,而两者都在同一个区域、同一个帐户、相同的 vpc 执行内容、相同的权限。 在这种情况下,aws java lambda 函数可以直接调用(或调用)另一个函数,还是必须提供 aws 键、区域等内容(如上面的链接)?一个清晰的例子/解释会很有帮助。
编辑
正在调用另一个 Lambda 函数 (BHandler) 的 AHandler,存在于同一帐户中,已提供完整的 AWSLambdaFullAccess 与所有内容,例如
“iam:PassRole”, "λ:*",
这里是调用代码:
注意:当我从普通的 java 主函数调用相同的函数时,下面的代码可以正常工作。但它不像从 lambda 函数调用(比如 ALambdaHandler 调用 BLambdaHandler 作为函数调用)。 即使它没有返回任何异常。它只是显示超时,它卡在以下代码中: 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 的东西。
【问题讨论】:
-
任何人调用 Lambda 函数的唯一方法是通过 Lambda API。它们是否在同一个帐户、区域或什至在同一物理机器上都没有关系(无论如何您都无法知道)。您必须使用
InvokeFunctionAPI 调用。 -
似乎很重要,当我从笔记本电脑(intellij)的独立 java 程序调用 aws lambda 函数时,它运行良好,但是当我从同一帐户的另一个 aws lambda 函数调用相同的 aws lambda 函数时, 相同的区域, 它给出了超时。两者会有不同的配置,但不确定此类文档或示例存在于何处。
-
顺便说一句,您不应在 Lambda 环境中指定 aws 凭证。这是一个糟糕的设计。在这种情况下,您应该像
new AWSLambdaClient(new DefaultAWSCredentialsProviderChain());一样启动 LambdaClient,AWS sdk 以您在执行角色中拥有的权限运行。 -
嗨 Sumit,AWS Support 推荐的 VPC 配置到底是什么?我面临着类似的问题,但即使在尝试了以下答案中建议的几乎所有内容后也无法获得解决方案。
-
@rupesh ,我几年前做过那个工作,所以现在我离开这个并参与其他工作,所以我没有任何细节
标签: java amazon-web-services aws-lambda