CloudWatch 记录多个自定义指标过滤器以触发 lambda 函数

CloudWatch log multiple custom metric filters to trigger lambda function

我刚开始学习 aws,我创建了几个 cloudwatch 日志自定义指标过滤器并订阅了相同的 lambda 函数来处理一些事情,但我想让我的 lambda 函数执行不同的操作取决于哪个指标过滤器触发它。在 lambda 函数中(在 python 中)我如何知道哪个指标过滤器触发它?

在 Lambda 函数处理程序中,您将拥有一个事件对象,该对象通常包含有关请求的信息。根据 documentation,这是 base64 编码和压缩的。我想这是因为日志预计会变得相当大。

解压缩后的结构为:

{ messageType: 'DATA_MESSAGE',
  owner: '123456789123',
  logGroup: 'testLogGroup',
  logStream: 'testLogStream',
  subscriptionFilters: [ 'testFilter' ],
  logEvents: 
   [ { id: 'eventId1',
       timestamp: 1440442987000,
       message: '[ERROR] First test message' },
     { id: 'eventId2',
       timestamp: 1440442987001,
       message: '[ERROR] Second test message' } ] }

这可以在 CloudWatch Logs 下的 AWS docs 中找到。

您可以检查事件数据中的 subscriptionFilters 字段以检查哪个过滤器触发了 Lambda。

如果您的 Lambda 是在 NodeJS 中,您可以编写如下内容:

const zlib = require('zlib');
const YOUR_FILTER = 'filter1';

exports.handler = async (event) => {
    const zippedInput = new Buffer(event.awslogs.data, 'base64');
    await new Promise((resolve, reject) => {
        zlib.gunzip(zippedInput, function (e, buffer) {
            const awslogsData = JSON.parse(buffer.toString('utf-8'));
            // Conditions on filters to do something
            if (awslogsData.subscriptionFilters.includes(YOUR_FILTER)) {
                // do something
            } else if (awslogsData.subscriptionFilters.includes('your_other_filter')) {
                // do something else
            }

            resolve();
        });
    })

    return 'Hello from Lambda!'
};