【发布时间】:2020-12-16 19:59:31
【问题描述】:
我有一个 Lambda,它需要在 VPC 上才能与 RDS 和 AWSDocumentDB 等受保护资源进行通信。对于对 3rd 方 API 的某些调用,它还需要能够看到外部世界。为此,我使用 VPC 向导创建了一个同时具有公有子网和私有子网的 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 但是我仍然无法连接。
这是我所拥有的:
-
VPC:
- VPC 具有公共子网和私有子网,以及一个 IG 网关。我使用向导来创建它。我不太了解这里的基础知识。
- VPC Config(抱歉,这是一个链接,我还不能嵌入。)
- CIDR's- 向导创建了除最后一个块之外的所有块。我不确定我是否做对了,或者它是否重要,因为向导让我创建了至少一个,我这样做是为了避免 IP 重叠。
- 由于这是一个开发/原型项目,附加到 VPC 的安全组是“完全开放的”。允许所有入站和出站。
- 让我知道要显示的其他 VPC 配置,因为我不确定什么有用
-
服务端点:
- 我尝试按照上面链接的文章为 SQS 创建一个服务端点,这就是我所拥有的:endpoint config
- 我将在 Lambda 部分详细讨论我是如何使用它的。
- 端点已附加到 VPC
-
拉姆达:
- 我已将 Lambda 附加到 VPC as shown here。
- 这使我可以与公共 3rd 方 api 和我的受保护资源交谈。我希望拥有一个开放的 SG 仍然可以让我的 lambda 与 SQS 对话,但它总是超时。
- 我不确定 which url 在我的 Lambda 中用于我的端点。此处的示例:https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-sending-messages-from-vpc.html 看起来仍然使用区域端点。
-
代码
-
这是我的代码中 SQS 调用的样子:
-
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 目标。虽然这确实将消息注入目标队列,但它可能不会随着我的用例扩展。如果需要,我可以进一步详细说明,因为它与实际问题并不完全相关。
** 编辑 8/31/20 **
感谢所有回复,这是一个很大的帮助,让我有了一个解决方案。我会说,任何发现这篇文章的人都是先看:
https://www.youtube.com/watch?v=JcRKdEP94jM
这是我希望在开始这一切之前找到的东西,因为虽然它专门针对 lambdas 互联网访问,但它经历了将 IG 和 Nats 映射到子网的过程,这确实是我错误配置的地方我的vpc。通过这个视频,我重新创建了我的整个 VPC,连接起来更加简洁和容易。 10/10 推荐。
再次感谢!
【问题讨论】:
-
我遇到了几乎同样的问题,除了我使用的是 python。正如this answer 中所解释的(有解决方法),我的结果是boto3 中的一个错误。
标签: node.js amazon-web-services aws-lambda amazon-sqs amazon-vpc