node.js - VPC 内 Lambda 的 SQS 超时

标签 node.js amazon-web-services aws-lambda amazon-sqs amazon-vpc

我有一个 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但是我仍然无法连接。
这是我所拥有的:

  • 专有网络:
  • VPC 具有公有子网和私有(private)子网,以及一个 IG 网关。我使用向导来创建它。我不明白这里的很多基础。
  • VPC Config (对不起,这是一个链接,它还不让我嵌入。)
  • CIDR's - 向导创建了除最后一个 block 之外的所有 block 。我不确定我是否做对了,或者它是否重要,因为向导让我创建了至少一个,我这样做是为了避免 IP 重叠。
  • 由于这是一个开发/原型(prototype)项目,附加到 VPC 的安全组是“广泛开放的”。允许所有入站和出站。
  • 让我知道要显示的其他 VPC 配置,因为我不确定什么有用

  • 服务端点:
  • 我尝试按照上面链接的文章为 SQS 创建一个服务端点,这就是我所拥有的:endpoint config
  • 我将在 Lambda 部分详细讨论我是如何使用它的。
  • 端点附加到 VPC

  • lambda :
  • 我将 Lambda 附加到 VPC as shown here .
  • 这使我可以与公共(public) 3rd 方 api 和我的 protected 资源交谈。我希望拥有一个开放的 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 目的地。虽然这确实将消息注入(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/

    相关文章:

    java - AWS Step Functions 如何处理工作线程/Activity 竞争条件?

    amazon-web-services - 如果记录是由 AWS cognito 中的确认后触发器创建的,那么谁是 DynamoDB 中记录的所有者

    amazon-web-services - "errorMessage": "Parameter validation failed in Lambda calling SageMaker endpoint

    javascript - 错误 : No Firebase App '[DEFAULT]' has been created - call Firebase App. 初始化应用程序()

    javascript - node.js 打开文件覆盖现有文件

    node.js - Node JS Soap 请求中的身份验证

    node.js - 无法在适用于 Linux 的 Windows 子系统(ubuntu)上运行 react 服务器

    amazon-web-services - 无法在 AWS 中验证或上传 CloudFormation 模板

    linux - 运行 aws cli 时出现 Pyexpat 导入错误

    node.js - 无法使用 Node js 在 AWS lambda 函数中将视频文件转换为音频文件