背景
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"]