向工作流授予访问 Google Cloud 资源的权限

Workflows 使用服务账号向工作流授予对 Google Cloud 资源的访问权限。服务账号是充当非用户(例如函数、应用或虚拟机)身份的特殊账号。它们为您提供了一种对非用户进行身份验证的方法。 您可以将服务账号视为身份和资源:

  • 将服务账号视为身份时,您可以向服务账号授予角色,使其能够访问资源(例如工作流)。

  • 将服务账号视为资源时,您可以向其他用户授予角色,以访问或管理该服务账号。

服务账号由其电子邮件地址(对该账号是唯一的)标识。

如需详细了解如何为生产应用设置身份验证,请参阅以服务账号身份进行身份验证。

默认服务账号

每个工作流在创建时都会与一个 Identity and Access Management (IAM) 服务账号相关联。如果您在创建工作流期间未指定服务账号,则工作流将使用默认 Compute Engine 服务账号作为其身份。如需验证哪个服务账号与工作流相关联,请参阅本文档中的验证与工作流关联的服务账号。

  • 我们建议您仅使用默认服务账号进行测试和开发。对于生产环境,我们强烈建议您创建新的服务账号并为其授予一个或多个包含访问工作流编排的资源所需的最低权限的 IAM 角色。

  • 您的服务账号所需的唯一角色是访问工作流编排的资源所需的角色。如需了解详情,请参阅本文档中的服务账号权限。

服务账号权限

由于服务账号是身份,因此您可以为服务账号授予项目中的资源,就像为其他任何主账号授予这些角色一样。例如,如果您希望让工作流将日志发送到 Cloud Logging,请确保执行工作流的服务账号具有包含 logging.logEntries.create 权限的角色,例如 Logs Writer (roles/logging.logWriter) IAM 角色。一般来说,服务账号所需的角色取决于您使用工作流编排的资源。如需确定需要哪些角色,请参阅您要编排的资源的产品文档,或选择预定义角色。

工作流服务账号不需要 Workflows Invoker (roles/workflows.invoker) IAM 角色,除非工作流调用自身或其他工作流(即创建新的工作流执行)。如需了解详情,请参阅调用 Workflows。

将服务账号关联到资源

如需创建工作流并关联服务账号,您需要具备创建工作流以及将服务账号关联到工作流的权限。

如需获得将服务账号关联到资源所需的权限,请让您的管理员为您授予服务账号或包含服务账号的项目的 Service Account User (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 Invoker (roles/cloudfunctions.invoker) IAM 角色。您必须改为授予 Cloud Run Invoker (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:工作流部署者的标识符,格式为 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 控制台中,前往服务账号所在项目的组织政策页面:

    转到“组织政策”

    检查项目的组织政策,并确保未对项目强制执行 iam.disableCrossProjectServiceAccountUsage 布尔值限制条件。如需了解详情,请参阅允许跨项目关联服务账号。

  2. 在服务账号所在的项目中,创建服务账号并记下其名称。

  3. 根据工作流必须访问哪些资源才能执行其工作,向服务账号授予适当的角色。

  4. 向工作流项目中的 Workflows 服务代理授予 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator)。这样,服务代理就可以管理服务账号的跨项目访问权限。服务代理是特定项目的给定 Google Cloud 服务的身份。如需了解详情,请参阅服务代理。

    控制台

    1. 在 Google Cloud 控制台中,前往 Workflows 页面:

      进入 Workflows

    2. 如需创建工作流,请点击 创建;如需更新现有工作流,请点击工作流的名称。

    3. 在服务账号列表中,点击切换项目。

    4. 从其他项目中选择服务账号。

    5. 如果出现提示,请将 roles/iam.serviceAccountTokenCreator 角色授予 Workflows 服务代理。

    gcloud

    1. 向 Workflows 服务代理授予 roles/iam.serviceAccountTokenCreator 角色:

      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. 如需创建工作流,请点击 创建;如需更新现有工作流,请点击工作流的名称。

    3. 在服务账号列表中,点击切换项目。

    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:工作流部署者的标识符,格式为 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. 在工作流页面上,点击工作流名称。

  3. 在工作流详情页面上,点击详情标签页。

    详细信息标签页会显示工作流的关联服务账号。

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: [...]

后续步骤