將代理程式部署至 Cloud Run 時,您可以為代理程式提供身分,讓代理程式與 API 和其他代理程式通訊時,能夠安全地進行驗證。
向 Google Cloud API、其他代理程式和工具驗證
如果 Cloud Run 工作負載設定為 agent-identity 身分類型,就會收到系統管理的身分,格式如下:
principal://agents.global.org-ORGANIZATION_ID.system.id.goog/resources/run/projects/PROJECT_NUMBER/locations/REGION/services/SERVICE_NAME
如果專案不屬於任何組織,格式會使用專案編號:
principal://agents.global.project-PROJECT_NUMBER.system.id.goog/resources/run/projects/PROJECT_NUMBER/locations/REGION/services/SERVICE_NAME
與 API、其他代理程式或工具通訊時,您可以使用這個身分安全地驗證代理程式。 Google Cloud
向 Google Cloud API 驗證
代理可以透過從 Cloud Run Metadata Server 擷取的存取權杖,使用指派的代理身分向 Vertex AI、Cloud Storage 和其他Google Cloud Google Cloud 產品等 API 進行驗證。
將適當的 IAM 角色授予代理的主體,例如:
授予 Vertex AI 存取權:
gcloud projects add-iam-policy-binding
PROJECT_ID\ --member="AGENT_PRINCIPAL" \ --role="roles/aiplatform.user"授予其他 Google Cloud API 的存取權:
在目標資源上授予
AGENT_PRINCIPAL必要角色,例如在 Cloud Storage bucket 上授予roles/storage.objectViewer。詳情請參閱「使用應用程式預設憑證進行驗證」。
更改下列內容:
PROJECT_ID:您的 Google Cloud 專案 ID。AGENT_PRINCIPAL:代理程式的身分,例如principal://agents.global.org-ORGANIZATION_ID.system.id.goog/resources/run/projects/PROJECT_NUMBER/locations/REGION/services/AGENT_NAME。
在代理程式應用程式程式碼中,使用標準 Google Cloud 用戶端程式庫。用戶端程式庫會自動使用應用程式預設憑證 (ADC),從中繼資料伺服器擷取短期存取權杖。
或者,您也可以從容器內的 metadata 伺服器手動擷取存取權杖:
curl -s -H "Metadata-Flavor: Google" \ "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token"
向 Cloud Run 上的其他代理進行驗證
當代理需要呼叫 Cloud Run 上代管的其他代理 (例如 A2A 代理) 時,請使用 JSON Web Token (JWT) 身分權杖進行驗證,並透過 Cloud Run 的內建 roles/run.invoker IAM 檢查進行驗證:
將目標 Cloud Run 服務的
roles/run.invoker角色授予呼叫端代理的身分:gcloud run services add-iam-policy-binding
TARGET_SERVICE_NAME\ --member="CALLER_AGENT_PRINCIPAL" \ --role="roles/run.invoker" \ --region=REGION更改下列內容:
TARGET_SERVICE_NAME:目的地 Cloud Run 代理服務的名稱。CALLER_AGENT_PRINCIPAL:呼叫代理程式的身分。REGION:目標服務的 Google Cloud 區域。
權杖驗證選項
Cloud Run 支援兩種身分識別權杖驗證方法:
- 未繫結的權杖:中繼資料伺服器產生的標準目標對象繫結身分權杖。這是服務對服務和代理程式對代理程式驗證的預設機制。
繫結權杖:使用 mTLS 在權杖和工作負載的憑證之間提供密碼編譯繫結。如要使用繫結權杖,呼叫端會在要求中提供葉子憑證鏈結。
您可以使用與 mTLS 綁定的權杖,叫用設定
ingress=internal的 Cloud Run 資源。這樣一來,您就能限制代理或 MCP 伺服器存取公開網際網路,且不需要虛擬私有雲網路。
擷取未繫結的 ID 權杖
- 在呼叫代理程式容器中,以目標服務的網址做為目標對象,擷取身分識別權杖:
將TOKEN=$(curl -s -H "Metadata-Flavor: Google" \ "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=
TARGET_SERVICE_URL")TARGET_SERVICE_URL換成目標 Cloud Run 服務的網址,例如https://target-agent-1234567890.us-central1.run.app。 - 在
Authorization標頭中加入權杖,然後將要求傳送至目標服務:curl -H "Authorization: Bearer $TOKEN" \
TARGET_SERVICE_URL/endpoint
擷取繫結的 ID 權杖 (mTLS)
- 在呼叫代理程式容器中,讀取葉子憑證鏈,並使用 POST 要求從中繼資料伺服器要求繫結權杖:
CERT_PATH="/var/run/secrets/workload-spiffe-credentials/certificates.pem" JSON_PAYLOAD=$(jq -n --arg certs "$(cat $CERT_PATH)" '{"certificate_chain": $certs}') TOKEN=$(curl -s -X POST \ -H "Metadata-Flavor: Google" \ -H "Content-Type: application/json" \ -d "$JSON_PAYLOAD" \ "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=
TARGET_SERVICE_MTLS_URL") - 呼叫目標服務的 mTLS 端點,在 TLS 握手期間出示工作負載憑證:
KEY_PATH="/var/run/secrets/workload-spiffe-credentials/private_key.pem" curl --cert $CERT_PATH \ --key $KEY_PATH \ -H "Authorization: Bearer $TOKEN" \
TARGET_SERVICE_MTLS_URL/endpoint
Python 範例
如果您編寫以 Python 為基礎的代理程式碼,標準 Google Cloud 用戶端程式庫預設會在有憑證時,自動要求繫結權杖。如需手動發出 HTTP 要求:
import os
import requests
import google.auth
from google.auth.transport.requests import Request
from google.oauth2 import id_token
# Target agent's mTLS URL
target_mtls_url = "TARGET_SERVICE_MTLS_URL"
# 1. Fetch the ID token.
# google-auth automatically requests a bound ID token via POST because
# the platform configures the workload certificate environment variables.
auth_req = Request()
token = id_token.fetch_id_token(auth_req, target_mtls_url)
# 2. Make the HTTP call over mTLS, presenting the workload certificates.
cert_path = "/var/run/secrets/workload-spiffe-credentials/certificates.pem"
key_path = "/var/run/secrets/workload-spiffe-credentials/private_key.pem"
response = requests.get(
target_mtls_url,
headers={"Authorization": f"Bearer {token}"},
cert=(cert_path, key_path)
)
print(response.text)將 TARGET_SERVICE_MTLS_URL 換成目的地 Cloud Run 服務的 mTLS 網址,例如 https://target-agent-12345.us-central1.mtls.run.app。
向 Cloud Run 上的 MCP 伺服器進行驗證
如要連線至 Cloud Run 上代管的 MCP 伺服器或工具,請使用 --functional-type=mcp-server 識別碼,在 Agent Registry 中自動註冊 MCP 伺服器。
如果只有在 Cloud Run 上執行的其他代理程式會存取 MCP 伺服器,請使用內建的 IAM 呼叫端檢查。讓服務專員使用標準執行呼叫器政策,以原生方式進行通訊:
gcloud run services add-iam-policy-bindingMCP_SERVICE_NAME\ --member="CALLING_AGENT_PRINCIPAL" \ --role="roles/run.invoker" \ --region=REGION
更改下列內容:
MCP_SERVICE_NAME:代管 MCP 伺服器的目的地 Cloud Run 服務名稱。CALLING_AGENT_PRINCIPAL:呼叫 MCP 伺服器的代理主體身分。例如:serviceAccount:my-agent@my-project.iam.iam.gserviceaccount.com。REGION:部署 MCP 伺服器的 Google Cloud 區域。
授予 run.invoker 角色後,通話代理程式即可按照「權杖驗證選項」一節所述,擷取身分權杖。
如要瞭解如何透過 CLI 和程式輔助 SDK 存取權,使用 IAP 保護 MCP 伺服器,請參閱「驗證 MCP 伺服器」。
代表使用者進行驗證
當代理代表使用者存取外部工具和服務時,可以使用已佈建的代理身分,管理與 MCP 伺服器和外部端點的驗證。
如要安全處理複雜的授權工作流程,例如 3-legged OAuth (3LO) 同意聲明、2-legged OAuth (2LO) 和 API 金鑰,請設定 Agent Identity 驗證管理工具。
如要瞭解如何將這些驗證管理員繫結至工具集,請參閱「驗證工具和資源」。