背景

AWSのECSで動作しているアプリケーションで設定している時刻がおかしいと申告がありました。

アプリケーションで取得した時刻をデータベースに書き込むのですが、その時刻が9時間前になっているという申告でした。

対応したこと

9時間の差というと、すぐに思い浮かぶのはタイムゾーンです。

日本のJSTではなく、標準時刻のUTCになっているのではないかと仮説をたてました。

コンテナのOSのタイムゾーン

コンテナにECS EXECを使用してアタッチし、タイムゾーンを確認したところUSTでした。

そこで、ベースOSのUbuntuに対して、Dockerfileに以下の定義を入れました。

RUN apt upgrade && \
    apt update && \
    apt install -y --no-install-recommends tzdata && \
    ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    apt clean && \
    rm -rf /var/lib/apt/lists/*

そうすると、無事にJSTとなりました。

しかし、解消せず

ベースイメージのOSではJSTとなっているのですが、データベースに書き込んだ時刻はUSTのままでした。

JVMにもタイムゾーンを設定

調べると、JVMにもタイムゾーンがあるとのこと。

そこでDockerfileのCMDに以下の記述に変更しました。これで無事に期待する動作になりました。

JVMにもタイムゾーンがあるんですね。SpringBootの知見も必要であることを実感しました。

CMD ["java", "-Duser.timezone=Asia/Tokyo", "-jar", "/data/app.jar"]

参考

Java 環境のタイムゾーンを設定する方法 | アトラシアン サポート | アトラシアン製品ドキュメント