【问题标题】:CloudWatch log multiple custom metric filters to trigger lambda functionCloudWatch 记录多个自定义指标过滤器以触发 lambda 函数
【发布时间】:2018-05-20 20:12:06
【问题描述】:

我刚开始学习 aws,我已经创建了几个 cloudwatch log 自定义指标过滤器并订阅了相同的 lambda 函数,但我想让我的 lambda 函数执行不同的操作,具体取决于哪个指标过滤器触发它。在 lambda 函数中(在 python 中)我怎么知道哪个度量过滤器触发它?

【问题讨论】:

    标签: aws-lambda amazon-cloudwatchlogs


    【解决方案1】:

    在 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!'
    };
    

    【讨论】:

    • 我需要用python来做,我在网上看到一些例子来解码和解压缩日志数据以下是我的功能的一部分:def lambda_handler(event, context): outEvent = str(event['awslogs']['data']) outEvent = gzip.GzipFile(fileobj=StringIO(outEvent.decode('base64','strict'))).read()但它返回以下错误:@ 987654327@如何解决这个错误?
    • String.decode 在 python3 中被删除,你应该导入 base64 并改为执行base64.b64decode(outEvent) 之类的操作。
    猜你喜欢
    • 2021-08-19
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 2021-03-21
    • 2017-04-15
    • 2016-12-04
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多