ツール プログラミング

AWS Lambda PowertoolsのtimestampをJSTにする

2023-03-11




最近、仕事でAWS Lambdaを使ってます。

Python書くの楽しい。
プロジェクトのメイン言語はPHPだけど、PHPは書いててストレス溜まるからもうポイしたいw

ということで、Lambdaのログ周りを簡単にするためにAWS Lambda Powertoolsを導入してみました。

便利は便利だけど、timestampでハマったのでメモ。

導入方法

Lambdaはある前提で。
今回はLoggerについてだけ書きます。

Lambda Consoleでモジュールを追加

AWS Lambda Powertoolsは標準モジュールに含まれていないのでLayersから追加します。

Layersをクリック。

コードタブの下にあるレイヤーに飛びます。
これはもう追加済みの状態になってますが。

レイヤーの追加をクリック。

アーキテクチャを確認します。
ドキュメントから対象のARNをコピーして、{region}を対象のものに置換してください。

東京リージョンならこう。

ARNを指定を選択してARNを入力。
検証ボタンをクリックして問題がなければ追加してください。

PythonでLoggerを用意

最小構成だとこう。
デコレータを付けるのがポイントですかね。

これで出力されるのがこう。
何も設定してないのにいろいろ出てますね。
timestampもちゃんと出てます。

まぁこれ、UTCなんですけどね!!
CloudWatch側はローカルタイム=JSTになってます。

timestampをJST(日本時間)にする

LambdaというかAWSは基本UTCなので想定内。
でもやっぱり日本時間のほうが便利なのでなんとかJSTにしたい。

環境変数にタイムゾーンを設定

ドキュメントを読むと、タイムゾーンさえ変えてしまえば何とかなりそうな感じ。

Timestamp with milliseconds, by default uses local timezone
(ミリ秒単位のタイムスタンプ。デフォルトではローカルタイムゾーンを使用します。)

Standard structured keys

ということでLambdaの環境変数に以下を追加します。

  • キー:TZ
  • 値:Asia/Tokyo

以前はTZはAWSの予約語だったので使っちゃダメ!と言われていましたが、現在は予約されていない環境変数に移動したので大丈夫。

これで日本時間になったのでは?!

と期待を込めて確認。
念のため標準モジュールでも出してみます。

結果は…

  • 標準モジュール:JST
  • aws_lambda_powertools:UTC
なんでだよ!!

ローカルタイム使うって言ったじゃん。
よく見るとミリ秒も取れてないのでは?
※ミリ秒は大文字Fで取れました

タイムゾーンを確認

%Zを追加して、実際にどんな状態なのか見てみると

UTCじゃなくGMTでした。

ドキュメント曰くutc=Trueを設定すればUTCになるとのこと。

でもこれデフォルトがFaliseなんですよね。
UTCじゃなくGMTになってるし。
一応Trueにして実行してみましたがやっぱりだめでした。

ソースを確認

ググってもそれらしいものが見つからなかったので、ローカル環境にインストールしてソースを追いかけてみました。
対象ソースはこれ。

formatTime()を覗くと、self.use_rfc3339_iso8601の値で分岐していました。

このパラメータをドキュメントで探してみると

use_rfc3339. This flag will use a format compliant with both RFC3339 and ISO8601: 2022-10-27T16:27:43.738+02:00
(use_rfc3339を使用します。このフラグは、RFC3339とISO8601の両方に準拠したフォーマットを使用します: 2022-10-27T16:27:43.738+02:00)

Date formatting

なるほど?
これを使うとどうにかなるかも。

use_rfc3339を指定

datefmtの代わりにuse_rfc3339を指定してみます。

これを実行すると…

無事にJSTになりました!!

よかったよかった。
無駄にWrapしてあれやこれやしてましたが、そんなの全然いらなかったですね。

コード最終形

これだけ。
めちゃくちゃシンプルです。

これを実行するとこう。
いい感じ。

必要なら項目の追加もできるし、Lambdaのログ管理はこれでよさそうですね。

関連記事

AWS Lambda Powertoolsで外部ファイルのログを出力する

Lambdaって、lambda_function.py以外にもファイル使うことありますよね。 そんな場合でもAWS Lambda Powertoolsを使うと簡単にログを取ってくれます。 が。 ちょっ ...

続きを見る

AWS Lambda Powertools Loggerのlocationをformatする

こいつをやってて。 locationってformatできないのかなぁ。 毎回Messageにクラス名やら関数名やら書くのは面倒だぞ。。。 と思っていたらできました。 ドキュメントには(たぶん)書いてな ...

続きを見る

-ツール, プログラミング
-, ,

© 2024 そんなこと猫でもできる Powered by AFFINGER5