設定服務的身分

Cloud Run 服務或修訂版本具有服務身分,可做為經過驗證的帳戶,從 Cloud Run 執行個體容器存取 Google Cloud API。如要進一步瞭解服務身分,請參閱服務身分簡介指南。

服務身分的使用方式

在 Cloud Run 中,服務身分是服務帳戶,既是資源也是主體

  • 服務身分做為資源:如要將服務帳戶附加為服務身分,部署人員帳戶必須具備服務身分資源的存取權。某些作業 (例如建立或更新服務或修訂版本) 需要部署者帳戶對服務身分資源擁有權限。
  • 以主體身分使用的服務身分:如要從 Cloud Run 服務或修訂版本存取 Google Cloud API,您必須授予服務身分執行服務或修訂版本所需作業的角色或權限。

下一節將說明授予部署者帳戶服務身分資源存取權,以及授予服務帳戶主體所需角色或權限時,必須具備的角色。

必要的角色

您或管理員必須為部署者帳戶和服務身分授予 IAM 角色和權限。

按一下即可查看部署者帳戶的必要角色

如要取得將服務帳戶附加為服務或修訂版本服務身分所需的權限,您或管理員必須授予部署者帳戶服務帳戶的「服務帳戶使用者」角色 (roles/iam.serviceAccountUser),該服務帳戶會做為服務身分。

這個預先定義的角色包含 iam.serviceAccounts.actAs 權限,這是將服務帳戶附加至服務或修訂版本時的必要權限。您或許還可透過設定自訂角色或使用其他預先定義的角色取得這項權限。

如要瞭解如何將這個角色授予服務身分上的部署者帳戶,請參閱部署權限。 如果服務帳戶與 Cloud Run 服務或修訂版本位於不同專案,您或管理員也必須為 Cloud Run 服務代理程式設定 IAM 角色,並設定機構政策。詳情請參閱「在其他專案中使用服務帳戶」。

按一下即可查看服務身分所需的角色

如要允許服務身分存取 Cloud Run 的 API,您或管理員必須授予服務身分權限或角色,才能執行所需作業。 Google Cloud 如要存取特定 Cloud 用戶端程式庫,請參閱 Google Cloud 服務的 Google Cloud 說明文件。

如果 Cloud Run 服務或修訂版本不會存取其他 Google Cloud 服務,您就不需要授予服務身分任何角色或權限,可以使用指派給專案的預設服務帳戶。

取得建立專屬服務帳戶的建議

從 Google Cloud 控制台建立新服務帳戶時,選用步驟「將專案存取權授予這個服務帳戶」適用於任何額外存取權需求。舉例來說,一個 Cloud Run 服務可能會叫用另一個私人 Cloud Run 服務,或存取 Cloud SQL 資料庫,這兩種情況都需要特定的 IAM 角色。詳情請參閱管理存取權的說明文件。

最佳化建議服務也會自動提供最佳化建議,協助您建立專屬服務帳戶,並授予最基本的必要權限。

設定服務身分

如果您尚未建立服務帳戶,可以在 IAM 或 Cloud Run 中建立使用者管理的服務帳戶。

如要設定服務身分,請在建立新服務部署新版本時,使用 Google Cloud 控制台、gcloud CLI、API (YAML) 或 Terraform:

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run:

    前往 Cloud Run

  2. 從選單中選取「服務」,然後按一下「部署容器」,設定新服務。如要設定現有服務,請按一下該服務,然後點選「編輯並部署新修訂版本」

  3. 如要設定新服務,請填寫初始服務設定頁面,然後按一下「容器、磁碟區、網路與安全性」,展開服務設定頁面。

  4. 按一下「安全性」分頁標籤。

    圖片

    • 按一下「Service account」(服務帳戶) 下拉式選單,然後選取現有服務帳戶,或按一下「Create a new service account」(建立新的服務帳戶) (如適用)。
  5. 按一下 [Create] (建立) 或 [Deploy] (部署)

gcloud

如果您尚未建立服務帳戶,可以在 IAM 中建立使用者管理的服務帳戶。

您可以使用下列指令更新現有服務,使其採用新的服務帳戶:

gcloud run services update SERVICE --service-account SERVICE_ACCOUNT

取代:

  • SERVICE 改為您的服務名稱。
  • SERVICE_ACCOUNT,並與新身分相關聯的服務帳戶:這個值是服務帳戶的電子郵件地址,例如 example@myproject.iam.gserviceaccount.com

您也可以在部署期間使用以下指令設定服務帳戶:

gcloud run deploy --image IMAGE_URL --service-account SERVICE_ACCOUNT

取代:

  • IMAGE_URL,並參照容器映像檔,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果您使用 Artifact Registry,則必須先建立存放區 REPO_NAME。網址的格式為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  • SERVICE_ACCOUNT,並與新身分相關聯的服務帳戶:這個值是服務帳戶的電子郵件地址,例如 example@myservice.iam.gserviceaccount.com

YAML

如果您尚未建立服務帳戶,可以在 IAM 中建立使用者管理的服務帳戶。

  1. 如要建立新服務,請略過這個步驟。 如要更新現有服務,請下載其 YAML 設定

    gcloud run services describe SERVICE --format export > service.yaml
  2. 更新 serviceAccountName: 屬性:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        spec:
          serviceAccountName: SERVICE_ACCOUNT

    取代

    • SERVICE 改為您的 Cloud Run 服務名稱。
    • SERVICE_ACCOUNT,並與新身分相關聯的服務帳戶:這個值是服務帳戶的電子郵件地址,例如 SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
  3. 使用下列指令建立或更新服務:

    gcloud run services replace service.yaml

