1
1

More than 3 years have passed since last update.

AWS Lambdaのログをtailする

Posted at

はじめに

AWSマネジメントコンソールでAWS Lambdaのログを確認するのは面倒だ。
そう思ってググったんだが、当時、それっぽいことをやってる事例を見つけられなかった。

さて、AWS LambdaのログはCloudWatchログに記録され、次のような構造をしてる。

CloudWatchログでは、個々の記録をイベントと呼んでるようだ。
一連のイベントをひとまとまりにしたものを、ログストリームと呼んでるようだ。
ログストリームは関数ごとにまとめられており、それをロググループと呼んでるようだ。

これを踏まえると、tailは次のような流れになる。

tailしたいロググループを特定する
while True:
    tailしたいロググループから最も新しいログストリームを見つける
    if 見つけたログストリームの最初の取得だったら:
        ログストリーム内のイベントを最初から取得する
    else:
        ログストリーム内の続きのイベントを取得する
    少し待つ

Pythonで書いたので

とりあえずboto3のインポートは必要となる。

#!/usr/bin/python3

import boto3

CloudWatch Logsのクライアントを作成する

# 最も単純な場合
aws_cwl_client = boto3.client('logs')
# プロファイル指定が必要ある場合
aws_cwl_client = boto3.session.Session(
    profile_name='プロファイル名').client('logs')
# プロファイルに加えてリージョン指定が必要ある場合
aws_cwl_client = boto3.session.Session(
    profile_name='プロファイル名',
    region_name='リージョン名').client('logs')

ロググループ名の一覧は次のように取得できる

log_group_list = []
response = aws_cwl_client.describe_log_groups()
while True:
    for value in response['logGroups']:
        log_group_list.append(value['logGroupName'])
    if 'nextToken' not in response:
        break
    response = aws_cwl_client.describe_log_groups(nextToken=response['nextToken'])
print(log_group_list)
# ロググループ名の一覧が表示される

tail本体は次のようになる

log_group_name = 'tailしたいロググループの名前'
stream = ''
next_token = ''
while True:
    response = cwl.describe_log_streams(
        logGroupName=log_group_name,
        orderBy='LastEventTime',
        descending=True,
        limit=1)
    if stream != response['logStreams'][0]['logStreamName']:
        stream = response['logStreams'][0]['logStreamName']
        print('---- %s ----' % stream)
        next_token = ''
    if next_token == '':
        response = cwl.get_log_events(
            logGroupName=group, logStreamName=stream)
    else:
        response = cwl.get_log_events(
            logGroupName=group, logStreamName=stream, nextToken=next_token)
    if len(response['events']) > 0:
        for value in response['events']:
            msg = value['message']
            if msg.startswith('START RequestId: '):
                temp = time.strftime(
                    '%Y-%m-%dT%H:%M:%S',
                    time.localtime(value['timestamp'] / 1000))
                print('---- %s.%0d ----' % (temp, value['timestamp'] % 1000))
            print(msg.replace('\r', '\n').replace('\n\n', '\n').rstrip())
        next_token = response['nextForwardToken']
    time.sleep(3)

補足

いまググったら、awslogsが見つかった。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1