【问题标题】:Cloudwatch logs filter to trigger lambda then extract values from log dataCloudwatch 日志过滤器触发 lambda,然后从日志数据中提取值
【发布时间】:2018-08-25 14:05:29
【问题描述】:

请问我有一个来自主题行的问题。 我想创建一个 AWS CloudWatch 日志或事件以从过滤模式触发 Lambda 函数,然后从该日志数据中提取值作为 Python 中 lambda 函数的输出。 例子: 过滤器名称:abcd 要提取的值:01234 到 lambda 函数。 来自日志数据

日志数据: abcd:01234 有什么想法吗?

【问题讨论】:

  • 为了澄清一点,AWS cloudwatch 日志组、日志流和 AWS cloudwatch 事件之间存在一些差异。 AWS cloudwatch 事件具有可以从其他 AWS 服务、aws cli 和定制发送的事件。 Cloudwatch 日志具有过滤器和可以触发 CloudWatch 警报的指标模式,这些警报可以推送到 SNS 主题中。

标签: aws-lambda


【解决方案1】:

这是一种从 CloudWatch 捕获事件的简单方法。日志数据在消息中。您可以在此处处理或将其发送到 Firehose 并在那里进行转换。或者,您可以通过订阅将 CloudWatch 直接发送到 Firehose,但我认为这必须通过 AWS CLI 完成。

import boto3
import gzip
import json
import base64

firehose = boto3.client('firehose',region_name='us-east-2')

def print_result(firehose_return):
    records_error = int(firehose_return['FailedPutCount'])
    records_sent = len(firehose_return['RequestResponses'])
    return 'Firehose sent %d records, %d error(s)' % (records_sent,records_error )

def lambda_handler(events, context):

    cw_encoded_logs_data = events['awslogs']['data']
    compressed_payload = base64.b64decode(cw_encoded_logs_data)
    cw_decoded_logs_data = gzip.decompress(compressed_payload)
    cw_all_events = json.loads(cw_decoded_logs_data)

    records = []

    for event in cw_all_events['logEvents']:
        log_event = {
            "Data": str(event['message']) + '\n'
            }
        records.insert(len(records),log_event)

        if len(records) > 499:
            firehose_return = firehose.put_record_batch(
                DeliveryStreamName = 'streamname   ',
                Records = records
            )
            print_result(firehose_return)
            records = []

    if len(records) > 0:
        firehose_return = firehose.put_record_batch(
            DeliveryStreamName = 'streamname',
            Records = records
)

    print(print_result(firehose_return))

【讨论】:

  • 嗨,请问有没有使用 lambda 示例代码:def lambda_handler(event, context): print(f'Logging Event: {event}') print(f"Awslog: {event[' awslogs']}") cw_data = event['awslogs']['data']
  • 我看不懂评论。
  • 抱歉 - 我在考虑“cloudwatch 日志流到 lambda python”,但是我可以将日志事件导出到 s3 进行分析吗?
  • 是的,您可以使用此代码从 CloudWatch 转到 Lambda 到 Kinesis Firehose 到 s3。
猜你喜欢
  • 2017-06-19
  • 2016-03-22
  • 1970-01-01
  • 2020-06-25
  • 2020-02-17
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 2016-11-27
相关资源
最近更新 更多