授予工作流程權限,以便存取 Google Cloud 資源

Workflows 會使用服務帳戶,讓工作流程存取 Google Cloud 資源。服務帳戶是特殊帳戶,代表非人員身分,例如函式、應用程式或 VM。可用於驗證這類非人員實體的身分。服務帳戶既是身分也是資源:

  • 如果將服務帳戶視為身分,您可以將角色授予服務帳戶,允許該帳戶存取資源 (例如工作流程)。

  • 將服務帳戶視為資源時,您可以將角色授予其他使用者,讓他們存取或管理該服務帳戶。

每個服務帳戶均使用不重複的電子郵件地址做為識別。

如要進一步瞭解如何使用正式版應用程式設定驗證,請參閱「以服務帳戶身分驗證」。

預設服務帳戶

建立工作流程時,每個工作流程都會與 Identity and Access Management (IAM) 服務帳戶建立關聯。如果在建立工作流程時未指定服務帳戶,工作流程會使用預設的 Compute Engine 服務帳戶做為身分。如要確認與工作流程相關聯的服務帳戶,請參閱本文件中的「確認與工作流程相關聯的服務帳戶」一節。

  • 建議您只將預設服務帳戶用於測試和開發。在正式環境中,強烈建議您建立新的服務帳戶,並授予一或多個 IAM 角色,其中包含存取工作流程所管理資源的必要最低權限。

  • 服務帳戶只需要具備存取工作流程所管理資源的角色。詳情請參閱本文的「服務帳戶權限」一節。

服務帳戶權限

服務帳戶是身分,因此您可以授予角色,讓服務帳戶存取專案中的資源,就像對其他主體一樣。舉例來說,如要讓工作流程將記錄傳送至 Cloud Logging,請確認執行工作流程的服務帳戶具備包含 logging.logEntries.create 權限的角色,例如記錄檔寫入者 (roles/logging.logWriter) IAM 角色。一般來說,服務帳戶所需的角色取決於您透過工作流程管理的資源。如要判斷需要哪些角色,請查看您要自動調度的資源產品說明文件,或選擇預先定義的角色。

除非工作流程會叫用自身或其他工作流程 (即建立新的工作流程執行作業),否則工作流程服務帳戶不需要 Workflows 叫用者 (roles/workflows.invoker) IAM 角色。詳情請參閱「叫用 Workflows」。

將服務帳戶附加至資源

如要建立工作流程並附加服務帳戶,您必須具備建立工作流程,以及將服務帳戶附加至工作流程的權限。

如要取得將服務帳戶附加至資源所需的權限,請要求管理員針對服務帳戶或包含服務帳戶的專案,向您授予服務帳戶使用者 (roles/iam.serviceAccountUser) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

這個預先定義的角色具備 iam.serviceAccounts.actAs 權限,可將服務帳戶附加至資源。

您或許還可透過自訂角色或其他預先定義的角色取得這項權限。

更新現有工作流程的原始碼或服務帳戶時,您也需要 iam.serviceAccounts.actAs 權限:

  • 僅更新工作流程原始碼 (不更新服務帳戶):您必須具備與工作流程相關聯的現有服務帳戶 iam.serviceAccounts.actAs 權限。
  • 更新服務帳戶,或同時更新原始碼和服務帳戶:您必須具備與工作流程相關聯的新服務帳戶 iam.serviceAccounts.actAs 權限。

如要進一步瞭解服務帳戶驗證角色,請參閱「服務帳戶驗證角色」。

叫用 Cloud Run functions

在 Cloud Run functions 中,您可以透過管理基礎 Cloud Run 服務,取得叫用權限。如果工作流程叫用 Cloud Run functions 服務,您不需要將 Cloud Functions 叫用者 (roles/cloudfunctions.invoker) IAM 角色授予呼叫者的服務帳戶。而是必須授予 Cloud Run 叫用者 (roles/run.invoker) IAM 角色。

詳情請參閱「比較 Cloud Run functions」。

使用自訂服務帳戶部署工作流程

您可以建立自己的使用者自行管理服務帳戶,更靈活地控管工作流程的存取權。

  1. 建立服務帳戶並記下名稱。

  2. 依據工作流程需要存取的資源,為服務帳戶授予適當角色。

  3. 請確認所有部署或更新工作流程的主體,都有權附加或做為服務帳戶 (roles/iam.serviceAccountUser)。如果您建立了服務帳戶,系統會自動授予這項權限。

    授予專案角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=PRINCIPAL \
        --role='roles/iam.serviceAccountUser'

    或者,您也可以在服務帳戶上授予角色:

    gcloud iam service-accounts add-iam-policy-binding \
        SERVICE_ACCOUNT_RESOURCE_NAME \
        --member=PRINCIPAL \
        --role='roles/iam.serviceAccountUser'

    更改下列內容:

    • PROJECT_ID:包含工作流程和服務帳戶的 Google Cloud 專案 ID。
    • PRINCIPAL:工作流程部署者的 ID,格式為 user|group|serviceAccount:email 或 domain:domain。例如:

      • user:dana@example.com
      • group:admins@example.com
      • serviceAccount:my-service-account@example.com
      • domain:example.com
    • SERVICE_ACCOUNT_RESOURCE_NAME:服務帳戶的完整資源名稱,格式如下:

      projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.

      其中 SERVICE_ACCOUNT_NAME 是服務帳戶的名稱。

  4. 使用自訂服務帳戶部署工作流程。

使用跨專案服務帳戶部署工作流程

根據預設,您無法在某專案中建立服務帳戶,並附加至其他專案中的資源。下列操作說明說明如何將某個專案中的服務帳戶附加至其他專案中的工作流程。接著,您可以在不同專案中使用服務帳戶部署工作流程。

