我有一个用NodeJS编写的AWS Lambda函数,它由CloudWatch Subscription过滤器触发 . 有人告诉我,Lambda函数中exports.handler的“event”参数是我用来获取Log数据的 .
当我打印时,我看到以下内容与我在实际CloudWatch控制台中看到的人类可读数据完全不同 . 这是什么意思?!?这是我得到的:
{ awslogs: { data: 'H4sIAAAAAAAAAKWS207jMBRFf8XyMwFfYztvURpQpFIqEmYeUIV8S4nUJlXizggh/p3D7Qt4Xfvs47O3/IqPcVnsPnYvp4gLvCq78um2btvypsYXePo/xhmwNlQSKZk0QgE+TPubeTqfQCn/ts2U1tN++eJtmqM9guBD0JzF2CuleiWJ9rLvuZfWyyAAM0u4NULaGIxw1hjgOvggeueYYBHWLWe3+Hk4pWEar4dDivOCi0e8tkcX7NdDTzaEahrH6D+Gumnl7BLx7vOU+l8c04fjFQ8BLuJcaqm1ZkTo3EAUKSUEy3NNieQiJ1wzRSEpBQa61oRSQjRckgaoKdkjJIYiciI4p4Lk/OKnPljPCFUZMRljiNCC0UKKSxhB3X1Z1c2qyF2vvPU00yr6zFCjMglhM+cFM8oCpRRt75tN1WzLNRh+2yB6bDbXdzuE6j/1piu2Z3cYlufPVlB3t22qTXlbF80YhnhFOKnkSvCrdkgRfX+AH0szojbZdF4K1D5UFYj4bff2DvK/Lnc7AgAA' } }
根据以下链接,这个数据没错:http://docs.aws.amazon.com/lambda/latest/dg/eventsources.html#eventsources-cloudwatch-logs
根据StackOverflow中的这个答案,这也是数据没错:KeyError: 'awslogs' ... outEvent = str(event['awslogs']['data']) - Python
非常感谢您的任何帮助!
2 回答
你准确找到了Amazon CloudWatch Logs Sample Event . 因此,基于此,您的
event
对象的结构类似于:What is it?
让我们打开包装,以更好地了解这里发生了什么 . 在这种情况下
event.awslogs.data
将具有以下值:该值实际上是GZIPPED有效负载的 Base64 编码字符串 . 这样做是为了压缩有效载荷,并保持小,同时允许它以JSON传输 .
如果我们对Base64进行解码,然后将其解压缩,我们最终得到以下值:
这个元素如下:
messageType
:可以是DATA_MESSAGE
或CONTROL_MESSAGE
,如果我的理解是正确的,CONTROL_MESSAGE
用于检查lambda的可达性owner
:原始日志的AWS账户IDlogGroup
:原始日志的日志组logStream
:原始日志的日志流subscriptionFilter
:匹配的订阅筛选器名称logEvents
:与您在控制台中看到的内容相关的实际日志How do I use it?
您可以使用CloudWatches _1677317中的以下示例轻松地在Node.js Lambda中实现类似的功能:
希望有所帮助 .
当您看到仅由字符
[A-Z][a-z][0-9][+/=]
组成的字符串时,这通常表示Base64编码 . Base64允许不支持任意二进制数据的传输...承载任意二进制数据,通过使用每个字节仅传送6(而不是8)位的格式对其进行重新编码,使用64(2 ^ 6)个符号,所有其中包括标准ASCII字符,因此与文本传输兼容 .为什么数据是二进制的?
因为它是gzipped . Gzip是一种压缩算法非常好并且在压缩文本方面非常快......但Gzipping文本生成任意二进制数据,因此无法在JSON中序列化,JSON只支持文本(和数字以及true / false / null) .
因此,gzip压缩数据在base64中进行编码,以便在JSON中进行传输 .
您需要将base64表示转换为二进制,并对其进行g-un-zip .
http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SubscriptionFilters.html#LambdaFunctionExample中的示例:
请注意,这使用旧的
context.fail()
和context.succeed()
约定,这显然仍然支持向后兼容性,但不应在新代码中使用 . 见http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-using-old-runtime.html#nodejs-prog-model-oldruntime-context-methods .