过去几个小时我一直在调试、配置,但我似乎不明白为什么会发生这种情况。
我正在尝试调用一个 lambda 函数,该函数只是从 ec2 检索基本信息。当我在 aws 控制台中测试这个 lambda 函数时,它似乎工作正常。但是,使用以下代码在另一个 lambda 中调用它;
BasicAWSCredentials awsCreds = new BasicAWSCredentials("key1" , "key2");
AWSLambdaClientBuilder builder = AWSLambdaClientBuilder.standard()
.withRegion("eu-west-1")
.withCredentials(new AWSStaticCredentialsProvider(awsCreds));
AWSLambda client = builder.build();
InvokeRequest req = new InvokeRequest()
.withFunctionName("GetWhateverIneed");
InvokeResult result = client.invoke(req);
它只是超时了。没有任何响应...两个 Lambda 都连接到 VPC 和所有子网
我认为是我的新 VPC 导致了此问题。我的 VPC 包括:
1 个专有网络。
-2x 子网(1x 私有子网,ipv4 10.0.0.0/17,1x 公共子网,ipv4 10.0.128.0/17)。
-1x IGW 连接到私有子网。
-1x NAT 网关连接到公共子网。
-2x 端点(一个用于 Ec2,一个用于 SecretsManager)
我还配置了两个路由表,
一个用于“公共”子网:
“路线”->
目的地:10.0.0.0/16 目标:本地
目的地:0.0.0.0/0 目标:我的互联网网关(IGW)
一个用于“私有”子网:
“路线”->
目的地:10.0.0.0/16 目标:本地 .
目的地:0.0.0.0/0 目标:我的 nat
我已确保我的两个 Lambda 都在同一个 VPC 上运行,它们都使用相同的安全组:
这是我第一次使用 VPC,所以我可能错过了一些东西。
如果您的 Lambda 函数附加了 VPC,则它需要能够通过您的 VPC 与 AWS API 进行通信。 Lambda 不会通过网络与其他 Lambda 通信,而是使用 AWS API 或 API 网关发起请求,后者将请求传递给 Lambda 函数。
如果您需要附加 VPC 的 Lambda 来启动另一个 Lambda,则它需要能够通过互联网访问 AWS API 或 API 网关。或者,您可以通过将 VPC 端点添加到 API 网关服务,将其全部保留在专用网络上。
我在类似情况下遵循的模式在我的上一篇文章中有描述:https://stackoverflow.com/a/43969112/6427978
我在面临同样的问题时遇到了这个主题,并且我找到了一个尚未提及的解决方案,所以也许对于下一个寻找它会有所帮助。
当您在同一 VPC 中拥有 lambda 时,您可以添加 VPC 终端节点,但不需要添加到 API 网关服务。因此,要调用另一个 lambda,请转到 VPC 设置 -> 端点并创建一个。
com.amazonaws.eu-central-1.sqs
-> 允许从 VPC 中的 lambda 发布到 sqscom.amazonaws.eu-central-1.lambda
-> 允许在同一 VPC 中调用 lambda