ローカル環境でアプリケーションデフォルト認証 (ADC) を使うやり方から、EC2環境でWorkload Identity連携とかいうのを使って認証するやり方に挑戦したけど、うまくいかないのでサービスアカウントキーで認証するまで。
[事前準備]
終わったら、ローカル環境ではGoogleアカウントを使ってADC認証する仕組みが使えるので、以下のコマンドを実行する。
gcloud init
gcloud auth application-default login
正常に終わると、~/.config/gcloud/application_default_credentials.json が作成されるのでこれで使えるのかと思ったら、InactiveRpcError発生。
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
status = StatusCode.PERMISSION_DENIED
details = "Your application is authenticating by using local Application Default Credentials.
The texttospeech.googleapis.com API requires a quota project, which is not set by default. To learn
how to set your quota project,
see https://cloud.google.com/docs/authentication/adc-troubleshooting/user-creds ."
debug_error_string = "UNKNOWN:Error received from peer ipv4:172.217.175.42:443
{created_time:"2025-02-22T18:19:29.301873565+09:00", grpc_status:7, grpc_message:"
Your application is authenticating by using local Application Default Credentials. The
texttospeech.googleapis.com API requires a quota project, which is not set by default.
To learn how to set your quota project,
see https://cloud.google.com/docs/authentication/adc-troubleshooting/user-creds ."}"
gcloud init起動したあとブラウザが起動してGoogleにログインするとこんな画面出たけど、
Pick cloud project to use:
[1] takoyakisensei
[2] Enter a project ID
[3] Create a new project
APIを有効にしたプロジェクトを選択するべきだったけど、他のを選んでたのが原因みたい。
無事ローカル環境では使えるようになったので、EC2の環境で試してみる。AWSとか外部からGoogle Cloudのサービス使うにはWorkload Identity連携とかいうのを使うのが推奨らしいけど、うまくいかないのでサービスアカウントキーで妥協した。こっちは秘密鍵・公開鍵で認証するやり方。
EC2にもクライアントライブラリをインストールして、これで使えるのかな?と思ったら今度はDefaultCredentialsError発生。
File ".venv/lib/python3.12/site-packages/google/auth/_default.py", line 719, in default
raise exceptions.DefaultCredentialsError(_CLOUD_SDK_MISSING_CREDENTIALS)
google.auth.exceptions.DefaultCredentialsError: Your default credentials were not found.
To set up Application Default Credentials, see
https://cloud.google.com/docs/authentication/external/set-up-adc for more information.
EC2はGunicornで動いてるので勝手が違う。環境変数
export GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"
を読み込んでないみたい。ChatGPTに相談したら、systemdのEnvironmentの設定では?と教えてくれたので、そういえばDjangoのDJANGO_SETTINGS_MODULEここで設定したんだったと思い出す。
Environment="DJANGO_SETTINGS_MODULE=app.config.production"
Environment="GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"
systemdとgunicornリロードして解決。