我有一个 Lambda,它需要在 VPC 上才能与 RDS 和 AWSDocumentDB 等 protected 资源进行通信。对于对 3rd 方 API 的某些调用,它还需要能够看到外部世界。为此,我使用 VPC 向导创建了一个同时具有公有子网和私有(private)子网的 VPC。该向导还创建并附加了一个 Internet 网关。
在此之后,我将我的 Lambda、RDS 实例和 DocumentDb 集群附加到 VPC。但是从那以后,我一直无法使用 NodeJS aws-sdk 从我的 lambda 中与我的 SQS 队列交谈。
我想补充一点,我已经阅读并实现了以下几点:AWS Lambda: Unable to access SQS Queue from a Lambda function with VPC access但是我仍然无法连接。
这是我所拥有的:
const {SQS} = require('aws-sdk');
// Constructor Init
const sqs = new SQS({
apiVersion: '2012-11-05',
endpoint: 'https://sqs.us-west-2.amazonaws.com', // not sure if this is 'invoking' the vpc endpoint or not
region: 'us-west-2'
});
// Send message
await sqs.sendMessage({
MessageBody: 'Test body',
QueueUrl: 'https://sqs.us-west-2.amazonaws.com/<rest of URI>',
MessageAttributes: {...someAttrs}
}).promise();
感谢任何帮助,请让我知道我可以提供哪些其他信息。
谢谢!
** 编辑 **
我还应该提到,为了规避整个问题,我开始使用 SQS 作为 Lambda 目的地。虽然这确实将消息注入(inject)目标队列,但它可能不会随着我的用例扩展。如果需要,我可以进一步详细说明,因为它与实际问题并不完全相关。
** 编辑 8/31/20 **
感谢所有的回复,这是一个很大的帮助,让我有了一个解决方案。我会说,任何发现这篇文章的人首先要看:
https://www.youtube.com/watch?v=JcRKdEP94jM
这是我希望在开始所有这些之前找到的东西,因为虽然它专门针对给予 lambdas 互联网访问权限,但它经历了将 IG 和 Nats 映射到子网的过程,这实际上是我错误配置我的 vpc 的地方。通过这个视频,我重新创建了我的整个 VPC,连接起来更加简洁和容易。 10/10 推荐。
再次感谢!
最佳答案
AWS Lambda 函数应附加到 私有(private)子网 在 VPC 中。
Amazon SQS 存在于 Internet 上,因此 Lambda 函数需要一种访问 SQS 终端 Node 的方法。
选项 1:VPC 端点
一个 VPC Endpoint for Amazon SQS可以在 VPC 和 SQS 端点之间提供直接链接,而无需访问 Internet。创建后,VPC 将自动跨 VPC 端点发送 SQS 请求。这是一个不错的简单选择。
选项 2:NAT 网关
如果您在需要 Internet 访问的私有(private)子网中有其他资源,您可以考虑放置 公共(public)子网中的 NAT 网关 .私有(private)子网需要一个路由表条目,将 Internet 绑定(bind)流量 (0.0.0.0/0
) 引导到 NAT 网关。
需额外收费。
选项 3:Lambda 目标
如果您的 Lambda 函数通过 Lambda 目标成功地与 SQS 通信,则 这听起来是个不错的选择 !没试过,不过好像是Lambda服务负责把输出直接发给SQS,不用遍历VPC或者Internet。如果这有效,那么我强烈建议继续使用它。我不认为使用这种方法有任何缩放问题。但是,请注意,它仅适用于对 Lambda 的异步调用,并且不起作用,例如,在同步调用函数或按 时。测试 按钮。
关于node.js - VPC 内 Lambda 的 SQS 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63624385/