6 6
7> Google Cloud で Claude apps gateway を実行する実装例:Cloud Run または GKE、Cloud SQL for PostgreSQL、Secret Manager、および Google Cloud の Agent Platform への service account 認証。7> Google Cloud で Claude apps gateway を実行する実装例:Cloud Run または GKE、Cloud SQL for PostgreSQL、Secret Manager、および Google Cloud の Agent Platform への service account 認証。
8 8
9<Note>9> [!NOTE]
10 このページでは、Google Cloud で Claude apps gateway を実行する 1 つの方法を説明します。この設定は、サポートされている本番環境デプロイメントではなく、カスタマー管理インフラストラクチャの実装例です。各部分がどのように組み合わさるかを確認してから、自分の環境に適応させてください。プラットフォーム非依存の要件については、[デプロイメントガイド](/docs/ja/claude-apps-gateway-deploy)を参照してください。10>
11</Note>11> このページでは、Google Cloud で Claude apps gateway を実行する 1 つの方法を説明します。この設定は、サポートされている本番環境デプロイメントではなく、カスタマー管理インフラストラクチャの実装例です。各部分がどのように組み合わさるかを確認してから、自分の環境に適応させてください。プラットフォーム非依存の要件については、[デプロイメントガイド](/docs/ja/claude-apps-gateway-deploy)を参照してください。
12 12
13この例では、Google Cloud の Agent Platform をモデルアップストリームとして使用し、Cloud Run または GKE をコンピュートに使用して、Google Cloud に Claude apps gateway をプロビジョニングします。Google Workspace は例の ID プロバイダー(IdP)ですが、OpenID Connect(OIDC)準拠の任意の IdP が機能します。`oidc` ブロックのみが変わります。IdP ごとの詳細については、[ID プロバイダーのセットアップ](/docs/ja/claude-apps-gateway-deploy#identity-provider-setup)を参照してください。13この例では、Google Cloud の Agent Platform をモデルアップストリームとして使用し、Cloud Run または GKE をコンピュートに使用して、Google Cloud に Claude apps gateway をプロビジョニングします。Google Workspace は例の ID プロバイダー(IdP)ですが、OpenID Connect(OIDC)準拠の任意の IdP が機能します。`oidc` ブロックのみが変わります。IdP ごとの詳細については、[ID プロバイダーのセットアップ](/docs/ja/claude-apps-gateway-deploy#identity-provider-setup)を参照してください。
14 14
15<h2 id="what-you’ll-build">15## 構築内容
16 構築内容
17</h2>
18 16
19<Frame>17
20 <img src="https://mintcdn.com/claude-code/-uq-4JE0W_JO5Er5/images/claude-gateway-gcp-architecture.svg?fit=max&auto=format&n=-uq-4JE0W_JO5Er5&q=85&s=cb705151c69128ac0da235852d5600ab" alt="Google Cloud 上の Claude apps gateway の図:Claude Code クライアントは HTTPS 経由でゲートウェイ(Cloud Run または GKE)に接続し、ゲートウェイは VPC 内でプライベート IP Cloud SQL データベースと並行して実行され、セッション状態を保存します。ゲートウェイは OIDC 経由で Google Workspace に対してユーザーをサインインさせ、Secret Manager から設定とシークレットを読み取り、モデルリクエストを Google Cloud の Agent Platform に転送し、デプロイ時に Artifact Registry からイメージをプルします。" width="760" height="400" data-path="images/claude-gateway-gcp-architecture.svg" />
21</Frame>
22 18
23デプロイメントは以下で構成されます:19デプロイメントは以下で構成されます:
24 20
29* `roles/aiplatform.user` を持つ **Service account**、Cloud Run に直接アタッチされるか、GKE 上で Workload Identity 経由でバインドされます25* `roles/aiplatform.user` を持つ **Service account**、Cloud Run に直接アタッチされるか、GKE 上で Workload Identity 経由でバインドされます
30* Cloud Run 前の内部 Application Load Balancer(このチュートリアルではゲートウェイ用に設定しますが、作成しません)、または GKE 上のクラス `gce-internal` の内部 **GKE Ingress** である **HTTPS フロントエンド**(お客様が提供)26* Cloud Run 前の内部 Application Load Balancer(このチュートリアルではゲートウェイ用に設定しますが、作成しません)、または GKE 上のクラス `gce-internal` の内部 **GKE Ingress** である **HTTPS フロントエンド**(お客様が提供)
31 27
32<h2 id="prerequisites">28## 前提条件
33 前提条件
34</h2>
35 29
36* 課金が有効になっている GCP プロジェクトと、上記のリソースを作成する権限30* 課金が有効になっている GCP プロジェクトと、上記のリソースを作成する権限
37* `gcloud auth login` で認証された `gcloud` CLI、およびローカルにインストールされた Docker31* `gcloud auth login` で認証された `gcloud` CLI、およびローカルにインストールされた Docker
48gcloud config set project "$PROJECT_ID"42gcloud config set project "$PROJECT_ID"
49```43```
50 44
51<h2 id="deploy-the-gateway">45## ゲートウェイをデプロイする
52 ゲートウェイをデプロイする
53</h2>
54 46
55以下の手順は、`gcloud` コマンドを使用して完全なデプロイメントをプロビジョニングします。47以下の手順は、`gcloud` コマンドを使用して完全なデプロイメントをプロビジョニングします。
56 48
57<Steps>49**1. API を有効にする**
58 <Step title="API を有効にする">
59 このチュートリアルで使用するサービス API を有効にします。
60 50
61 ```bash theme={null}51このチュートリアルで使用するサービス API を有効にします。
62 gcloud services enable \52
53```bash theme={null}
54gcloud services enable \
63 aiplatform.googleapis.com \55 aiplatform.googleapis.com \
64 artifactregistry.googleapis.com \56 artifactregistry.googleapis.com \
65 sqladmin.googleapis.com \57 sqladmin.googleapis.com \
70 servicenetworking.googleapis.com \62 servicenetworking.googleapis.com \
71 run.googleapis.com \63 run.googleapis.com \
72 container.googleapis.com64 container.googleapis.com
73 ```65```
74 66
75 必要な API はデプロイメント パスによって異なります。67必要な API はデプロイメント パスによって異なります。
76 68
77 * `compute` と `servicenetworking`:プライベート IP Cloud SQL パスに必要69* `compute` と `servicenetworking`:プライベート IP Cloud SQL パスに必要
78 * `run`:Cloud Run のみ70* `run`:Cloud Run のみ
79 * `container`:GKE のみ71* `container`:GKE のみ
80 </Step>
81 72
82 <Step title="サービス アカウントを作成して IAM を付与する">73**2. サービス アカウントを作成して IAM を付与する**
83 ゲートウェイは Google Cloud の Agent Platform を呼び出す権限を持つ専用サービス アカウントとして実行されます。VPC 経由で Cloud SQL に到達するパスワード ユーザーを使用するため、Cloud SQL IAM ロールは不要です。
84 74
85 ```bash theme={null}75ゲートウェイは Google Cloud の Agent Platform を呼び出す権限を持つ専用サービス アカウントとして実行されます。VPC 経由で Cloud SQL に到達するパスワード ユーザーを使用するため、Cloud SQL IAM ロールは不要です。
86 gcloud iam service-accounts create claude-gateway --display-name="Claude apps gateway"
87 SA="claude-gateway@${PROJECT_ID}.iam.gserviceaccount.com"
88 76
89 gcloud projects add-iam-policy-binding "$PROJECT_ID" \77```bash theme={null}
78gcloud iam service-accounts create claude-gateway --display-name="Claude apps gateway"
79SA="claude-gateway@${PROJECT_ID}.iam.gserviceaccount.com"
80
81gcloud projects add-iam-policy-binding "$PROJECT_ID" \
90 --member="serviceAccount:${SA}" --role="roles/aiplatform.user" --condition=None82 --member="serviceAccount:${SA}" --role="roles/aiplatform.user" --condition=None
91 ```83```
92 84
93 次に、Model Garden でプロジェクトの Claude モデルを有効にします。モデルは特定のリージョンに公開されるため、各モデル カードを確認してください。85次に、Model Garden でプロジェクトの Claude モデルを有効にします。モデルは特定のリージョンに公開されるため、各モデル カードを確認してください。
94 </Step>
95 86
96 <Step title="イメージをビルドして Artifact Registry にプッシュする">87**3. イメージをビルドして Artifact Registry にプッシュする**
97 [コンテナ イメージ要件](/docs/ja/claude-apps-gateway-deploy#container-image)に従ってイメージをビルドし(`linux-x64` glibc バイナリを使用)、プッシュします。
98 88
99 ```bash theme={null}89[コンテナ イメージ要件](/docs/ja/claude-apps-gateway-deploy#container-image)に従ってイメージをビルドし(`linux-x64` glibc バイナリを使用)、プッシュします。
100 gcloud artifacts repositories create claude-gateway \90
91```bash theme={null}
92gcloud artifacts repositories create claude-gateway \
101 --repository-format=docker --location="$REGION"93 --repository-format=docker --location="$REGION"
102 gcloud auth configure-docker "${REGION}-docker.pkg.dev" --quiet94gcloud auth configure-docker "${REGION}-docker.pkg.dev" --quiet
103 95
104 # Cloud Run には linux/amd64 が必要です。--provenance=false は buildx OCI96# Cloud Run には linux/amd64 が必要です。--provenance=false は buildx OCI
105 # イメージ インデックスを回避します。これは Cloud Run が拒否します。97# イメージ インデックスを回避します。これは Cloud Run が拒否します。
106 docker build --platform=linux/amd64 --provenance=false \98docker build --platform=linux/amd64 --provenance=false \
107 -t "${REGION}-docker.pkg.dev/${PROJECT_ID}/claude-gateway/gateway:<version>" .99 -t "${REGION}-docker.pkg.dev/${PROJECT_ID}/claude-gateway/gateway:<version>" .
108 docker push "${REGION}-docker.pkg.dev/${PROJECT_ID}/claude-gateway/gateway:<version>"100docker push "${REGION}-docker.pkg.dev/${PROJECT_ID}/claude-gateway/gateway:<version>"
109 ```101```
110 </Step>
111 102
112 <Step title="Cloud SQL for PostgreSQL をプロビジョニングする">103**4. Cloud SQL for PostgreSQL をプロビジョニングする**
113 Private Services Access 経由で VPC 上にインスタンスを作成して、パブリック IP を持たないようにします。これは `constraints/sql.restrictPublicIp` が適用されているプロジェクトの要件も満たします。
114 104
115 ```bash theme={null}105Private Services Access 経由で VPC 上にインスタンスを作成して、パブリック IP を持たないようにします。これは `constraints/sql.restrictPublicIp` が適用されているプロジェクトの要件も満たします。
116 VPC=cc-gateway-vpc106
117 gcloud compute networks create "$VPC" --subnet-mode=custom107```bash theme={null}
118 gcloud compute networks subnets create cc-gateway-subnet \108VPC=cc-gateway-vpc
109gcloud compute networks create "$VPC" --subnet-mode=custom
110gcloud compute networks subnets create cc-gateway-subnet \
119 --network="$VPC" --region="$REGION" --range=10.0.0.0/24111 --network="$VPC" --region="$REGION" --range=10.0.0.0/24
120 112
121 # Private Services Access:VPC ごとに 1 回限り113# Private Services Access:VPC ごとに 1 回限り
122 gcloud compute addresses create "google-managed-services-${VPC}" \114gcloud compute addresses create "google-managed-services-${VPC}" \
123 --global --purpose=VPC_PEERING --prefix-length=16 --network="$VPC"115 --global --purpose=VPC_PEERING --prefix-length=16 --network="$VPC"
124 gcloud services vpc-peerings connect \116gcloud services vpc-peerings connect \
125 --service=servicenetworking.googleapis.com \117 --service=servicenetworking.googleapis.com \
126 --ranges="google-managed-services-${VPC}" --network="$VPC"118 --ranges="google-managed-services-${VPC}" --network="$VPC"
127 119
128 gcloud sql instances create claude-gateway-db \120gcloud sql instances create claude-gateway-db \
129 --database-version=POSTGRES_16 --tier=db-g1-small --region="$REGION" \121 --database-version=POSTGRES_16 --tier=db-g1-small --region="$REGION" \
130 --network="projects/${PROJECT_ID}/global/networks/${VPC}" --no-assign-ip122 --network="projects/${PROJECT_ID}/global/networks/${VPC}" --no-assign-ip
131 gcloud sql databases create claude_gateway --instance=claude-gateway-db123gcloud sql databases create claude_gateway --instance=claude-gateway-db
132 PGPASS="$(openssl rand -hex 24)"124PGPASS="$(openssl rand -hex 24)"
133 gcloud sql users create gateway --instance=claude-gateway-db --password="$PGPASS"125gcloud sql users create gateway --instance=claude-gateway-db --password="$PGPASS"
134 126
135 PRIVATE_IP="$(gcloud sql instances describe claude-gateway-db \127PRIVATE_IP="$(gcloud sql instances describe claude-gateway-db \
136 --format='value(ipAddresses[0].ipAddress)')"128 --format='value(ipAddresses[0].ipAddress)')"
137 GATEWAY_POSTGRES_URL="postgres://gateway:${PGPASS}@${PRIVATE_IP}:5432/claude_gateway?sslmode=require"129GATEWAY_POSTGRES_URL="postgres://gateway:${PGPASS}@${PRIVATE_IP}:5432/claude_gateway?sslmode=require"
138 ```130```
139 131
140 Cloud Run または GKE ランタイムは、この VPC 上にあるか、この VPC にルーティングされている必要があります。132Cloud Run または GKE ランタイムは、この VPC 上にあるか、この VPC にルーティングされている必要があります。
141 </Step>
142 133
143 <Step title="gateway.yaml を作成する">134**5. gateway.yaml を作成する**
144 `upstreams` ブロックは Google Cloud の Agent Platform を `auth: {}` で指定するため、ゲートウェイはランタイム サービス アカウントからのアプリケーション デフォルト認証情報を使用して認証します。すべてのフィールドについては、[設定リファレンス](/docs/ja/claude-apps-gateway-config)を参照してください。
145 135
146 2 つの `listen` フィールドはゲートウェイの前面を説明します。136`upstreams` ブロックは Google Cloud の Agent Platform を `auth: {}` で指定するため、ゲートウェイはランタイム サービス アカウントからのアプリケーション デフォルト認証情報を使用して認証します。すべてのフィールドについては、[設定リファレンス](/docs/ja/claude-apps-gateway-config)を参照してください。
147 137
148 * `public_url`:外部 `https://` オリジン。ループバック以外のバインドに必須です。[`listen` リファレンス](/docs/ja/claude-apps-gateway-config#listen)を参照してください。ゲートウェイは IdP `redirect_uri` と検出ドキュメントをこの値からのみビルドし、`X-Forwarded-*` ヘッダーからはビルドしません。1382 つの `listen` フィールドはゲートウェイの前面を説明します。
149 * `trusted_proxies`:フロント エンドのソース範囲。ゲートウェイは TCP ピアがこのリストにある場合にのみ `X-Forwarded-For` を受け入れ、信頼できるホップを超えてチェーンをウォークするため、IP ごとのサインイン レート制限と監査イベントはロード バランサーの IP ではなく開発者 IP を記録します。
150 139
151 `trusted_proxies` をフロント エンドに合わせて設定します。クラス `gce` の外部 GKE Ingress はリストされていません。これはパブリック転送ルール アドレスをプロビジョニングし、`/login` [プライベート ネットワーク チェック](/docs/ja/claude-apps-gateway#prerequisites)がこれを拒否します。140* `public_url`:外部 `https://` オリジン。ループバック以外のバインドに必須です。[`listen` リファレンス](/docs/ja/claude-apps-gateway-config#listen)を参照してください。ゲートウェイは IdP `redirect_uri` と検出ドキュメントをこの値からのみビルドし、`X-Forwarded-*` ヘッダーからはビルドしません。
141* `trusted_proxies`:フロント エンドのソース範囲。ゲートウェイは TCP ピアがこのリストにある場合にのみ `X-Forwarded-For` を受け入れ、信頼できるホップを超えてチェーンをウォークするため、IP ごとのサインイン レート制限と監査イベントはロード バランサーの IP ではなく開発者 IP を記録します。
152 142
153 | フロント エンド | `trusted_proxies` |143`trusted_proxies` をフロント エンドに合わせて設定します。クラス `gce` の外部 GKE Ingress はリストされていません。これはパブリック転送ルール アドレスをプロビジョニングし、`/login` [プライベート ネットワーク チェック](/docs/ja/claude-apps-gateway#prerequisites)がこれを拒否します。
154 | - | - |
155 | ロード バランサーなしで直接到達する Cloud Run | `[169.254.0.0/16]` |
156 | Cloud Run の前の内部 Application Load Balancer | `169.254.0.0/16` とプロキシ専用サブネットの CIDR |
157 | GKE 内部 Ingress、クラス `gce-internal` | プロキシ専用サブネットの CIDR |
158 144
159 以下の例は、内部ロード バランサー イン フロント オブ Cloud Run の値を使用します。145| フロント エンド | `trusted_proxies` |
146| - | - |
147| ロード バランサーなしで直接到達する Cloud Run | `[169.254.0.0/16]` |
148| Cloud Run の前の内部 Application Load Balancer | `169.254.0.0/16` とプロキシ専用サブネットの CIDR |
149| GKE 内部 Ingress、クラス `gce-internal` | プロキシ専用サブネットの CIDR |
160 150
161 ```yaml gateway.yaml theme={null}151以下の例は、内部ロード バランサー イン フロント オブ Cloud Run の値を使用します。
162 listen:152
153```yaml gateway.yaml theme={null}
154listen:
163 host: 0.0.0.0155 host: 0.0.0.0
164 port: 8080156 port: 8080
165 public_url: https://claude-gateway.internal.example.com157 public_url: https://claude-gateway.internal.example.com
166 trusted_proxies: [169.254.0.0/16, <your-proxy-only-subnet-cidr>]158 trusted_proxies: [169.254.0.0/16, <your-proxy-only-subnet-cidr>]
167 159
168 oidc:160oidc:
169 issuer: https://accounts.google.com161 issuer: https://accounts.google.com
170 client_id: <your-oauth-client-id>162 client_id: <your-oauth-client-id>
171 client_secret: ${OIDC_CLIENT_SECRET} # GKE: ${file:/secrets/oidc-client-secret}163 client_secret: ${OIDC_CLIENT_SECRET} # GKE: ${file:/secrets/oidc-client-secret}
174 scopes: [openid, profile, email]166 scopes: [openid, profile, email]
175 extra_auth_params: { access_type: offline, prompt: consent }167 extra_auth_params: { access_type: offline, prompt: consent }
176 168
177 session:169session:
178 jwt_secret: ${GATEWAY_JWT_SECRET} # GKE: ${file:/secrets/jwt-secret}170 jwt_secret: ${GATEWAY_JWT_SECRET} # GKE: ${file:/secrets/jwt-secret}
179 171
180 store:172store:
181 postgres_url: ${GATEWAY_POSTGRES_URL} # GKE: ${file:/secrets/postgres-url}173 postgres_url: ${GATEWAY_POSTGRES_URL} # GKE: ${file:/secrets/postgres-url}
182 # readiness_grace_seconds: 300 # Cloud SQL フェイルオーバーを通じて174 # readiness_grace_seconds: 300 # Cloud SQL フェイルオーバーを通じて
183 # 準備完了プローブをパスし続ける175# 準備完了プローブをパスし続ける
184 176
185 upstreams:177upstreams:
186 - provider: vertex178 - provider: vertex
187 region: <your-region> # $REGION と一致する必要があります179 region: <your-region> # $REGION と一致する必要があります
188 project_id: <your-project>180 project_id: <your-project>
189 auth: {} # ランタイム サービス アカウント経由の ADC181 auth: {} # ランタイム サービス アカウント経由の ADC
190 ```182```
183
184> [!NOTE]
185>
186> Google id\_tokens は `groups` クレームを含みません。Google Workspace を IdP として [`managed.policies`](/docs/ja/claude-apps-gateway-config#managed)でグループベースのポリシーを使用するには、[`oidc.google_groups`](/docs/ja/claude-apps-gateway-config#oidc)を設定します。これは Admin SDK Directory API を使用してドメイン全体の委任を持つサービス アカウントを通じて各ユーザーのグループを検索します。これがない場合は、代わりに `email_domain` で一致させてください。
191 187
192 <Note>188**6. Secret Manager にシークレットを保存する**
193 Google id\_tokens は `groups` クレームを含みません。Google Workspace を IdP として [`managed.policies`](/docs/ja/claude-apps-gateway-config#managed)でグループベースのポリシーを使用するには、[`oidc.google_groups`](/docs/ja/claude-apps-gateway-config#oidc)を設定します。これは Admin SDK Directory API を使用してドメイン全体の委任を持つサービス アカウントを通じて各ユーザーのグループを検索します。これがない場合は、代わりに `email_domain` で一致させてください。
194 </Note>
195 </Step>
196 189
197 <Step title="Secret Manager にシークレットを保存する">1904 つのシークレットを作成し、`roles/secretmanager.secretAccessor` を `claude-gateway` サービス アカウントに付与します。
198 4 つのシークレットを作成し、`roles/secretmanager.secretAccessor` を `claude-gateway` サービス アカウントに付与します。
199 191
200 | シークレット | ソース |192| シークレット | ソース |
201 | - | - |193| - | - |
202 | `gateway-jwt-secret` | `openssl rand -base64 32` |194| `gateway-jwt-secret` | `openssl rand -base64 32` |
203 | `gateway-oidc-client-secret` | Google Cloud Console → OAuth クライアント |195| `gateway-oidc-client-secret` | Google Cloud Console → OAuth クライアント |
204 | `gateway-postgres-url` | Cloud SQL ステップからの `$GATEWAY_POSTGRES_URL` |196| `gateway-postgres-url` | Cloud SQL ステップからの `$GATEWAY_POSTGRES_URL` |
205 | `gateway-config` | 前のステップからの完全な `gateway.yaml` |197| `gateway-config` | 前のステップからの完全な `gateway.yaml` |
206 198
207 シークレットがコンテナに到達する方法はトラックによって異なります。199シークレットがコンテナに到達する方法はトラックによって異なります。
208 200
209 * GKE では Secret Manager CSI ドライバー経由でファイルとしてマウントされ、`gateway.yaml` は `${file:/secrets/...}` を参照します。201* GKE では Secret Manager CSI ドライバー経由でファイルとしてマウントされ、`gateway.yaml` は `${file:/secrets/...}` を参照します。
210 * Cloud Run では複数のシークレットを 1 つのディレクトリにマウントできないため、`gateway.yaml` はファイルとしてマウントされ、他の 3 つは環境変数として注入されるため、`gateway.yaml` は代わりに `${GATEWAY_JWT_SECRET}`、`${OIDC_CLIENT_SECRET}`、`${GATEWAY_POSTGRES_URL}` を参照します。202* Cloud Run では複数のシークレットを 1 つのディレクトリにマウントできないため、`gateway.yaml` はファイルとしてマウントされ、他の 3 つは環境変数として注入されるため、`gateway.yaml` は代わりに `${GATEWAY_JWT_SECRET}`、`${OIDC_CLIENT_SECRET}`、`${GATEWAY_POSTGRES_URL}` を参照します。
211 </Step>
212 203
213 <Step title="デプロイ">204**7. デプロイ**
214 <Tabs>
215 <Tab title="Cloud Run">
216 以下のコマンドは内部ロード バランサーの背後で本番環境用にデプロイします。
217 205
218 ```bash theme={null}206**Cloud Run**
219 gcloud run deploy claude-gateway \207
208以下のコマンドは内部ロード バランサーの背後で本番環境用にデプロイします。
209
210```bash theme={null}
211gcloud run deploy claude-gateway \
220 --image="${REGION}-docker.pkg.dev/${PROJECT_ID}/claude-gateway/gateway:<version>" \212 --image="${REGION}-docker.pkg.dev/${PROJECT_ID}/claude-gateway/gateway:<version>" \
221 --region="$REGION" \213 --region="$REGION" \
222 --service-account="claude-gateway@${PROJECT_ID}.iam.gserviceaccount.com" \214 --service-account="claude-gateway@${PROJECT_ID}.iam.gserviceaccount.com" \
227 --network="$VPC" --subnet=cc-gateway-subnet --vpc-egress=private-ranges-only \219 --network="$VPC" --subnet=cc-gateway-subnet --vpc-egress=private-ranges-only \
228 --set-secrets=/etc/claude/gateway.yaml=gateway-config:latest,GATEWAY_JWT_SECRET=gateway-jwt-secret:latest,OIDC_CLIENT_SECRET=gateway-oidc-client-secret:latest,GATEWAY_POSTGRES_URL=gateway-postgres-url:latest \220 --set-secrets=/etc/claude/gateway.yaml=gateway-config:latest,GATEWAY_JWT_SECRET=gateway-jwt-secret:latest,OIDC_CLIENT_SECRET=gateway-oidc-client-secret:latest,GATEWAY_POSTGRES_URL=gateway-postgres-url:latest \
229 --no-invoker-iam-check221 --no-invoker-iam-check
230 ```222```
223
224`--network`、`--subnet`、`--vpc-egress=private-ranges-only` 経由の直接 VPC エグレスにより、サービスは Cloud SQL プライベート IP に直接到達できます。各インスタンスは最大 [`store.max_connections`](/docs/ja/claude-apps-gateway-config#store) Postgres 接続を保持し、デフォルトは 5 です。最大インスタンス数 × `store.max_connections` を Cloud SQL ティアの接続制限以下に保ちます。[リファレンス アセット](#terraform-reference)は、この理由から `db-g1-small` ティアのインスタンスを 8 に制限しています。Google Cloud の Agent Platform エンドポイントと `accounts.google.com` へのパブリック エグレスは VPC を通さずにインターネットに直接移動するため、Cloud NAT は不要です。
231 225
232 `--network`、`--subnet`、`--vpc-egress=private-ranges-only` 経由の直接 VPC エグレスにより、サービスは Cloud SQL プライベート IP に直接到達できます。各インスタンスは最大 [`store.max_connections`](/docs/ja/claude-apps-gateway-config#store) Postgres 接続を保持し、デフォルトは 5 です。最大インスタンス数 × `store.max_connections` を Cloud SQL ティアの接続制限以下に保ちます。[リファレンス アセット](#terraform-reference)は、この理由から `db-g1-small` ティアのインスタンスを 8 に制限しています。Google Cloud の Agent Platform エンドポイントと `accounts.google.com` へのパブリック エグレスは VPC を通さずにインターネットに直接移動するため、Cloud NAT は不要です。226インボーカー IAM チェックは開いているか無効にする必要があります。ゲートウェイは独自の OIDC を実行し、そのクライアントは GCP トークンを持たないため、Cloud Run のインボーカー チェックは認証されていないリクエストを許可する必要があります。ゲートウェイの OIDC サインインはリクエストがコンテナに到達すると認証し、`allowed_email_domains` がサインインできるドメインをゲートします。
233 227
234 インボーカー IAM チェックは開いているか無効にする必要があります。ゲートウェイは独自の OIDC を実行し、そのクライアントは GCP トークンを持たないため、Cloud Run のインボーカー チェックは認証されていないリクエストを許可する必要があります。ゲートウェイの OIDC サインインはリクエストがコンテナに到達すると認証し、`allowed_email_domains` がサインインできるドメインをゲートします。2282 つのフラグが認証されていないリクエストを許可します。
235 229
236 2 つのフラグが認証されていないリクエストを許可します。230* `--no-invoker-iam-check`:管理する `allUsers` バインディングなしでチェックを無効にし、Domain Restricted Sharing の下で機能します
231* `--allow-unauthenticated`:`allUsers` に `run.invoker` ロールを付与します。組織が `--no-invoker-iam-check` を許可しない場合はこれを使用します
237 232
238 * `--no-invoker-iam-check`:管理する `allUsers` バインディングなしでチェックを無効にし、Domain Restricted Sharing の下で機能します233`--ingress` 経由のイングレス制限はインボーカー チェックから独立した別のレイヤーです。サービスを企業ネットワークに制限するために設定したままにしておきます。
239 * `--allow-unauthenticated`:`allUsers` に `run.invoker` ロールを付与します。組織が `--no-invoker-iam-check` を許可しない場合はこれを使用します
240 234
241 `--ingress` 経由のイングレス制限はインボーカー チェックから独立した別のレイヤーです。サービスを企業ネットワークに制限するために設定したままにしておきます。235デフォルトでは Cloud Run `*.run.app` URL はパブリック アドレスに解決され、`/login` [プライベート ネットワーク チェック](/docs/ja/claude-apps-gateway#prerequisites)がこれを拒否します。2 つのトポロジーが開発者にプライベートに解決可能なホスト名を提供し、Cloud Run はどちらもプロビジョニングしません。
242 236
243 デフォルトでは Cloud Run `*.run.app` URL はパブリック アドレスに解決され、`/login` [プライベート ネットワーク チェック](/docs/ja/claude-apps-gateway#prerequisites)がこれを拒否します。2 つのトポロジーが開発者にプライベートに解決可能なホスト名を提供し、Cloud Run はどちらもプロビジョニングしません。237* **内部 Application Load Balancer**、このページの `gateway.yaml` が想定するトポロジー:内部 Application Load Balancer をサービスの前にプロビジョニングして、内部 DNS 名と証明書を使用し、`listen.public_url` をそのホスト名に設定します。`internal` イングレス設定は既に内部 Application Load Balancer からのトラフィックを許可します。`internal-and-cloud-load-balancing` はさらに外部 Application Load Balancer を許可しますが、そのパブリック アドレスは `/login` プライベート ネットワーク チェックが拒否するため、このページのトポロジーはそれを必要としません。
238* **ロード バランサーなしの内部専用イングレス**:デプロイ コマンドをそのままにして、`listen.public_url` を `*.run.app` URL(以下の[リファレンス アセット](#terraform-reference)のデフォルト)のままにします。`*.run.app` がプライベートに解決するには、ネットワーク チームが既に Google API 用の Private Service Connect エンドポイント、`*.run.app` をそれに解決する Cloud DNS プライベート ゾーン、およびそのエンドポイントへのオンプレミス ルーティングを運用している必要があります。
244 239
245 * **内部 Application Load Balancer**、このページの `gateway.yaml` が想定するトポロジー:内部 Application Load Balancer をサービスの前にプロビジョニングして、内部 DNS 名と証明書を使用し、`listen.public_url` をそのホスト名に設定します。`internal` イングレス設定は既に内部 Application Load Balancer からのトラフィックを許可します。`internal-and-cloud-load-balancing` はさらに外部 Application Load Balancer を許可しますが、そのパブリック アドレスは `/login` プライベート ネットワーク チェックが拒否するため、このページのトポロジーはそれを必要としません。240Google の [Cloud Run のプライベート ネットワーク ガイド](https://cloud.google.com/run/docs/securing/private-networking)は両方のオプションが必要とするインフラストラクチャをカバーしています。ゲートウェイがプライベート ホスト名で提供されたら、サインインを確認します。それまでは、Cloud Run のログからコンテナがブートしたことを確認します。
246 * **ロード バランサーなしの内部専用イングレス**:デプロイ コマンドをそのままにして、`listen.public_url` を `*.run.app` URL(以下の[リファレンス アセット](#terraform-reference)のデフォルト)のままにします。`*.run.app` がプライベートに解決するには、ネットワーク チームが既に Google API 用の Private Service Connect エンドポイント、`*.run.app` をそれに解決する Cloud DNS プライベート ゾーン、およびそのエンドポイントへのオンプレミス ルーティングを運用している必要があります。
247 241
248 Google の [Cloud Run のプライベート ネットワーク ガイド](https://cloud.google.com/run/docs/securing/private-networking)は両方のオプションが必要とするインフラストラクチャをカバーしています。ゲートウェイがプライベート ホスト名で提供されたら、サインインを確認します。それまでは、Cloud Run のログからコンテナがブートしたことを確認します。242最初のサインイン前に OAuth クライアントの認可リダイレクト URI を `<public_url>/oauth/callback` に更新します。`public_url` を変更した後は再デプロイします。ゲートウェイはその設定からのみパブリック オリジンをビルドし、`X-Forwarded-Host` と `X-Forwarded-Proto` を無視するためです。`X-Forwarded-For` は `listen.trusted_proxies` が設定されている場合にのみクライアント IP に対して受け入れられます。
249 243
250 最初のサインイン前に OAuth クライアントの認可リダイレクト URI を `<public_url>/oauth/callback` に更新します。`public_url` を変更した後は再デプロイします。ゲートウェイはその設定からのみパブリック オリジンをビルドし、`X-Forwarded-Host` と `X-Forwarded-Proto` を無視するためです。`X-Forwarded-For` は `listen.trusted_proxies` が設定されている場合にのみクライアント IP に対して受け入れられます。244**GKE**
251 </Tab>
252 245
253 <Tab title="GKE">246クラスターは Cloud SQL ステップで作成された `$VPC` 上にある必要があります。ポッドがデータベースのプライベート IP に到達できるようにするためです。VPC ピアリングだけでは機能しません。Cloud SQL プライベート IP 自体がピアリングされたネットワークであり、ピアリングは推移的ではないためです。そのVPC上に新しいクラスターを作成するには、`gcloud container clusters create` に `--network="$VPC" --subnetwork=cc-gateway-subnet` を渡します。
254 クラスターは Cloud SQL ステップで作成された `$VPC` 上にある必要があります。ポッドがデータベースのプライベート IP に到達できるようにするためです。VPC ピアリングだけでは機能しません。Cloud SQL プライベート IP 自体がピアリングされたネットワークであり、ピアリングは推移的ではないためです。そのVPC上に新しいクラスターを作成するには、`gcloud container clusters create` に `--network="$VPC" --subnetwork=cc-gateway-subnet` を渡します。
255 247
256 クラスターとそのノード プールで Workload Identity を有効にし、Google サービス アカウントを Kubernetes サービス アカウントにバインドして、ポッドがその認証情報を継承するようにします。248クラスターとそのノード プールで Workload Identity を有効にし、Google サービス アカウントを Kubernetes サービス アカウントにバインドして、ポッドがその認証情報を継承するようにします。
257 249
258 ```bash theme={null}250```bash theme={null}
259 gcloud container clusters update <cluster> --region="$REGION" \251gcloud container clusters update <cluster> --region="$REGION" \
260 --workload-pool="${PROJECT_ID}.svc.id.goog"252 --workload-pool="${PROJECT_ID}.svc.id.goog"
261 # Standard クラスターでは、既存のノード プールも GKE_METADATA が必要です。253# Standard クラスターでは、既存のノード プールも GKE_METADATA が必要です。
262 # Autopilot はデフォルトでこれを有効にします。254# Autopilot はデフォルトでこれを有効にします。
263 gcloud container node-pools update <pool> --cluster=<cluster> \255gcloud container node-pools update <pool> --cluster=<cluster> \
264 --region="$REGION" --workload-metadata=GKE_METADATA256 --region="$REGION" --workload-metadata=GKE_METADATA
265 257
266 kubectl create namespace claude-gateway258kubectl create namespace claude-gateway
267 kubectl create serviceaccount gateway -n claude-gateway259kubectl create serviceaccount gateway -n claude-gateway
268 260
269 gcloud iam service-accounts add-iam-policy-binding \261gcloud iam service-accounts add-iam-policy-binding \
270 "claude-gateway@${PROJECT_ID}.iam.gserviceaccount.com" \262 "claude-gateway@${PROJECT_ID}.iam.gserviceaccount.com" \
271 --role roles/iam.workloadIdentityUser \263 --role roles/iam.workloadIdentityUser \
272 --member "serviceAccount:${PROJECT_ID}.svc.id.goog[claude-gateway/gateway]"264 --member "serviceAccount:${PROJECT_ID}.svc.id.goog[claude-gateway/gateway]"
273 265
274 kubectl annotate serviceaccount gateway -n claude-gateway \266kubectl annotate serviceaccount gateway -n claude-gateway \
275 iam.gke.io/gcp-service-account="claude-gateway@${PROJECT_ID}.iam.gserviceaccount.com"267 iam.gke.io/gcp-service-account="claude-gateway@${PROJECT_ID}.iam.gserviceaccount.com"
276 ```268```
269
270[Kubernetes デプロイメント](/docs/ja/claude-apps-gateway-deploy#kubernetes)で説明されているように、ゲートウェイを標準 Deployment、Service、および内部 Ingress(クラス `gce-internal`)としてデプロイします。以下を使用します。
277 271
278 [Kubernetes デプロイメント](/docs/ja/claude-apps-gateway-deploy#kubernetes)で説明されているように、ゲートウェイを標準 Deployment、Service、および内部 Ingress(クラス `gce-internal`)としてデプロイします。以下を使用します。272* `serviceAccountName: gateway`
273* Secret Manager CSI ドライバーが `/secrets` にシークレットをマウント
274* 準備完了プローブが `GET /readyz` を指す
279 275
280 * `serviceAccountName: gateway`276ゲートウェイ Service に `timeoutSec` を上げた BackendConfig をアタッチします。GKE Ingress の背後にあるロード バランサー バックエンド サービスはデフォルトで 30 秒のタイムアウトで、長いストリーミング レスポンスを切断します。
281 * Secret Manager CSI ドライバーが `/secrets` にシークレットをマウント
282 * 準備完了プローブが `GET /readyz` を指す
283 277
284 ゲートウェイ Service に `timeoutSec` を上げた BackendConfig をアタッチします。GKE Ingress の背後にあるロード バランサー バックエンド サービスはデフォルトで 30 秒のタイムアウトで、長いストリーミング レスポンスを切断します。278Workload Identity クラスターで `169.254.169.254` をブロックするエグレス NetworkPolicy を適用しないでください。ポッドは認証情報のためにメタデータ サーバーに到達する必要があります。ゲートウェイの組み込み [SSRF ガード](/docs/ja/claude-apps-gateway-deploy#threat-model-summary)がそこでの防御です。
285 279
286 Workload Identity クラスターで `169.254.169.254` をブロックするエグレス NetworkPolicy を適用しないでください。ポッドは認証情報のためにメタデータ サーバーに到達する必要があります。ゲートウェイの組み込み [SSRF ガード](/docs/ja/claude-apps-gateway-deploy#threat-model-summary)がそこでの防御です。280ゲートウェイはメタデータ エンドポイントに到達可能であることを示すブート警告をログに記録し、エグレス NetworkPolicy を適用することを提案します。Workload Identity の下ではその警告は予想されます。ポッドがエンドポイントを必要とするためです。
287 281
288 ゲートウェイはメタデータ エンドポイントに到達可能であることを示すブート警告をログに記録し、エグレス NetworkPolicy を適用することを提案します。Workload Identity の下ではその警告は予想されます。ポッドがエンドポイントを必要とするためです。282**8. ゲートウェイ URL を開発者マシンにプッシュする**
289 </Tab>
290 </Tabs>
291 </Step>
292 283
293 <Step title="ゲートウェイ URL を開発者マシンにプッシュする">284ゲートウェイは実行されていますが、ゲートウェイ URL がマシンに配置されるまで、開発者は `/login` からそれに到達できません。完全な[マネージド設定スニペット](/docs/ja/claude-apps-gateway#set-the-gateway-url)を `forceLoginMethod`、`forceLoginGatewayUrl`、および `parentSettingsBehavior: "merge"` オプトインと共に、MDM 経由で各デバイスにデプロイします。開発者が手動で選択できるログイン ピッカーのゲートウェイ オプションはありません。
294 ゲートウェイは実行されていますが、ゲートウェイ URL がマシンに配置されるまで、開発者は `/login` からそれに到達できません。完全な[マネージド設定スニペット](/docs/ja/claude-apps-gateway#set-the-gateway-url)を `forceLoginMethod`、`forceLoginGatewayUrl`、および `parentSettingsBehavior: "merge"` オプトインと共に、MDM 経由で各デバイスにデプロイします。開発者が手動で選択できるログイン ピッカーのゲートウェイ オプションはありません。
295 </Step>
296</Steps>
297 285
298<h2 id="terraform-reference">286## Terraform リファレンス
299 Terraform リファレンス
300</h2>
301 287
302[リファレンスデプロイメントアセット](https://github.com/anthropics/claude-code/tree/main/examples/gateway/gcp)はこのページの Cloud Run トラックを自動化します。設定とイメージアセットは両方のトラックに適用されます:288[リファレンスデプロイメントアセット](https://github.com/anthropics/claude-code/tree/main/examples/gateway/gcp)はこのページの Cloud Run トラックを自動化します。設定とイメージアセットは両方のトラックに適用されます:
303 289
309 295
310アセットは実装例として提供されており、サポートされている本番環境アーティファクトではありません。環境に合わせてレビューして適応させてください。296アセットは実装例として提供されており、サポートされている本番環境アーティファクトではありません。環境に合わせてレビューして適応させてください。
311 297
312<h2 id="troubleshooting">298## トラブルシューティング
313 トラブルシューティング
314</h2>
315 299
316ゲートウェイブートとログインエラーについては、プラットフォーム非依存の[トラブルシューティングテーブル](/docs/ja/claude-apps-gateway-deploy#troubleshooting)を参照してください。以下のエントリは Google Cloud に固有です。300ゲートウェイブートとログインエラーについては、プラットフォーム非依存の[トラブルシューティングテーブル](/docs/ja/claude-apps-gateway-deploy#troubleshooting)を参照してください。以下のエントリは Google Cloud に固有です。
317 301
324| Agent Platform リクエストが `403 PERMISSION_DENIED` を返す | ランタイムが `claude-gateway` service account を使用していないか、モデルが Model Garden でプロジェクト用に有効になっていない | Cloud Run で `--service-account` を設定するか、GKE で Workload Identity をバインドし、各 Claude モデルを Model Garden でターゲット地域用に有効にします |308| Agent Platform リクエストが `403 PERMISSION_DENIED` を返す | ランタイムが `claude-gateway` service account を使用していないか、モデルが Model Garden でプロジェクト用に有効になっていない | Cloud Run で `--service-account` を設定するか、GKE で Workload Identity をバインドし、各 Claude モデルを Model Garden でターゲット地域用に有効にします |
325| ストリーミング応答が固定期間後に切断される | フロントエンドリクエストタイムアウト:GKE Ingress の背後のロードバランサーバックエンドサービスはデフォルトで 30 秒、Cloud Run は 300 秒 | GKE で `timeoutSec` を上げた BackendConfig をアタッチするか、Cloud Run で `--timeout=3600` でデプロイします |309| ストリーミング応答が固定期間後に切断される | フロントエンドリクエストタイムアウト:GKE Ingress の背後のロードバランサーバックエンドサービスはデフォルトで 30 秒、Cloud Run は 300 秒 | GKE で `timeoutSec` を上げた BackendConfig をアタッチするか、Cloud Run で `--timeout=3600` でデプロイします |
326 310
327<h2 id="next-steps">311## 次のステップ
328 次のステップ
329</h2>
330 312
331* [設定リファレンス](/docs/ja/claude-apps-gateway-config):すべての `gateway.yaml` オプション(`managed.policies` および `telemetry` を含む)313* [設定リファレンス](/docs/ja/claude-apps-gateway-config):すべての `gateway.yaml` オプション(`managed.policies` および `telemetry` を含む)
332* [デプロイメントと運用](/docs/ja/claude-apps-gateway-deploy):IdP セットアップ、ヘルスチェック、JWT シークレットローテーション、アップグレード、およびセキュリティモデル314* [デプロイメントと運用](/docs/ja/claude-apps-gateway-deploy):IdP セットアップ、ヘルスチェック、JWT シークレットローテーション、アップグレード、およびセキュリティモデル