Vertex AI と Gemini を組み合わせて本番環境を構築しようとしたとき、認証まわりのエラーで詰まった経験はありませんか?「APIキーは有効なのにアクセスが弾かれる」「ローカルでは動くのに Cloud Run で動かない」——そういった症状の多くは、サービスアカウントや Application Default Credentials(ADC)の設定ミスが原因です。
よくある認証エラーの症状
Vertex AI + Gemini の認証エラーは、大きく次の4パターンに分類できます。
パターン①:PERMISSION_DENIED エラー
google.api_core.exceptions.PermissionDenied: 403 Permission 'aiplatform.endpoints.predict' denied on resource
サービスアカウントに必要な IAM ロールが付与されていない場合に発生します。
パターン②:UNAUTHENTICATED エラー
google.api_core.exceptions.Unauthenticated: 401 Request had invalid authentication credentials.
Expected OAuth 2 access token, login cookie or other valid authentication credential.
認証情報が見つからない・有効期限切れ・フォーマット不正の場合に出ます。
パターン③:ADC(Application Default 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
ローカル開発環境や CI/CD 環境で gcloud auth application-default login が未実行の際に発生します。
パターン④:サービスアカウントキーファイルが読み込めない
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/service-account-key.json'
ValueError: Service account info was not in the expected format, missing fields: token_uri
環境変数 GOOGLE_APPLICATION_CREDENTIALS のパスが誤っているか、JSONファイルの中身が壊れている場合です。
原因の分析:なぜ認証エラーが起きるのか
Vertex AI は通常の Gemini API(generativelanguage.googleapis.com)と異なり、Google Cloud のサービスとして IAM で認証・認可を管理します。この違いを把握していないと混乱しやすいです。
主な原因は以下の5つです。
- IAM ロールの不足:サービスアカウントに
Vertex AI User(roles/aiplatform.user)ロールが付与されていない - ADC の未設定:ローカル環境で
gcloud auth application-default loginを実行していない、または古い認証情報が残っている - プロジェクトIDの不一致:コードで指定した
projectが、サービスアカウントが所属するプロジェクトと異なる - リージョンの指定ミス:Vertex AI はリージョンエンドポイントを使うため、
us-central1などの指定が必要 - API の未有効化:Google Cloud コンソールで Vertex AI API が有効になっていない
解決手順:Step by Step
Step 1:Vertex AI API を有効化する
まず Google Cloud コンソールで API が有効になっているか確認します。
# gcloud CLIで確認(有効になっていなければ enable する)
gcloud services list --enabled --project YOUR_PROJECT_ID | grep aiplatform
# 有効化する場合
gcloud services enable aiplatform.googleapis.com --project YOUR_PROJECT_IDStep 2:サービスアカウントを作成して IAM ロールを付与する
# サービスアカウントを作成
gcloud iam service-accounts create gemini-sa \
--display-name="Gemini Service Account" \
--project=YOUR_PROJECT_ID
# Vertex AI User ロールを付与
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
--member="serviceAccount:gemini-sa@YOUR_PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
# (必要に応じて)Storage の読み取り権限も追加
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
--member="serviceAccount:gemini-sa@YOUR_PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/storage.objectViewer"Step 3:ローカル開発で ADC を設定する(個人アカウント利用の場合)
ローカル開発では、サービスアカウントキーよりも ADC(ユーザー認証)が推奨されています。
# ユーザーアカウントでログイン(ブラウザが開く)
gcloud auth application-default login
# 特定プロジェクトをデフォルトに設定
gcloud config set project YOUR_PROJECT_ID
# 確認
gcloud auth application-default print-access-tokenStep 4:サービスアカウントキーを使う場合(本番・CI/CD 向け)
サービスアカウントキーを使う場合は、キーファイルを安全に管理したうえで環境変数に設定します。
# サービスアカウントキーを生成
gcloud iam service-accounts keys create key.json \
--iam-account=gemini-sa@YOUR_PROJECT_ID.iam.gserviceaccount.com
# 環境変数に設定
export GOOGLE_APPLICATION_CREDENTIALS="/absolute/path/to/key.json"
# Pythonコードでの使用例import vertexai
from vertexai.generative_models import GenerativeModel
# プロジェクトとリージョンを明示的に指定
vertexai.init(project="YOUR_PROJECT_ID", location="us-central1")
model = GenerativeModel("gemini-2.5-pro-preview-03-25")
response = model.generate_content("こんにちは、Geminiさん!")
print(response.text)
# 期待する出力例: "こんにちは!何かお手伝いできることはありますか?"Step 5:Cloud Run / GKE などのサーバー環境での設定
Cloud Run や GKE では、インスタンスにサービスアカウントをアタッチするのが最善です。キーファイルを使わずに済むため、セキュリティリスクを最小化できます。
# Cloud Run サービスにサービスアカウントをアタッチ
gcloud run deploy my-service \
--image gcr.io/YOUR_PROJECT_ID/my-image \
--service-account gemini-sa@YOUR_PROJECT_ID.iam.gserviceaccount.com \
--region us-central1 \
--project YOUR_PROJECT_IDPython コード内では認証情報の指定が不要になります:
import vertexai
from vertexai.generative_models import GenerativeModel
# Cloud Run 環境ではメタデータサーバーから自動的に認証情報を取得
vertexai.init(project="YOUR_PROJECT_ID", location="us-central1")
model = GenerativeModel("gemini-2.5-pro-preview-03-25")
response = model.generate_content("Vertex AIからこんにちは!")
print(response.text)Step 6:google-cloud-aiplatform SDK のバージョン確認
古いバージョンの SDK では認証フローが異なる場合があります。
# 現在のバージョン確認
pip show google-cloud-aiplatform
# 最新版へアップデート
pip install --upgrade google-cloud-aiplatform
# 必要な依存パッケージも含めて確認
pip install google-cloud-aiplatform[langchain]解決できたかの確認方法
以下のスクリプトを実行して、認証が正しく機能しているか確認してください。
import vertexai
from vertexai.generative_models import GenerativeModel
import google.auth
# 現在の認証情報を確認
credentials, project = google.auth.default()
print(f"認証情報の種類: {type(credentials).__name__}")
print(f"プロジェクトID: {project}")
# Vertex AI に接続テスト
try:
vertexai.init(project="YOUR_PROJECT_ID", location="us-central1")
model = GenerativeModel("gemini-2.0-flash-001")
response = model.generate_content("テスト: 1+1は?")
print(f"✅ 認証成功!応答: {response.text}")
except Exception as e:
print(f"❌ 認証エラー: {e}")期待する出力:
認証情報の種類: google.oauth2.credentials.Credentials
プロジェクトID: your-project-id
✅ 認証成功!応答: 2です。
予防策:再発防止のベストプラクティス
認証エラーを未然に防ぐために、以下の点を意識してください。
最小権限の原則を守る:roles/aiplatform.user だけで十分なのに roles/owner を付与しないこと。必要なロールを都度確認して付与します。
サービスアカウントキーをコードにハードコードしない:キーのパスや内容をソースコードに直書きしてしまうと、Git に漏洩するリスクがあります。環境変数や Secret Manager を使いましょう。
# ❌ 絶対に避けること
credentials_info = {
"type": "service_account",
"project_id": "YOUR_PROJECT_ID",
# 以下にキーの内容を直書きしない
}
# ✅ 推奨:環境変数か Secret Manager を使う
import os
# GOOGLE_APPLICATION_CREDENTIALS 環境変数に任せる(コードは変更不要)定期的なキーローテーション:サービスアカウントキーは90日ごとに更新する運用が推奨されています。Google Cloud の Key rotation 機能を活用しましょう。
Workload Identity を活用する(GKE 環境):GKE では Workload Identity を使うと、キーファイルなしにサービスアカウントの権限を Pod に付与できます。サービスアカウントキーの管理コストとリスクを大幅に削減できます。
全体を振り返って
Vertex AI + Gemini の認証エラーは、症状さえ正しく読み解ければ、多くの場合 IAM ロールの設定または ADC の設定を直すことで解消できます。
まとめると:
- ローカル開発 →
gcloud auth application-default loginで ADC を設定 - Cloud Run / GCE → サービスアカウントをインスタンスにアタッチ
- GKE → Workload Identity を活用
- CI/CD(GitHub Actions 等) → Workload Identity Federation で対応
本番環境での Vertex AI 活用