Node.js VPC内Lambda的SQS超时
我有一个Lambda,需要在VPC上才能与RDS和AWSDocumentDB等受保护的资源通话。它还需要能够看到外部世界,以便调用第三方API。为此,我使用VPC向导创建了一个既有公用子网又有专用子网的VPC。向导还创建并连接了一个Internet网关 在此之后,我将Lambda、RDS实例和DocumentDb集群连接到VPC。然而,从那时起,我就无法使用NodeJS aws sdk从我的lambda中与我的SQS队列对话 我想补充一点,我已经阅读并实现了以下几点:但是我仍然无法连接 以下是我所拥有的:Node.js VPC内Lambda的SQS超时,node.js,amazon-web-services,aws-lambda,amazon-sqs,amazon-vpc,Node.js,Amazon Web Services,Aws Lambda,Amazon Sqs,Amazon Vpc,我有一个Lambda,需要在VPC上才能与RDS和AWSDocumentDB等受保护的资源通话。它还需要能够看到外部世界,以便调用第三方API。为此,我使用VPC向导创建了一个既有公用子网又有专用子网的VPC。向导还创建并连接了一个Internet网关 在此之后,我将Lambda、RDS实例和DocumentDb集群连接到VPC。然而,从那时起,我就无法使用NodeJS aws sdk从我的lambda中与我的SQS队列对话 我想补充一点,我已经阅读并实现了以下几点:但是我仍然无法连接 以下是我
- VPC有公共和私有子网,以及一个IG网关。我使用向导创建了它。我不太了解这里的基础
- (很抱歉,这是一个链接,它还不允许我嵌入。)
- -向导创建了除最后一个块以外的所有块。我不确定这是否正确,或者这是否重要,因为向导让我创建了至少一个,我这样做是为了避免IP重叠
- 由于这是一个开发/原型项目,连接到专有网络的安全组是“完全开放的”。所有入站和出站都是允许的
- 让我知道什么其他专有网络配置显示,因为我不知道什么是有用的
- 我尝试根据上面链接的文章为SQS创建一个服务端点,以下是我得到的:
- 我将在Lambda部分详细介绍我是如何消费的
- 端点连接到VPC
- 我把Lambda连接到VPC
- 这允许我与公共第三方api和我的受保护资源对话。我希望有一个完全开放的SG仍然可以让我的lambda与SQS对话,但它一直在超时
- 我不确定是否将Lambda用于我的端点。这里的示例:看起来它仍然使用区域端点
- 以下是SQS调用在我的代码中的样子:
-
const{SQS}=require('aws-sdk'); //构造函数初始化 常量sqs=新sqs({ apiVersion:'2012-11-05', 端点:'https://sqs.us-west-2.amazonaws.com“,//不确定这是否正在“调用”vpc端点 地区:“美国西部2号” }); //发送消息 等待sqs.sendMessage({ MessageBody:'测试主体', 队列URL:'https://sqs.us-west-2.amazonaws.com/', MessageAttributes:{…someAttrs} }).promise();
-
再次感谢 AWS Lambda功能应连接到专有网络中的专用子网 AmazonSQS位于互联网上,因此Lambda函数需要一种访问SQS端点的方法 选项1:VPC端点 A可以在VPC和SQS端点之间提供直接链接,而无需访问互联网。创建后,VPC将自动跨VPC端点发送SQS请求。这是一个好的、简单的选择 选项2:NAT网关
如果在私有子网中有额外的资源需要Internet访问,您可以考虑在公共子网中放置<强> NAT网关。专用子网将需要一个路由表条目,该条目将Internet绑定的流量(
0.0.0.0/0
)定向到NAT网关
额外收费
选项3:Lambda目的地
如果Lambda功能通过Lambda目的地成功地与SQS通信,那么这听起来是一个很好的选择!我还没有尝试过,但听起来Lambda服务负责直接将输出发送到SQS,而不必遍历VPC或Internet。如果这是工作,那么我强烈建议继续使用它。使用这种方法,我没有发现任何缩放问题。但是,请注意,它仅适用于对Lambda的异步调用,并且不起作用,例如,当同步调用函数或按下Test按钮时。我的直觉是,在网络配置中的某个地方缺少一条规则-数据包被丢弃到SQS,或者在回家的路上(两人都需要一步一步地思考) 我想到的三件事:
祝你好运 谢谢你的回复!因此,根据上面的截图,我将VPC拥有的所有子网连接到lambda(一些酒吧)
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();