Python
AWS
lambda
AWSLambda

AWS Lambdaのタイムゾーンを変更する(コード内での変更は反映されない)

Lambdaのタイムゾーン

AWS Lambdaでは 東京(ap-northeast-1)リージョンであっても タイムゾ-ンはUTCになります。

タイムゾーンと時間を表示する例
import datetime
import os


def lambda_handler(event, context):
    now_dt = datetime.datetime.now()

    print("TZ: {}".format(os.environ['TZ']))
    print("now: {}".format(now_dt))
    print("now_timestamp: {}".format(now_dt.timestamp()))

    return 'Hello from Lambda'

TZ: :UTC
now: 2018-10-19 14:13:02.141871
now_timestamp: 1539958382.141871

タイムゾーンの変更方法

Lambda関数の設定にある「環境変数」で変更することができます。

キーに TZ 、値に Asia/Tokyo と入力します。

lambda-tz.png
同じスクリプトを実行すると次のようにタイムゾーンの変更が反映されています。

TZ: Asia/Tokyo
now: 2018-10-19 23:13:46.994964
now_timestamp: 1539958426.994964

コード内で TZ 環境変数を変えても変更は反映されない

「環境変数」ということで Pythonの os.environ を書き換えてみましたが、タイムゾーンの変更が反映されませんでした。

Lambda関数の「環境変数」の設定を忘れた時の対策として別な方法を考えたほうが良いでしょう。

コード内でタイムゾーンの変更が反映されない
import datetime
import os


def lambda_handler(event, context):
    default_tz = 'Asia/Tokyo'
    if os.getenv('TZ', '') != default_tz:
        os.environ['TZ'] = default_tz
    now_dt = datetime.datetime.now()

    print("TZ: {}".format(os.environ['TZ']))
    print("now: {}".format(now_dt))
    print("now_timestamp: {}".format(now_dt.timestamp()))

    return 'Hello from Lambda'

実行結果を見ると TZだけが "Asia/Tokyo" になっています。

TZ: Asia/Tokyo
now: 2018-10-19 14:15:45.675777
now_timestamp: 1539958545.675777

参考

AWS Lambdaのタイムゾーン変更 - Qiita
https://qiita.com/nullian/items/39ecf1f6d0194b72e8e6

Python で環境変数の取得と追加 | TM Life
http://tmlife.net/programming/python/python-environ.html

16.1. os — 雑多なオペレーティングシステムインタフェース — Python 3.6.4 ドキュメント
https://docs.python.jp/3/library/os.html#os.putenv