我的设计就是这样,
Cloudtrail->跟踪-> cloudwatch日志和S3-> lambda->松弛
***
日志很好,包括eventVersion和Name以及其他内容 但是,那部分cloudwatch日志-> lambda是问题所在。当我打印出“事件”数据(原始数据首先到达lambda)进行调试时,它像这样 {awslogs: {data:'H4sIA ~~~~~~~所有随机字母。不喜欢eventVersion等。
我认为编码存在问题。我尝试将其发送为JSON和cloudtrail类型。我当然只筛选我想从lambda的日志中获取的事件,例如(if event =='updategroup')&&等等。 我没有想先捕获所有事件的过滤模式, 用js编写的lambda。
请帮助,或提出更好的设计。
答案 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);
}
}