Open2
CloudWatch Logs を subscribe する lambda の作り方と受け取ったデータの扱い方をメモする
やりたいこと;
- CloudFormation で CloudWatch Logs のログを受け取る lambda を構成したい
- lambda (python) で受け取った event をデコードする
参考;
CloudWatch Logs のログレコードを Lambda の event 引数で扱う
マネジメントコンソールから Sample event を見てみると、 cloudwatch-logs
で以下のようなデータを確認できる
{
"awslogs": {
"data": "H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwWQRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpLwivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQDQiMdxRQEAAA=="
}
}
$.awslogs.data
に入っているのがログ情報。
これに対応する元々のデータは JSON テキストであり、そこから gzip 圧縮 -> Base64 エンコードしている。
よって、プログラム上でログデータを扱うためにには $.awslogs.data
のデータに逆変換 (Base64 decode -> gzip dezompression -> json parse) をかければ良い。
event = {
"awslogs": {
"data": "H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwWQRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpLwivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQDQiMdxRQEAAA=="
}
}
# Base64 decode
import base64
tmp: bytes = base64.b64decode(event["awslogs"]["data"])
# gzip decompression
import gzip
tmp: bytes = gzip.decompress(tmp)
# json parse
import json
log_data = json.loads(tmp)
print(json.dumps(log_data, indent=4))
print 文の結果は以下
{
"messageType": "DATA_MESSAGE",
"owner": "123456789123",
"logGroup": "testLogGroup",
"logStream": "testLogStream",
"subscriptionFilters": [
"testFilter"
],
"logEvents": [
{
"id": "eventId1",
"timestamp": 1440442987000,
"message": "[ERROR] First test message"
},
{
"id": "eventId2",
"timestamp": 1440442987001,
"message": "[ERROR] Second test message"
}
]
}