Blog

AWS Lambdaのログレベルが意図せず無効化されていた話

はじめに

こんにちは。ニフティ株式会社の山田です。

今回は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から

と設定したところ、環境変数によるログレベル設定が効かなくなり、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による設定に変更しました。

まとめ

新しい設定を導入するときは、設定される内容の範囲を確認するようにしましょう。

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!