Meh*_*ran 1 amazon-web-services amazon-cloudwatch aws-lambda
根据AWS文档所述,默认情况下每个账户一次可以执行1000个并发Lambda函数。当然,这是一个软限制,可以根据请求进行更改。
现在,我的问题是如何监控并发 Lambda 函数执行?
我假设这应该(以某种方式)使用 CloudWatch 来完成。在CloudWatch 的Metrics部分中,遵循以下路径:
All > Lambda > Across All Functions
Run Code Online (Sandbox Code Playgroud)
您可以通过名称查找指标ConcurrentExecutions。我押注于这一点,但与此同时,我没有根据我所做的测试得到数字。在我们到达那里之前,图表上显示的该指标的值不是整数,所以我猜我在这里遗漏了一些东西。但那很好。让我告诉你我进行的测试。
我在 EC2 实例上创建了一个简单的 NodeJs 脚本,如下所示:
const AWS = require('aws-sdk');
const https = require('https');
const sslAgent = new https.Agent({
keepAlive: true,
maxSockets: 200,
rejectUnauthorized: true,
});
sslAgent.setMaxListeners(0);
AWS.config.update({
region: 'us-east-1',
httpOptions: {
agent: sslAgent,
},
});
const lambda = new AWS.Lambda();
function call() {
return lambda.invoke({
FunctionName: "test",
Payload: JSON.stringify({
wait: 5000,
}),
}).promise();
}
(async () => {
let start = Date.now();
const promises = [...Array(200).keys()].map(i => {
return call(new Date(Date.now()).toISOString())
.then(data => {
console.log(`Success (${i})`);
})
.catch(err => {
console.log(`Error (${i}): ${err}`);
});
});
await Promise.all(promises);
let end = Date.now();
console.log((new Date(end - start).toISOString()).substr(11, 12));
})();
Run Code Online (Sandbox Code Playgroud)
此脚本将调用 Lambda 函数(称为test)200 次,而无需等待各个调用返回。在服务器端,我在 Lambda 函数中有以下代码:
exports.handler = async (event, context, callback) => {
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};
return new Promise((resolve) => {
setTimeout(() => {
callback(null, response);
resolve();
}, event.wait);
});
};
Run Code Online (Sandbox Code Playgroud)
此 Lambda 函数将使调用者在输入传递的时间内保持挂起状态(在本例中为 5 秒)。我运行了此测试并验证了 Lambda 函数有 200 个实例同时运行。我通过访问 CloudWatch 并查看生成的日志来验证这一点,发现生成了 200 个日志流(每个执行都有一个单独的日志流)。
但当我使用上述指标时,图表仅显示68.7,首先这是一个奇怪的数字,其次它不是 200。那么这个数字是什么?在哪里可以找到我的 200?
通过询问 AWS 支持人员同样的问题,我得到了答案。在 CloudWatch 中,当您选择一个指标时,它将如下所示:
以前,我完全错过了指标的统计列。显然,这里有不同的选项,帮助我找到并发执行数的选项是Maximum。