【问题标题】:aws incoming data from cloudwatch logs group to lambda is broken从 cloudwatch 日志组到 lambda 的 aws 传入数据已损坏
【发布时间】:2020-10-30 06:46:48
【问题描述】:

我的设计是这样的,

Cloudtrail -> trail -> cloudwatch 日志和 S3 -> lambda -> slack

                                        ***

日志很好,包括 eventVersion 和 Name 和东西 但是,这部分 cloudwatch 日志 -> lambda 是问题所在。当我打印出“事件”数据(原始数据首先到达 lambda)进行调试时,它就像这样 { 日志: { data: 'H4sIA~~~~~~~ 全是随机字母。不像 eventVersion 之类的。

我认为编码有问题。我尝试将其作为 JSON 和 cloudtrail 类型发送。我当然只筛选我想从 lambda 日志中获取的事件,例如 (if event=='updategroup')&& 等等。 没有过滤器模式,因为我想先捕获所有事件, 用js写的lambda。

请提供帮助,或提出更好的设计建议。

【问题讨论】:

    标签: amazon-web-services aws-lambda


    【解决方案1】:

    来自Using CloudWatch Logs Subscription Filters - Amazon CloudWatch Logs

    Lambda 记录中的 Data 属性使用 gzip 格式进行 Base64 编码和压缩。 Lambda 接收到的实际负载采用以下格式 { "awslogs": {"data": "BASE64ENCODED_GZIP_COMPRESSED_DATA"} } 您可以使用以下 Unix 命令从命令行检查原始数据:

    echo -n "<BASE64ENCODED_GZIP_COMPRESSED_DATA>" | base64 -d | zcat
    

    因此,您的 Lambda 函数将需要解压缩然后解码 base64。

    【讨论】:

      【解决方案2】:

      以下 Python3 代码是在 lambda 函数中解码 cloudwatch 事件的示例:

      import json
      import base64
      import gzip
      from io import BytesIO
      
      cw_data = str(event['awslogs']['data'])
      cw_logs = gzip.GzipFile(fileobj=BytesIO(base64.b64decode(cw_data, validate=True))).read()
      log_events = json.loads(cw_logs)
      

      【讨论】:

        【解决方案3】:

        C# 版本的 Cloudwatch 将日志记录到 Lambda:

        public class clsAws
        {
            public clsAwsLogs awsLogs;
        }
        public class clsAwsLogs
        {
            public string data;
        
        }
        public class Function
        {
            public static void CopyTo(Stream src, Stream dest)
            {
                byte[] bytes = new byte[4096];
        
                int cnt;
        
                while ((cnt = src.Read(bytes, 0, bytes.Length)) != 0)
                {
                    dest.Write(bytes, 0, cnt);
                }
            }
        
            public static string Unzip(byte[] bytes)
            {
                using (MemoryStream msi = new MemoryStream(bytes))
                using (MemoryStream mso = new MemoryStream())
                {
                   using (GZipStream gz = new GZipStream(msi, CompressionMode.Decompress))
                    {
                        CopyTo(gz, mso);
                    }
                    return Encoding.UTF8.GetString(mso.ToArray());
                }
            }
            public void FunctionHandler(JsonElement input, ILambdaContext context)
            {
                string json = input.GetRawText();
                clsAws clsAws = new clsAws();
                clsAws = JsonConvert.DeserializeObject<clsAws>(json);
                byte[] data = Convert.FromBase64String(clsAws.awsLogs.data);
                string base64Decoded = Unzip(data);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2020-05-13
          • 2017-06-19
          • 2016-11-27
          • 1970-01-01
          • 1970-01-01
          • 2016-03-22
          • 2018-02-16
          • 2016-06-26
          • 2021-09-26
          相关资源
          最近更新 更多