aws从cloudwatch日志组到lambda的传入数据已损坏

时间:2018-12-05 00:57:03

标签: amazon-web-services aws-lambda

我的设计就是这样,

Cloudtrail->跟踪-> cloudwatch日志和S3-> lambda->松弛

                                        ***

日志很好,包括eventVersion和Name以及其他内容 但是,那部分cloudwatch日志-> lambda是问题所在。当我打印出“事件”数据(原始数据首先到达lambda)进行调试时,它像这样 {awslogs: {data:'H4sIA ~~~~~~~所有随机字母。不喜欢eventVersion等。

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

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

3 个答案:

答案 0 :(得分:1)

来自Using CloudWatch Logs Subscription Filters - Amazon CloudWatch Logs

  

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

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

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

答案 1 :(得分:1)

以下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)

答案 2 :(得分:0)

Cloudwatch的C#版本日志记录到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);
    }
}