いつものようにPython経由でGoogle Cloud Storageにファイルをアップロードしようとしたら見慣れないエラーが発生しました。ソースも変えてないし認証情報も変更してないのでなかなか原因がわからず苦労したのでメモとして残しておきます。
発生したエラー
google.auth.exceptions.RefreshError
見慣れないエラーですね。Google App Engine(GAE) で動いているアプリからはエラーが発生しないので、昔作った認証情報のJSONファイルが古くなったのかと思いました。でもChromeBookで実行すると問題なく処理終了して、Windowsマシンだけエラーを返す状況でした。同じ認証情報を使ってWindowsだけ認証が得られないので、ソースや認証情報の問題ではないとして他に変わったことが無いか確認することにしました。
【原因】UbuntuとのデュアルブートでOS時刻がUTCに
kaggleコンペでGPUが使えるLinuxマシンが必要になったので、Windowsとデュアルブートしたのですが、その際にWindowsの時刻がUTCになったんですよね。会社でAWS上の分析基盤開発していた時に日付をまたいだAPI実行試験をするためにシステム時刻を変更したら同じようなエラーが出たので、システム時刻を直したら無事アップロード出来るようになりました。
※kaggleコンペ中はUTCのほうが時差がなくてわかりやすいと思って放置してました。
※Windowsの時刻同期は標準設定では週に1回実施するらしいです。
原因的にGCSに限った話ではなくてGCPの認証全般で言える話だと思います。AWSの時もシステム時間が一定以上ズレていたらRejectするってドキュメントに記載があった気がします(JSTとか時差の分は配慮してくれます。)。デュアルブートで時刻がズレた場合の修正方法は別途記事にします。