【发布时间】: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