如果服務帳戶和工作流程資源位於不同專案,請執行下列操作:

  1. 在 Google Cloud 控制台中,前往服務帳戶所在專案的「Organization policies」(組織政策) 頁面:

    前往「Organization policies」(組織政策)

    檢查專案的組織政策,確保專案未強制執行 iam.disableCrossProjectServiceAccountUsage 布林限制。詳情請參閱「啟用跨專案附加服務帳戶功能」。

  2. 在服務帳戶所在的專案中,建立服務帳戶並記下名稱。

  3. 依據工作流程需要存取的資源,為服務帳戶授予適當角色。

  4. 將服務帳戶權杖建立者角色 (roles/iam.serviceAccountTokenCreator) 授予工作流程專案中的 Workflows 服務代理。這樣一來,服務代理就能管理服務帳戶的跨專案存取權。服務代理是特定專案中指定 Google Cloud 服務的身分。詳情請參閱「服務代理」。

    控制台

    1. 前往 Google Cloud 控制台的「Workflows」頁面:

      前往「Workflows」頁面

    2. 如要建立工作流程,請按一下「Create」(建立)。如要更新現有工作流程,請按一下工作流程名稱。

    3. 在「Service account」(服務帳戶) 清單中,按一下「Switch project」(切換專案)。

    4. 選取其他專案的服務帳戶。

    5. 如果出現提示訊息,請將 roles/iam.serviceAccountTokenCreator 角色授予 Workflows 服務代理。

    gcloud

    1. 將 roles/iam.serviceAccountTokenCreator 角色授予 Workflows 服務代理:

      gcloud iam service-accounts add-iam-policy-binding \
          SERVICE_ACCOUNT_RESOURCE_NAME \
          --member='serviceAccount:service-WORKFLOWS_PROJECT_NUMBER@gcp-sa-workflows.' \
          --role='roles/iam.serviceAccountTokenCreator'

      更改下列內容:

      • SERVICE_ACCOUNT_RESOURCE_NAME:服務帳戶的完整資源名稱,格式如下:

        projects/SERVICE_ACCOUNT_PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.

        其中:

        • SERVICE_ACCOUNT_PROJECT_ID 是包含服務帳戶的Google Cloud 專案 ID。
        • SERVICE_ACCOUNT_NAME 是服務帳戶的名稱。
      • WORKFLOWS_PROJECT_NUMBER:包含工作流程資源的Google Cloud 專案編號。

  5. 請確認所有部署或更新工作流程的主體,都有權附加或做為服務帳戶 (roles/iam.serviceAccountUser)。如果您建立了服務帳戶,系統會自動授予這項權限。

    控制台

    1. 前往 Google Cloud 控制台的「Workflows」頁面:

      前往「Workflows」頁面

    2. 如要建立工作流程,請按一下「Create」(建立)。如要更新現有工作流程,請按一下工作流程名稱。

    3. 在「Service account」(服務帳戶) 清單中,按一下「Switch project」(切換專案)。

    4. 選取其他專案的服務帳戶。

    5. 如果出現提示,請授予服務帳戶專案的 roles/iam.serviceAccountUser 角色。

    gcloud

    在包含服務帳戶的專案中授予角色:

    gcloud projects add-iam-policy-binding \
        SERVICE_ACCOUNT_PROJECT_ID \
        --member=PRINCIPAL \
        --role='roles/iam.serviceAccountUser'

    或者,您也可以在服務帳戶上授予角色:

    gcloud iam service-accounts add-iam-policy-binding \
        SERVICE_ACCOUNT_RESOURCE_NAME \
        --member=PRINCIPAL \
        --role='roles/iam.serviceAccountUser'

    更改下列內容:

    • SERVICE_ACCOUNT_PROJECT_ID:包含服務帳戶的Google Cloud 專案 ID。
    • PRINCIPAL:工作流程部署者的 ID,格式為 user|group|serviceAccount:email 或 domain:domain。例如:
      • user:dana@example.com
      • group:admins@example.com
      • serviceAccount:my-service-account@example.com
      • domain:example.com
    • SERVICE_ACCOUNT_RESOURCE_NAME:服務帳戶的完整資源名稱,格式如下:

      projects/SERVICE_ACCOUNT_PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.

      其中 SERVICE_ACCOUNT_NAME 是服務帳戶的名稱。

  6. 使用跨專案服務帳戶部署工作流程。

驗證與工作流程相關聯的服務帳戶

您可以確認與特定工作流程相關聯的服務帳戶。

控制台

  1. 前往 Google Cloud 控制台的「Workflows」頁面:

    前往「Workflows」頁面

  2. 在「Workflows」頁面中,按一下工作流程名稱。

  3. 在「Workflow details」(工作流程詳細資料) 頁面中,按一下「Details」(詳細資料) 分頁標籤。

    「Details」(詳細資料) 分頁會顯示工作流程的相關聯服務帳戶。

gcloud

執行 gcloud workflows describe 指令,擷取工作流程說明:

gcloud workflows describe WORKFLOW_NAME \
    --location=LOCATION

更改下列內容:

  • WORKFLOW_NAME:工作流程名稱。
  • LOCATION:工作流程的部署區域 (例如 us-central1)。

輸出內容會類似如下,並包含相關聯的服務帳戶:

createTime: '2020-06-05T23:45:34.154213774Z'
name: projects/my-project/locations/us-central1/workflows/my-workflow
serviceAccount: projects/my-project/serviceAccounts/012345678901-compute@
sourceContents: [...]

後續步驟