WSL2でコマンド実行時に時刻ずれのエラーが発生したときの原因と対処

2023.10.05

こんにちは、ゲームソリューション部のsoraです。
今回は、「WSL2でコマンド実行時に時刻ずれのエラーが発生したときの原因と対処」について書いていきます。

発生した事象

Windows10にてWSL2でUbuntuを使用している環境で、Terraformを実行しようとしたときに以下のエラーが発生しました。

$ aws-vault exec [profile名] -- terraform plan
aws-vault: error: exec: Failed to get credentials for [profile名]: operation error STS: AssumeRole, https response error StatusCode: 403, RequestID: 8bc101e9-853a-4b33-a415-xxxxxxxxxxxx, api error SignatureDoesNotMatch: Signature expired: 20231005T033420Z is now earlier than 20231005T035503Z (20231005T041003Z - 15 min.)

エラーの内容としては、ワンタイムパスワードを発行した日時より早い時間に実行されているのがおかしいということです。
要するに、WSL2の時刻が実際の時刻とずれていることにより発生しているエラーです。
実際の時刻が13:13あたりのときに、WSL2のシステムクロックを確認してみるとずれていることがわかりました。

$ date
Thu Oct  5 12:36:28 JST 2023

原因

WSL2をシャットダウンするなどしなくても、PCをスリープ状態から復帰させたりするとずれが発生するとのことでした。
Hyper-V ドライバ 〜 Hyper-V 〜 Windows の連携が上手くいっていないことから発生するとのことでした。
より詳細なことは以下ページをご確認ください。
WindowsとWSL2の時刻のずれを修正する

対処

対処方法としては色々ありましたが、常に同期が取れている必要がないこと(コマンド実行時だけで良いこと)から、WSL2のRTCからシステムクロックを設定することで解決しました。

# 対処前のシステムクロックの確認
$ date
Thu Oct  5 12:36:28 JST 2023

# WSL2のRTCからシステムクロックを設定
$ sudo hwclock -s
# もしくは
$ sudo hwclock --hctosys

# 対処後のシステムクロックの確認
$ date
Thu Oct  5 13:13:09 JST 2023

この対処をした後に、最初に実行しようとしたコマンドを実行すると問題なく動作しました。

ちなみにこの対処だと、VM上(WSL2)のハードウェアクロックからシステムクロックへ反映させているだけっぽいので、実際の時刻(ホストマシンのRTC)とは結局ずれている可能性があります。
この件については、申し訳ございませんが、今回の対処で上手くいかなかったときに考えようかなと思います。

また、今回の対処は一時的な対処なので、定期バッチを動かしていたり、常に時刻同期が取れている必要がある場合は、以下が参考になると思います。
WSL2 date incorrect after waking from sleep

最後に

今回は、「WSL2でコマンド実行時に時刻ずれのエラーが発生したときの原因と対処」を記事にしました。
どなたかの参考になると幸いです。