运行VPC的AWS Lambda仅发送一次SQS消息

时间:2017-10-23 17:32:08

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

我有一个在私有子网中运行的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的经验太浅,无法弄清楚它是如何影响它的。

我已经尝试过#34;温暖"在sqs中构建handler对象的版本,但是没有更好的工作。

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

1 个答案:

答案 0 :(得分:0)

这似乎是一个连接问题。

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

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

根据the guide here,我已允许通过端口1024-65535向公共子网提供入站流量,但它看起来并不安全。