はじめに
こんにちは。ニフティ株式会社の山田です。
今回はAWS Lambdaのログレベルが意図せず無効化されていた事象に遭遇したので、その体験について紹介します。
概要
AWS Lambdaの基盤ログをJSON形式で出力できるようになったため、設定を変更したら意図せずログレベルが無効になっていました。
事象
前提
- Lambda PowertoolsのLoggerでログを出している
POWERTOOLS_LOG_LEVEL
環境変数で出力ログレベルを制御している
起こったこと
AWS LambdaのログはAWS CloudWatch Logsに流れるので、JSON形式で出力することが一般的です。
ところがLambda基盤が出すstart、stopなどのログはプレーンテキスト形式で固定されており、構造化されていないため検索が困難でした。
ここが2023/11のアップデートで変更され、JSON形式で出力できるようになりました。
AWS Lambda の高度なログ制御機能のご紹介 | Amazon Web Services
というわけでCDKから
1 2 3 4 5 |
PythonFunction( ... logging_format=LoggingFormat.JSON, ) |
と設定したところ、環境変数によるログレベル設定が効かなくなり、INFOレベル固定となってしまいました。
(元々WARNINGに設定されており、INFOになったことでAWS CloudWatch Logsの料金が跳ね上がり発覚しました)
原因
AWSコンソールから見るとわかりやすいのですが、JSONへの変更はただフォーマットを変えるだけではなく、Advanced Logging Control(ALC)を有効にすることを意味します。そして、ALCにはログレベルの制御が含まれていました。

問題となるのはアプリケーションログレベルで、この設定により
- 標準ロガー(Pythonだとlogging.Logger)の出力ログレベルを設定値で制限する
- Logger側がINFOでも、ALC側がWARNならWARN以上しか出力されない
AWS_LAMBDA_LOG_LEVEL
環境変数にログレベルを設定する
という動作になります。
さらにLambda PowertoolsはAWS_LAMBDA_LOG_LEVEL
環境変数を最優先のログレベル設定として取り扱います。
Logger – Powertools for AWS Lambda (Python)
結果として、ALCのログレベルしか参照されておらず、POWERTOOLS_LOG_LEVEL
環境変数は機能しない状態となっていました。
対策
POWERTOOLS_LOG_LEVEL
環境変数をやめ、ALCによる設定に変更しました。
1 2 3 4 5 6 7 8 |
PythonFunction( ... logging_format=LoggingFormat.JSON, + application_log_level_v2=ApplicationLogLevel.WARN, - environment={ - "POWERTOOLS_LOG_LEVEL": "WARNING", - } ) |
まとめ
新しい設定を導入するときは、設定される内容の範囲を確認するようにしましょう。