AWS Lambdaのloggerのフォーマットを変更する (Python 3.6)

2017.04.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、虎塚です。

AWS LambdaのログをCloudWatch Logsに出力している場合、ログをフィルタリングして利用することがあります。ログをアドホックに検索するだけなら気にしなくてもよいのですが、ログのレベルやメッセージ内容をもとに大事な後続処理を動かしたい場合は、デフォルトのログフォーマットを整形してから使います。これは、もし処理系の設定が変わってしまっても、Lambdaを組み込んだシステムが問題なく動くようにするためです。

この記事では、Lambda関数をPythonで書くときに、loggerのフォーマットを変える方法を記述します。

設定と動作確認

AWS Management Consoleにログインして、AWS Lambda Dashboardを開きます。Lambda関数一覧の画面で、[Create a Lambda function]ボタンをクリックします。

Blueprint一覧の画面で、runtimeのドロップダウンリストからPython 3.6を選択し、hello-world-python3をクリックします。

トリガーの設定画面では、何も入力せずに次へ進みます。関数の設定画面で、適当な関数名 (logger-checker) をつけて、コードを次のように変更します。

from __future__ import print_function

import logging
import sys
import time

logger = logging.getLogger()
for h in logger.handlers:
  logger.removeHandler(h)

h = logging.StreamHandler(sys.stdout)

FORMAT = '%(levelname)s %(asctime)s [%(funcName)s] %(message)s'
h.setFormatter(logging.Formatter(FORMAT))
logger.addHandler(h)

logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    logging.info('instance is running.')
    logging.error('instance has stopped.')
    return

上のコードでは、所与のロギングハンドラを取り除き (複数設定されたハンドラをすべて除去するために繰り返し処理をして)、新規にロギングハンドラを追加しています。

Lambda関数の実行ロールには、ダイアログにしたがうと自動的に生成されるlambda_basic_executionを選びます。次の画面に進んで設定を確認したら、[Create function]ボタンをクリックします。

Lambda関数が作成されたら、[Test]ボタンをクリックします。Lambda関数に渡す引数が表示されますが、ここでは使わないので何も変更せずに、[Save and Test]をクリックします。

次のような実行結果が表示されます。

START RequestId: 8eb86498-2d72-11e7-8009-b9f1ce52ac5c Version: $LATEST
INFO 2017-04-30 06:59:30,461 [lambda_handler] instance is running.
ERROR 2017-04-30 06:59:30,461 [lambda_handler] instance has stopped.
END RequestId: 8eb86498-2d72-11e7-8009-b9f1ce52ac5c
REPORT RequestId: 8eb86498-2d72-11e7-8009-b9f1ce52ac5c	Duration: 0.37 ms	Billed Duration: 100 ms 	Memory Size: 128 MB	Max Memory Used: 20 MB

整形されたloggerのレベル、時刻、ファイル名、メッセージが、表示されました。

補足

この記事は、次のコードを参考にしました。

今回は省略しましたが、このような設定はLambda関数ハンドラのファイルに直接書くのではなく、次の記事のように設定ファイルに外出しして、インポートしたほうが見やすいと思います。

その他、もっとこんなふうに書いたほうがいいよ、といったご指摘がありましたら、ぜひ教えてください。お願いいたします。

おわりに

AWS Lambda (Python) でloggerのフォーマットを変更する方法を記述しました。

AWS Lambdaはマネージドな環境で実行される便利なサービスですが、ログをパースする後続処理がある場合には、処理系の暗黙の設定をそのまま使わず、出力を明示的に整形しましょう。

それでは、また。