如果架構使用多項服務,這些服務可能需要使用非同步或同步方式彼此通訊。許多這類服務可能屬於私人服務,因此需要憑證才能存取。
如要進行非同步通訊,您可以使用下列 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 取得短期權杖,但請勿呼叫
generateAccessToken
來取得存取權杖,而是呼叫generateIdToken
來取得 ID 權杖。例如,使用 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
是您在工作負載身分識別資訊聯合作業指示的上一個步驟中收到的安全性權杖服務權杖。
您可以使用 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 權杖驗證