km_output

お勉強と趣味のアウトプット

【AWS】LambdaでCloudWatchログをデコードしようとして手間取った話

とあるLambda(複数)を監視して、タイムアウトエラーが発生したらslack通知する力技構成を作成中のこと。

※構成の詳細は以下。

slack通知用Lambdaのトリガに、CloudWatch Logsを選択。

対象ログはタイムアウトエラー検出対象となる Lambda のログ。

メトリクスフィルターとして文字列「Task timed out after」を設定。

タイムアウトエラー検出したい Lambda でタイムアウトエラーが起こればslackへ通知される仕組み。

トリガであるCloudWatch Logsのログデータから Lambda 関数名拾おうと思ったら、まずログをデコードしないといけないっぽい。

qiita.com

下記のページを見つけて、これだ!!と思ったのも束の間、Python3とはコードの差分があるみたい。

inokara.hateblo.jp

結局は以下のようにデコード。めでたし、めでたし。

def lambda_handler(event, context):
    json_decode_data = decode_function(event['awslogs']['data']);
    print(json_decode_data); #デコードできていることを確認。
    logGroup_name = json_decode_data['logGroup'].rsplit("/", 1)
    lambda_function_name = logGroup_name[1] #ここでLambda関数名を取り出す

# CloudWatch Logsデータのデコード処理をする関数
def decode_function(data):
    # Base64デコードして解凍してデータを取得する
    decoded_data = base64.b64decode(data)
    json_data = json.loads(gzip.GzipFile(fileobj=BytesIO(decoded_data)).read())
    return json_data

そもそもだけど他によい通知方法あれば知りたいなあ。