Sal*_*lam 6 decode python-3.x aws-lambda amazon-cloudwatchlogs
我已经在CloudWatch日志组中创建了一个订阅过滤器,并将其流式传输到我的lambda函数,但是我的lambda函数却出现错误。
码:
import boto3
import binascii
import json
import base64
import zlib
def stream_gzip_decompress(stream):
dec = zlib.decompressobj(32 + zlib.MAX_WBITS) # offset 32 to skip the header
foo=''
for chunk in stream:
rv = dec.decompress(chunk)
if rv:
foo += rv
return foo
def lambda_handler(event, context):
# Decode and decompress the AWS Log stream to extract json object
stream=json.dumps(event['awslogs']['data'])
f = base64.b64decode(stream)
payload=json.loads(stream_gzip_decompress(f.decode(f)))
print(payload)
Run Code Online (Sandbox Code Playgroud)
错误:
响应:
{
"errorMessage": "decode() argument 1 must be str, not bytes",
"errorType": "TypeError",
"stackTrace": [
[
"/var/task/lambda_function.py",
34,
"lambda_handler",
"payload=json.loads(stream_gzip_decompress(f.decode(f)))"
]
]
}
Run Code Online (Sandbox Code Playgroud)
任何帮助或线索将不胜感激!如果您有其他解决方案,请提出建议。我的要求是使用lambda处理CloudWatch的日志。
提前致谢 !!
小智 12
如果其他人正在寻求有关此主题的帮助。
我采用了稍微不同的方法,但是在事件中确实看到了“ awslog”键。
这是我成功的示例。Python 3.6 Lambda。设置cloudwatch触发器以调用lambda
import gzip
import json
import base64
def lambda_handler(event, context):
print(f'Logging Event: {event}')
print(f"Awslog: {event['awslogs']}")
cw_data = event['awslogs']['data']
print(f'data: {cw_data}')
print(f'type: {type(cw_data)}')
compressed_payload = base64.b64decode(cw_data)
uncompressed_payload = gzip.decompress(compressed_payload)
payload = json.loads(uncompressed_payload)
log_events = payload['logEvents']
for log_event in log_events:
print(f'LogEvent: {log_event}')
Run Code Online (Sandbox Code Playgroud)
以下是我在处理发送到 AWS Lambda 的 CloudWatch Logs 时通常遵循的大纲。
import gzip
import json
from StringIO import StringIO
def lambda_handler(event, context):
cw_data = str(event['awslogs']['data'])
cw_logs = gzip.GzipFile(fileobj=StringIO(cw_data.decode('base64', 'strict'))).read()
log_events = json.loads(cw_logs)
for log_event in logevents['logEvents']:
# Process Logs
Run Code Online (Sandbox Code Playgroud)
我发现您将发送到 AWS Lambda 的数据视为 JSON 对象。您首先要对数据进行 Base64 解码,然后解压缩。解码和解压缩后,您应该获得包含日志信息的 JSON 对象。
| 归档时间: |
|
| 查看次数: |
6159 次 |
| 最近记录: |