深夜2時のデプロイの壁
Vertex AI経由でGemini 1.5 Proを統合するPythonスクリプトをちょうど書き終えたところです。IDEでは完璧に見えます。コードを実行して素晴らしいAIレスポンスを期待していたのに、ターミナルには403エラーが表示されてしまいます。これは非常に腹立たしいことですが、修正方法はたいてい数クリックか、コマンド一つで完了します。
実際のエラーメッセージ
google.api_core.exceptions.PermissionDenied: 403 Vertex AI API has not been used in project PROJECT_ID before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/aiplatform.googleapis.com/overview?project=PROJECT_ID
このエラーは、新しいGoogle Cloudプロジェクトを立ち上げるときに最もよく見られます。デフォルトでは、GCPはほとんどのサービスを無効化した状態で保持しています。これはセキュリティ上の措置であり、誤った課金を防ぐためでもありますが、少しのセットアップなしにエンドポイントへのリクエストを開始できないことを意味します。
403エラーのデバッグ
まずPROJECT_IDを再確認してください。シンプルに聞こえますが、開発者はgcloudの設定でデフォルトプロジェクトを使うことが多く、それが古いサンドボックスや全く別のクライアントアカウントである可能性があります。ここで一つの文字列が間違っていると、何も動作しません。
CLIが現在どのプロジェクトを対象にしているか確認するには、次のコマンドを実行します:
gcloud config get-value project
IDが正しい場合、問題は管理上のものです。APIが単純に無効化されています。Google Cloudでは、プロジェクトオーナーとして完全な権限を持っていても、リクエストを処理する前にすべてのサービスに明示的にオプトインする必要があります。
解決策:APIを有効化する
修正方法は2つあります。コンソールは一回限りの修正に最適で、CLIは自動化に向いています。
方法1:Google Cloudコンソール
- エラーメッセージに含まれている特定のURLをコピーします。通常、固有のプロジェクトIDが含まれています。
- ブラウザに貼り付けます。マルチアカウントのセッションでは誤ったプロジェクトダッシュボードにリダイレクトされることが多いため、正しいGoogleアカウントでログインしていることを確認してください。
- 有効にするボタンをクリックします。
- 60〜90秒ほど待ちます。APIの有効化がGoogleのグローバルエッジロケーション全体に反映されるまで少し時間がかかります。
方法2:gcloud CLIを使用する
ターミナル派の方はブラウザを完全にスキップできます。複数のプロジェクトを管理している場合や、SSH経由でリモートサーバー上で作業している場合、この方法はずっと速いです。
# セッションの認証
gcloud auth login
# 正しいプロジェクトで作業していることを確認
gcloud config set project YOUR_PROJECT_ID
# Vertex AIサービスを有効化
gcloud services enable aiplatform.googleapis.com
IAM権限の修正
APIを有効化するだけでは半分の解決です。サービスを有効化した後もまだ403エラーが表示される場合、あなたのID(個人のメールアドレスまたはサービスアカウント)に適切な権限がない可能性があります。Vertex AIの作業では、通常roles/aiplatform.userロールが必要です。
CLIを使ってこの権限を素早く付与します:
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
--member="serviceAccount:your-service-account@YOUR_PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
スクリプトをローカルで実行していてサービスアカウントキーをまだ設定していない場合、ローカルの認証情報を更新したことを確認してください:
gcloud auth application-default login
修正の確認
この最小限のPythonスニペットで接続をテストしてください。Vertex AI SDKを初期化してシンプルなレスポンスを生成しようとします。これが動作すれば、環境は本番環境への準備が整っています。
import vertexai
from vertexai.generative_models import GenerativeModel
PROJECT_ID = "your-project-id"
REGION = "us-central1"
vertexai.init(project=PROJECT_ID, location=REGION)
try:
model = GenerativeModel("gemini-1.5-flash")
response = model.generate_content("Confirm API is active.")
print(f"成功!レスポンス: {response.text}")
except Exception as e:
print(f"確認に失敗しました: {e}")
学んだ教訓と予防策
GCPは「デフォルトでセキュア」です。明示的に要求するまで何も有効化されません。新しいAIインフラを構築する際は、TerraformスクリプトやセットアップドキュメントにAPIの有効化ステップを必ず含めてください。これにより、チームが後で同じ403の壁にぶつかることを防げます。
LinuxのVMにデプロイする場合、JSONキーのファイルパーミッションに注意してください。OSがアプリケーションによるサービスアカウントキーの読み取りをブロックしているだけなのに、403エラーのデバッグに何時間も費やす開発者を見てきました。Unix Permissions Calculatorを使うと、キーが600に設定されているか(プライベートかつセキュアで、アプリケーションからは読み取り可能)を確認できます。この小さな確認が、本番環境へのプッシュ時の大きな頭痛を防いでくれます。
新しいプロジェクトのチェックリストには常に以下を含めてください:
aiplatform.googleapis.comを有効化する。- 特定のGemini機能のために
generativelanguage.googleapis.comを有効化する。 - 関連するサービスアカウントに
Vertex AI ユーザーロールを割り当てる。 - ローカルマシンの
application-default認証情報を更新する。

