Open2

CloudWatch Logs を subscribe する lambda の作り方と受け取ったデータの扱い方をメモする

hassaku63hassaku63

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"
        }
    ]
}