FireLens に流れるログを Lambda で抽出する

2 min read読了の目安(約2200字

ECS に乗っているコンテナのログを FireLens を経由して Kinesis Firehose -> S3 にログを出しました.ただ,下記の JSON 形式でログが保存されているため,Athena でクエリしようとするとしてもログの詳細を見る時辛いなと思っていました.

{
    "container_id": "xxx",
    "container_name": "xxx",
    "ecs_cluster": "xxx",
    "ecs_task_arn": "arn:aws:ecs:xxx:xxx:task/xxx/xxx",
    "ecs_task_definition": "xxx:xxx",
    "log": "xxx"
}

そこで,Lambda を使って log の部分だけ抽出して S3 に保存したいと思ってやってみました.

ログを抽出するためのコード

Lambda は Python 3.8 で書いているのですが,ログを抽出し,S3に保存するところのみの部分を抜粋してます.S3 には hoge/yyyy/mm/dd/ログファイル名_yyyymmddhhmmss.log のファイル名で保存されるようになってます.

import json
import boto3
import base64
from botocore.exceptions import ClientError
import datetime

s3 = boto3.resource('s3')
BUCKET_NAME = '保存したいバケット名'
DATE=datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9)))
YEAR=DATE.strftime('%Y')
MONTH=DATE.strftime('%m')
DAY=DATE.strftime('%d')
HOUR=DATE.strftime('%H')
MIN=DATE.strftime('%M')
SEC=DATE.strftime('%S')

def lambda_handler(event, context):  
    log_output = []  
    for record in event['records']:
        payload = json.loads(base64.b64decode(record['data']))
        log_detail = payload["log"]
        log_output.append(log_detail)
        key = 'ファイル名_' + YEAR + MONTH + DAY + HOUR + MIN + SEC
        with open('/tmp/'+ key +'', 'w') as f:
            for detail in log_output:
                f.write("%s\n" % detail)
        f.close()
        path = 'hoge' + '/' + YEAR + '/' + MONTH + '/' + DAY + '/' + key + '.log'
        s3.meta.client.upload_file('/tmp/'+ key +'', BUCKET_NAME, path)

S3 に保存されたログのイメージ

S3 に保存されたイメージが下記の画像みたく指定したパスで年月日でフォルダが作られ,ログファイルが作られます.

ファイルを開くと,ログ詳細だけが保存されるようになったのでこれで Athena でいい感じにクエリしていけそうです.

{
    "request_headers": {
        "host": "xx.xx.xx.xx:xx",
        "user-agent": "ELB-HealthChecker/2.0",
    },
    "remote_addr": "xx.xx.xx.xx",
    "request_uri": "/",
    "request_method": "GET",
    "request_time": "2021/05/20 06:30:39",
    "response_time": "0.0004",
    "response_status": 200
}

参考情報

https://docs.aws.amazon.com/ja_jp/firehose/latest/dev/data-transformation.html#data-transformation-status-model