Kinesis Firehoseで書込データをバッファリングしてS3にログファイルを出力する

サーバーに物理ログファイルを書くようなイメージでS3にログを出力したいとき、S3はAppend(追記)ができませんが、Kinesis Firehoseを使うことで複数クライアントからの書込データをバッファリングしてS3にファイル出力することができます。

デリバリーストリームを作成

直接データを入れるのでSourceは「Direct Put」、今回は結果をすぐ見たいのでBuffer conditionsは最小にします。
作ったら、テストにマネジメントコンソールからデータを送り込むことができます。
設定が正しければ、しばらくするとS3にファイルが出力されます。

PythonスクリプトからKinesis Firehoseに書き込む

boto3で書き込んでみます。
import boto3
from boto3.session import Session
from datetime import datetime
import json

session = Session(aws_access_key_id='********************',
                  aws_secret_access_key='****************************************',
                  region_name='ap-northeast-1')

client = session.client('firehose')

delivery_stream_name = 's3_logging_stream'

def put_record(data):
    dt_now = datetime.now()
    data['datetime'] = dt_now.strftime('%Y/%m/%d %H:%M:%S')

    response = client.put_record(
        DeliveryStreamName=delivery_stream_name,
        Record={
            'Data': (json.dumps(data) + "\n").encode()
        }
    )
    print('RecordId:' + response['RecordId'])

data_list = [
    {
        'id': 1,
        'name': 'hoge',
    },
    {
        'id': 2,
        'name': 'fuga',
    },
    {
        'id': 3,
        'name': 'piyo',
    },
]
for data in data_list:
    put_record(data)
こんな感じでログがでました。
{"id": 1, "name": "hoge", "datetime": "2020/07/07 00:19:29"}
{"id": 2, "name": "fuga", "datetime": "2020/07/07 00:19:29"}
{"id": 3, "name": "piyo", "datetime": "2020/07/07 00:19:29"}