this answer 部分告知了一个类似的问题,通过反复试验以及谁知道还有什么其他的谷歌搜索,我最终放弃了 AWS 指标和 AWS 警报,而是使用了一个新的 Lambda 函数,该函数由任何我选择的日志组的数量。我保留了 SNS 功能,如果您拥有自己的电子邮件域,则很容易设置。
创建新的 Lambda 函数后,会显示搜索蓝图的选项,搜索 log 会产生(以及其他选项)cloudwatch-logs-process-data 蓝图。它也可以从头开始创建,因为它的代码只是这样:
const zlib = require('zlib');
exports.handler = async (event, context) => {
const payload = Buffer.from(event.awslogs.data, 'base64');
const parsed = JSON.parse(zlib.gunzipSync(payload).toString('utf8'));
console.log('Decoded payload:', JSON.stringify(parsed));
return `Successfully processed ${parsed.logEvents.length} log events.`;
};
然后我选择了多个触发器作为我希望监控的日志组,将它们的过滤器模式设置为单词ERROR,并将它们的过滤器名称设置为我想要的电子邮件主题。
使用蓝图中的控制台日志,我创建了一个这种格式的测试事件:
{
"awslogs": {
"data": "LONG_STRING_OF_ENCODED_CHARACTERS_FROM_ABOVE_CONSOLE_LOG_HERE"
}
}
我更喜欢这样修改蓝图代码:
const zlib = require('zlib');
const aws = require('aws-sdk');
const ses = new aws.SES({ region: '<some-region-1>' });
exports.handler = async function (event) {
const payload = Buffer.from(event.awslogs.data, 'base64');
const parsed = JSON.parse(zlib.gunzipSync(payload).toString('utf8'));
const bodyText = JSON.stringify(parsed, null, 2).replace(/\\n/g, ' \\\n ').replace(/\\t/g, '\\\n ');
console.log('bodyText:', bodyText);
var params = {
Source: '<some_email@example.com>',
Destination: {
ToAddresses: ['<some_email@example.com>'],
},
Message: {
Subject: { Data: parsed.subscriptionFilters[0] },
Body: {
Text: { Data: bodyText },
},
},
};
return ses.sendEmail(params).promise();
};
它有效,如果 Lambda 函数记录错误(我的每月 AWS 账单也没有明显增加),我会立即收到一封电子邮件。