AWS
Python3
boto3
CloudWatchLogs

Cloud Watch のログを丸ごとダウンロードする

AWS に Cloud Watch というサービスがありますが、イベントの通知に特化しているようで、ログそのものを取り扱うには最悪な UI となっています。

しかし Cloud Watch にも API が提供されています。API を使ってログを丸々 get してしまいましょう。


op.py

#! /usr/bin/env python3

# -*- coding: utf-8 -*-

import sys
import boto3
import time
from datetime import datetime
from datetime import timedelta

aws_region = リージョン名
log_group = ロググループ名

epoc = datetime(1970, 1, 1)
timestamp = (datetime.strptime(sys.argv[1], '%Y-%m-%dT%H:%M:%S') - epoc).total_seconds() * 1000

logs = boto3.client('logs', region_name=aws_region)

def find_streams(token, timestamp):
def is_valid_stream(stream):
return timestamp < stream.get('lastIngestionTime')

if token is None:
data = logs.describe_log_streams(logGroupName=log_group)
else:
data = logs.describe_log_streams(logGroupName=log_group, nextToken=token)

streams = list(filter(is_valid_stream, data['logStreams']))
if 'nextToken' not in data:
return streams

# レート制限
time.sleep(0.5)

for stream in streams:
print('%s, %s' % (stream['logStreamName'], datetime.utcfromtimestamp(stream.get('lastIngestionTime') / 1000)))
streams.extend(find_streams(data['nextToken'], timestamp))
return streams

streams = [stream['logStreamName'] for stream in find_streams(None, timestamp)]
for stream in streams:
print('*-*-*-*-*-*-*-*-*-*- %s -*-*-*-*-*-*-*-*-*-*' % stream)
def find_event(token, last_token):
if token is None:
data = logs.get_log_events(logGroupName=log_group, logStreamName=stream, startFromHead=True)
else:
data = logs.get_log_events(logGroupName=log_group, logStreamName=stream, startFromHead=True, nextToken=token)
event = data['events']

if data['nextForwardToken'] != last_token:
# レート制限
time.sleep(0.5)
event.extend(find_event(data['nextForwardToken'], token))

return event

events = find_event(None, None)
for e in events:
print('%s' % e['message'])


この Python スクリプトは、「Last Ingestion Time」が指定された日時以降の Log Stream をひたすらgetします。時刻は UTC を指定します。

op.py 2015-03-01T07:00:00

出力の前段では対象となる LogStream の名前と、Last Ingestion Time を出力します。出力の後段では Log Stream の message を出力します。

ローカルに持ってくればこっちのもんです。好きなツールを使って解析しましょう。