如果您的架構使用多項服務,這些服務可能需要透過非同步或同步方式彼此通訊。其中許多服務可能都是私人服務,因此需要憑證才能存取。
如要進行非同步通訊,可以使用下列 Google Cloud 服務:
- Cloud Tasks 適用於一對一非同步通訊
- Pub/Sub 可進行一對多、一對一及多對一的非同步通訊
- Cloud Scheduler:定期排程非同步通訊
- Eventarc,用於以事件為準的通訊
在上述所有情況下,所用的服務都會根據您設定的設定,管理與接收服務的互動。
但如果是同步通訊,您的服務會使用端點網址,透過 HTTP 直接呼叫其他服務。在這種情況下,您應確保每個服務都只能對特定服務提出要求。舉例來說,如果您有 login
服務,此服務應該能夠存取 user-profiles
服務,但無法存取 search
服務。
在這種情況下,Google 建議您使用 IAM 和服務身分,並以每個服務的使用者代管服務帳戶為基礎,授予最低權限組合,確保服務身分具備執行工作所需的權限。
此外,要求必須提供呼叫服務身分證明。如要這麼做,請設定通話服務,在要求中加入 Google 簽署的 OpenID Connect ID 權杖。
設定服務帳戶
如要設定服務帳戶,請將呼叫服務的服務帳戶設為接收服務的主體,藉此將接收服務設定為接受來自呼叫服務的要求。然後將 Cloud Run 叫用者 (roles/run.invoker
) 角色授予該服務帳戶。如要執行這兩項工作,請按照相關分頁的操作說明執行:
主控台使用者介面
前往 Google Cloud 控制台:
選取接收的服務。
按一下右上角的 [Show Info Panel] (顯示資訊面板),顯示「Permissions」(權限) 分頁。
按一下「新增主體」。
輸入呼叫服務的身分。這通常是電子郵件地址,預設為
PROJECT_NUMBER-compute@developer.gserviceaccount.com
。從「Select a role」(請選擇角色) 下拉式選單中,選取
Cloud Run Invoker
角色。按一下 [儲存]。
gcloud
使用 gcloud run services add-iam-policy-binding
指令:
gcloud run services add-iam-policy-binding RECEIVING_SERVICE \ --member='serviceAccount:CALLING_SERVICE_IDENTITY' \ --role='roles/run.invoker'
其中 RECEIVING_SERVICE
是接收服務的名稱,而 CALLING_SERVICE_IDENTITY
是服務帳戶的電子郵件地址,預設為 PROJECT_NUMBER-compute@developer.gserviceaccount.com
。
Terraform
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
在 Terraform 設定中,將下列項目新增至google_cloud_run_v2_service
資源:將 us-docker.pkg.dev/cloudrun/container/hello
替換為容器映像檔的參照。
下列 Terraform 程式碼會將初始服務設為公開。
下列 Terraform 程式碼會建立第二個 Cloud Run 服務,該服務預計為私有。
將 us-docker.pkg.dev/cloudrun/container/hello
替換為容器映像檔的參照。
下列 Terraform 程式碼會將第二項服務設為私有。
下列 Terraform 程式碼會建立服務帳戶。
下列 Terraform 程式碼可讓附加至服務帳戶的服務,叫用初始私有 Cloud Run 服務。
取得及設定 ID 權杖
將適當角色授予呼叫服務帳戶後,請按照下列步驟操作:
使用下一節所述的其中一種方法,擷取 Google 簽署的 ID 權杖。將對象憑證附加資訊 (
aud
) 設為接收服務的網址,或已設定的自訂對象。如果您未使用自訂目標對象,即使向特定流量代碼提出要求,aud
值仍須保留為服務的網址。將上個步驟中擷取的 ID 權杖,新增至向接收服務提出要求時的下列其中一個標頭:
Authorization: Bearer ID_TOKEN
標題。X-Serverless-Authorization: Bearer ID_TOKEN
標題。如果應用程式已使用Authorization
標頭進行自訂授權,即可使用這個標頭。這樣一來,系統就會在將權杖傳遞至使用者容器前移除簽章。
如要瞭解本頁面未說明的其他 ID 權杖取得方式,請參閱「取得 ID 權杖的方法」。
使用驗證程式庫
如要取得及設定 ID 權杖程序,其中一個方法是使用驗證程式庫。這段程式碼適用於任何環境,即使在 Google Cloud以外的環境也沒問題,因為程式庫可以取得服務帳戶的驗證憑證。如要使用這個方法,請下載服務帳戶金鑰檔案,並將環境變數 GOOGLE_APPLICATION_CREDENTIALS
設為服務帳戶金鑰檔案的路徑。詳情請參閱服務帳戶金鑰。
這個代碼不接受使用者帳戶的驗證憑證。
Node.js
Python
Go
Java
使用中繼資料伺服器
如果因為某些原因無法使用驗證程式庫,您可以在容器於 Cloud Run 上執行時,從 Compute 中繼資料伺服器擷取 ID 權杖。請注意,這個方法無法在 Google Cloud以外使用,包括本機。
curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=[AUDIENCE]" \
-H "Metadata-Flavor: Google"
其中 AUDIENCE 是您要叫用的服務網址,或是已設定的自訂對象。
下表摘要說明中繼資料查詢要求的主要部分:
元件 | 說明 |
---|---|
根網址 | 所有中繼資料值都會定義為下列根網址下的子路徑: http://metadata.google.internal/computeMetadata/v1 |
要求標頭 | 每個要求都必須包含下列標頭: Metadata-Flavor: Google 此標頭指示是在擷取中繼資料值的意圖之下傳送要求,而非隨意從不安全的來源傳送,並允許中繼資料伺服器傳回您要求的資料。如果您不提供此標頭,中繼資料伺服器會拒絕您的要求。 |
如要逐步瞭解如何使用這項服務對服務驗證技術,請參閱保護 Cloud Run 服務安全教學課程。
從外部使用 Workload Identity 聯盟 Google Cloud
如果您的環境使用工作負載身分聯盟支援的識別資訊提供者,可以透過下列方法從外部 Google Cloud安全地向 Cloud Run 服務進行驗證:
按照本頁「設定服務帳戶」一節的說明,設定服務帳戶。
按照「設定 Workload Identity 聯盟」一文的說明,為識別資訊提供者設定 Workload Identity 聯盟。
按照「授予外部身分模擬服務帳戶的權限」一文中的操作說明進行。
使用 REST API 取得短期權杖,但請呼叫
generateIdToken
取得 ID 權杖,而非呼叫generateAccessToken
取得存取權杖。例如,使用 cURL:
ID_TOKEN=$(curl -0 -X POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT:generateIdToken \ -H "Content-Type: text/json; charset=utf-8" \ -H "Authorization: Bearer $STS_TOKEN" \ -d @- <<EOF | jq -r .token { "audience": "SERVICE_URL" } EOF ) echo $ID_TOKEN
其中
SERVICE_ACCOUNT
是工作負載身分集區設定要存取的服務帳戶電子郵件地址,SERVICE_URL
則是您要叫用的 Cloud Run 服務網址。即使向特定流量代碼提出要求,這個值仍應維持服務的網址。$STS_TOKEN
是您在 Workload Identity Federation 指示中,於上一個步驟收到的 Security Token Service 權杖。
您可以使用 Authorization: Bearer ID_TOKEN
標頭或 X-Serverless-Authorization: Bearer ID_TOKEN
標頭,在向服務提出的要求中加入上一個步驟的 ID 權杖。如果同時提供這兩個標頭,系統只會檢查 X-Serverless-Authorization
標頭。
使用從外部下載的服務帳戶金鑰 Google Cloud
如果 Workload Identity 聯盟不適合您的環境,您可以下載服務帳戶金鑰,從Google Cloud外部進行驗證。更新用戶端程式碼,使用先前所述的驗證程式庫。詳情請參閱服務帳戶金鑰。
您可以使用自行簽署的 JWT 取得 Google 簽署的 ID 符記,但這相當複雜,而且可能容易出錯。基本步驟如下:
自行簽署服務帳戶 JWT,並將
target_audience
憑證附加資訊設為接收服務的網址或已設定的自訂目標對象。如果未使用自訂網域,即使向特定流量代碼發出要求,target_audience
值仍應維持服務的網址。使用自行簽署的 JWT 交換 Google 簽署的 ID 符記,這個符記應已將
aud
憑證附加資訊設定為上述網址。使用
Authorization: Bearer ID_TOKEN
標頭或X-Serverless-Authorization: Bearer ID_TOKEN
標頭,在向服務提出的要求中加入 ID 符記。如果提供兩個標頭,系統只會檢查X-Serverless-Authorization
標頭。
接收已驗證的要求
在接收端私人服務中,您可以剖析授權標頭,接收 Bearer 權杖傳送的資訊。
Python
後續步驟
- 進一步瞭解 ID 權杖驗證