Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js VPC内Lambda的SQS超时_Node.js_Amazon Web Services_Aws Lambda_Amazon Sqs_Amazon Vpc - Fatal编程技术网

Node.js VPC内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队列对话 我想补充一点,我已经阅读并实现了以下几点:但是我仍然无法连接 以下是我

我有一个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();
        
  • 感谢任何帮助,请让我知道我可以提供什么其他信息

    谢谢

    **编辑**

    我还应该提到,为了避免整个问题,我开始使用SQS作为Lambda目的地。虽然这确实会将消息注入到目标队列中,但它可能不会随着我的用例而扩展。如果需要的话,我可以进一步阐述,因为这与实际问题并不完全相关

    **编辑8/31/20**

    感谢所有的回复,这是一个很大的帮助,让我下了决心。我要说的是,找到这篇文章的任何人都要首先观看:

    这是我希望在开始所有这一切之前发现的东西,因为虽然它的具体目标是为lambdas提供互联网访问,但它经历了将IG和NAT映射到子网的过程,而这正是我错误配置vpc的地方。有了这个视频,我重新创建了我的整个VPC,它更干净,更容易连接点。10/10推荐


    再次感谢

    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,或者在回家的路上(两人都需要一步一步地思考)

    我想到的三件事:

  • 路由:确保子网和路由表具有适当的路由,以便将数据包从SQS端点所在的子网返回到您的专用子网
  • 安全组-仔细查看每个涉及的SG。例如,SQS可能位于限制对其访问的SG中
  • 网络ACL-这些是无状态的,因此您需要确保双方都是开放的,并且请记住,在大多数情况下,返回请求者时会涉及到随机端口号

  • 祝你好运

    谢谢你的回复!因此,根据上面的截图,我将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();