【问题标题】:VPC-running AWS Lambda sends SQS message only once运行 VPC 的 AWS Lambda 仅发送一次 SQS 消息
【发布时间】:2018-04-04 08:23:23
【问题描述】:

我有一个在私有子网中运行的 NodeJS Lambda 函数,允许安全组和 NACL 中的所有传入/传出策略(不安全,但它们可以完成工作)。私有子网有一个 NAT 网关,位于同一 VPC 的公有子网中,因此互联网连接正常。

我的目标是将消息发送到 SQS 队列。

Lambda 代码是这样的:

const AWS = require('aws-sdk')
const sqs = new AWS.SQS()

exports.handler = (event, context, callback) => {
    sqs.sendMessage({
        MessageBody: JSON.stringify(event),
        QueueUrl: 'https://sqs.eu-west-1.amazonaws.com/000000000000/queue-name'
    }, function(err, data) {
        console.log(err, data);
        return callback(err, data);
    });
};

由于某种原因,这个函数只在我放置的每个私有子网中第一次运行。之后它就会超时。

{
  "errorMessage": "2017-10-23T17:07:01.675Z 903aaabc-b814-11e7-a727-19816eaa468a Task timed out after 10.00 seconds"
}

这是日志

START RequestId: 903aaabc-b814-11e7-a727-19816eaa468a Version: $LATEST
END RequestId: 903aaabc-b814-11e7-a727-19816eaa468a
REPORT RequestId: 903aaabc-b814-11e7-a727-19816eaa468a  Duration: 10002.46 ms   Billed Duration: 10000 ms   Memory Size: 128 MB Max Memory Used: 32 MB  
2017-10-23T17:07:01.675Z 903aaabc-b814-11e7-a727-19816eaa468a Task timed out after 10.00 seconds

如果我在未附加到 VPC 的情况下运行该功能,它每次都能完美运行,但我必须在其中添加一些私有资源访问逻辑,因此我无法在 VPC 之外运行它。

我的感觉是,这与函数使用的可重用容器(基础设施单元)有关,但我对 AWS 的总体经验,尤其是 Lambda 经验太浅,无法弄清楚它是如何影响它的。

我已经尝试过在 handler 中构造 sqs 对象的“温暖”版本,但这并没有更好的效果。

有人知道我做错了什么吗?

【问题讨论】:

  • 尝试将sqs = new AWS.SQS() 移动到handler 函数中。我已经看到 AWS 开发工具包创建了一个 HTTP 连接池,当它在 Lambda 处理程序之外创建时会遇到超时问题。
  • 如果容器很热,全局代码不会再次运行。您需要在处理函数中重新初始化全局变量。
  • 你如何确定你有互联网连接?使用 nat gw 等错误配置您的 vpc 非常容易。
  • 就像我说的,我已经尝试在处理程序中移动初始化代码。结果相同:函数第二次运行时超时。
  • @Daniel 看来你是对的,常规的 http 请求也会超时。问题是 NACL 指定的入站流量在端口 80、443 和 49152-65535 上被允许到公共网络。似乎响应来自未打开的不同端口。谢谢!

标签: amazon-web-services aws-lambda amazon-sqs nat amazon-vpc


【解决方案1】:

看来这实际上是一个连接问题。

我有 3 个公共子网和 3 个私有子网。公共子网通过 Internet 网关 (IGW) 将流量路由到 0.0.0.0/0。私有网关通过位于其中一个公共子网中的 NAT 网关将流量路由到 0.0.0.0/0

问题在于连接到公共子网的 NACL 仅允许端口 8044349152-65535 上的入站流量。对 SQS 服务的请求似乎来自与这些不同的端口。

根据the guide here,我已允许通过端口1024-65535 到公共子网的入站流量,尽管它似乎不太安全。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2023-02-17
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    相关资源
    最近更新 更多