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

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

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

  • 当将服务账号视为资源时,您可以向服务账号授予角色 访问或管理该服务账号的权限。

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

如需详细了解如何为正式版项目设置身份验证, 请参阅 以服务账号身份进行身份验证

默认服务账号

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

  • 我们建议您仅将默认服务账号用于测试和开发。对于生产环境,我们强烈建议您创建新的 并向其授予一个或多个 包含所需的最低权限 用于管理工作流

  • 您的服务账号仅需要访问角色 由工作流编排的资源有关详情, 文档,请参阅 服务账号权限

服务账号权限

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

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

如需详细了解如何向主账号(包括服务账号)授予角色, 请参阅管理对项目、文件夹和组织的访问权限

将服务账号附加到资源

如需创建资源并关联服务账号,您需要具备创建该资源的权限以及将服务账号关联到该资源的权限。将服务账号附加到资源的权限由任何角色提供 包含 iam.serviceAccounts.actAs 权限的应用。

如需了解详情,请参阅服务账号身份验证角色

调用 Cloud Run functions(第 2 代)

在 Cloud Run 函数(第 2 代)中,可通过管理 运行底层 Cloud Run 服务如果您的工作流正在调用 Cloud Run 函数(第 2 代)服务,则无需向调用方的服务账号授予 Cloud Run 函数 Invoker (roles/cloudfunctions.invoker) 角色。您必须授予 Cloud Run Invoker (roles/run.invoker) 角色。

如需了解详情,请参阅 Cloud Run 函数版本比较

使用自定义服务账号部署工作流

您可以创建自己的用户代管式服务账号, 让您可以灵活地控制对工作流的访问权限。

  1. 创建服务账号并记下其名称。

  2. 根据工作流完成其工作所需的资源,向服务账号授予相应角色

  3. 确保部署工作流的所有主账号都能够将服务账号附加到资源。如果您创建了服务账号,系统会自动为您授予此权限。如需了解详情,请参阅服务账号身份验证角色

    为了获得将服务账号附加到资源所需的权限, 请让管理员授予您 Service Account User (roles/iam.serviceAccountUser) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

    此预定义角色包含 iam.serviceAccounts.actAs 权限 需要 将服务账号附加到资源

    您也可以使用自定义角色或其他预定义角色来获取此权限。

    授予对项目的角色:

    gcloud projects add-iam-policy-binding WORKFLOWS_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'

    替换以下内容:

    • WORKFLOWS_PROJECT_ID:您的 Google Cloud 项目 包含工作流资源的 ID
    • PRINCIPAL:工作流部署者的标识符 格式为 user|group|serviceAccount:emaildomain:domain。例如:

      • user:test-user@gmail.com
      • group:admins@example.com
      • serviceAccount:test123@example.domain.com
      • domain:example.domain.com
    • SERVICE_ACCOUNT_RESOURCE_NAME:服务账号的完整资源名称。例如:

      projects/SERVICE_ACCOUNT_PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com

      其中:

      • SERVICE_ACCOUNT_PROJECT_ID 是 Google Cloud 包含服务账号的项目 ID。
      • SERVICE_ACCOUNT_NAME 是服务账号的名称。
  4. 部署工作流 使用自定义服务账号

使用跨项目服务账号部署工作流

默认情况下,您无法将在一个项目中创建服务账号附加到其他项目中的资源上。以下说明介绍了如何将 将一个项目中的服务账号关联到另一个项目中的工作流。然后,您可以在不同的项目中使用该服务账号来部署工作流。

如果服务账号和工作流资源位于不同的项目中, 在服务账号所在的项目中,完成以下操作:

  1. 在 Google Cloud 控制台中,前往组织政策页面:

    转到“组织政策”

    查看组织政策 为项目指定访问权限,并确保 “iam.disableCrossProjectServiceAccountUsage”布尔值限制条件不适用 对项目强制执行的限制条件。如需了解详情,请参阅允许跨项目关联服务账号

  2. 创建服务账号并记下其名称。

  3. 授予服务账号 相应角色 以及工作流中必须访问哪些资源才能执行其工作。

  4. 授予 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator) 到 Workflows 服务代理。这允许服务代理管理跨项目 该服务账号的访问权限服务代理是指 适用于特定项目的 Google Cloud 服务。如需了解详情,请参阅服务代理

    控制台

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

      进入 Workflows

    2. 点击 创建以创建工作流,或选择需要创建工作流的工作流的名称 要更新的项目

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

    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.iam.gserviceaccount.com' \
          --role='roles/iam.serviceAccountTokenCreator'

      替换以下内容:

      • SERVICE_ACCOUNT_RESOURCE_NAME:服务账号的完整资源名称。例如:

        projects/SERVICE_ACCOUNT_PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com

        其中:

        • SERVICE_ACCOUNT_PROJECT_ID 是包含服务账号的 Google Cloud 项目的 ID。
        • SERVICE_ACCOUNT_NAME 是服务账号的名称。
      • WORKFLOWS_PROJECT_NUMBER: 包含工作流资源的 Google Cloud 项目编号。

  5. 确保部署工作流的所有主账号都能够将服务账号附加到资源。如果服务账号是您创建的 已自动授予此权限。有关详情,请参阅 服务账号身份验证

    如需获得将服务账号附加到资源所需的权限,请让您的管理员为您授予项目或服务账号的 Service Account User (roles/iam.serviceAccountUser) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

    此预定义角色包含 iam.serviceAccounts.actAs 权限,将服务账号关联到资源需要此权限。

    您也可以使用自定义角色或其他预定义角色来获取此权限。

    控制台

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

      进入 Workflows

    2. 点击 Create(创建)以创建工作流,或选择要更新的工作流的名称。

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

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

    5. 如果出现提示,请为项目授予 roles/iam.serviceAccountUser 角色。

    gcloud

    授予对项目的角色:

    gcloud projects add-iam-policy-binding WORKFLOWS_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'

    替换以下内容:

    • WORKFLOWS_PROJECT_ID:您的 Google Cloud 包含工作流资源的项目 ID
    • PRINCIPAL:工作流部署程序的标识符,格式为 user|group|serviceAccount:emaildomain:domain。例如:
      • user:test-user@gmail.com
      • group:admins@example.com
      • serviceAccount:test123@example.domain.com
      • domain:example.domain.com
    • SERVICE_ACCOUNT_RESOURCE_NAME:服务账号的完整资源名称。例如:

      projects/SERVICE_ACCOUNT_PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com

      其中:

      • SERVICE_ACCOUNT_PROJECT_ID 是包含服务账号的 Google Cloud 项目的 ID。
      • SERVICE_ACCOUNT_NAME 是服务账号的名称。
  6. 使用跨项目服务账号部署工作流

验证与工作流关联的服务账号

您可以验证哪个服务账号与特定工作流相关联。

控制台

  1. 在 Google Cloud 控制台中,转到 Workflows 页面:

    进入 Workflows

  2. 工作流页面上,点击工作流 名称。

  3. 工作流详细信息页面上,点击详细信息标签页。

    系统随即会显示工作流的关联服务账号。

gcloud

  1. 打开终端。

  2. 输入以下命令:

    gcloud workflows describe MY_WORKFLOW

    MY_WORKFLOW 替换为您的 工作流。

    系统会返回包含关联服务账号的完整工作流说明。例如:

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

后续步骤