Terraform

如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。

在 Terraform 設定中,將下列內容新增至 google_cloud_run_v2_service 資源:

如要建立服務帳戶,請將下列資源新增至現有的 main.tf 檔案:

resource "google_service_account" "cloudrun_service_identity" {
  account_id = "my-service-account"
}

建立或更新 Cloud Run 服務,並加入服務帳戶:

resource "google_cloud_run_v2_service" "default" {
  name     = "id-service"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    service_account = google_service_account.cloudrun_service_identity.email
  }
}

使用其他專案中的服務帳戶

如果您設定的服務帳戶來自與 Cloud Run 資源不同的 Google Cloud 專案 ,請按照下列步驟操作:

  1. 您或管理員必須在您用來做為服務身分的服務帳戶上,授予「服務帳戶使用者」角色 (roles/iam.serviceAccountUser)。

    控制台

    1. 前往 Google Cloud 控制台的「Service accounts」(服務帳戶) 頁面:

      前往「Service accounts」(服務帳戶)

    2. 選取您做為服務身分使用的服務帳戶電子郵件地址。

    3. 按一下「Permissions」(權限) 分頁標籤。

    4. 按一下「授予存取權」按鈕。

    5. 輸入與您要授予管理員或開發人員角色的主體相符的部署者帳戶電子郵件地址。

    6. 在「Select a role」(請選擇角色) 下拉式選單中,選取「Service Accounts」(服務帳戶) >「Service Account User」(服務帳戶使用者) 角色。

    7. 按一下 [儲存]

    gcloud

    使用 gcloud iam service-accounts add-iam-policy-binding 指令,並將醒目顯示的變數改為適當的值:

    gcloud iam service-accounts add-iam-policy-binding \
        SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
        --member="PRINCIPAL" \
        --role="roles/iam.serviceAccountUser"

    取代:

    • SERVICE_ACCOUNT_NAME:您要將 Cloud Run 資源附加至的服務帳戶名稱。
    • SERVICE_ACCOUNT_PROJECT_ID:服務帳戶所在的專案 ID。
    • PRINCIPAL,使用 user|group|serviceAccount:emaildomain:domain 格式,為要新增繫結的部署者帳戶新增繫結。PRINCIPAL例如:

      • user:test-user@gmail.com
      • group:admins@example.com
      • serviceAccount:test123@example.domain.com
      • domain:example.domain.com
  2. 您或管理員必須在您做為服務身分使用的服務帳戶上,將服務帳戶符記建立者角色 (roles/iam.serviceAccountTokenCreator) 授予 Cloud Run 資源的服務代理人。服務代理的格式為 service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com

    控制台

    1. 前往 Google Cloud 控制台的「Service accounts」(服務帳戶) 頁面:

      前往「Service accounts」(服務帳戶)

    2. 選取您做為服務身分使用的服務帳戶電子郵件地址。

    3. 按一下「Permissions」(權限) 分頁標籤。

    4. 按一下「授予存取權」按鈕。

    5. 輸入服務專員的電子郵件地址。例如 service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com

    6. 在「Select a role」(請選擇角色) 下拉式選單中,選取「Service Accounts」(服務帳戶) >「Service Account Token Creator」(服務帳戶憑證建立者) 角色。

    7. 按一下 [儲存]

    gcloud

    使用 gcloud iam service-accounts add-iam-policy-binding 指令:

    gcloud iam service-accounts add-iam-policy-binding \
        SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
        --member="serviceAccount:service-CLOUD_RUN_RESOURCE_PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com" \
        --role="roles/iam.serviceAccountTokenCreator"

    替換下列值:

    • SERVICE_ACCOUNT_NAME:您要將 Cloud Run 資源附加至的服務帳戶名稱。
    • SERVICE_ACCOUNT_PROJECT_ID:服務帳戶所在的專案 ID。
    • CLOUD_RUN_RESOURCE_PROJECT_NUMBER: Cloud Run 所在的專案編號。

    這個指令會列印使用者管理服務帳戶的更新允許政策。

  3. 含有這個服務帳戶的專案需要將機構政策 iam.disableCrossProjectServiceAccountUsage 設為 false,或在資料夾層級取消強制執行,或從專案層級設定繼承。預設值為 true

    控制台

    1. 前往 Google Cloud 控制台的「Organization policies」(機構政策) 頁面:

      前往「機構政策」

    2. 從專案挑選器中,選取要停用跨專案服務帳戶的機構和專案。

    3. 選取「停用跨專案服務帳戶」政策。

    4. 按一下「管理政策」

    5. 在「政策來源」下方,選取「覆寫上層政策」

    6. 點選「新增規則」

    7. 在「Enforcement」(強制執行) 下方,選取「Off」(關閉)

    8. 如要強制執行這項政策,請按一下「設定政策」

    gcloud

    在擁有服務帳戶的專案中,請確保系統不會強制執行iam.disableCrossProjectServiceAccountUsage機構政策限制。這項限制預設為強制執行。

    如要停用這項機構政策限制,請執行下列指令:

    gcloud resource-manager org-policies disable-enforce iam.disableCrossProjectServiceAccountUsage
        --project=SERVICE_ACCOUNT_PROJECT_ID

    SERVICE_ACCOUNT_PROJECT_ID 替換為包含服務帳戶的專案 ID。

您可以直接將角色成員資格套用至服務帳戶資源,或從資源階層中的較高層級繼承。

後續步驟