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

工作流使用服务帐号向工作流授予对 Google Cloud 资源的访问权限。服务帐号是作为非个人身份(例如函数、应用或虚拟机)的特殊帐号。它们为您提供了对这些非个人进行身份验证的方法。 服务帐号或主帐号可被视为身份和资源。

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

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

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

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

默认服务帐号

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

我们建议将默认服务帐号仅用于测试和开发。

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

您可以创建自己的用户管理的服务帐号,从而更灵活地控制工作流的访问权限。

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

  2. 根据工作流必须访问的资源来为服务帐号授予相应的角色

  3. 向工作流部署者授予对项目和服务帐号的访问权限:

    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.comgroup:admins@example.comserviceAccount:test123@example.domain.comdomain: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. 使用自定义服务帐号部署工作流

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

通过向 Workflows 服务代理授予使用自定义服务帐号的权限,您可以在不同项目中使用服务帐号来部署工作流。服务代理是特定项目的指定 Google Cloud 服务的身份。如需了解详情,请参阅服务代理

如果服务帐号和工作流资源位于不同于服务帐号所在项目的项目中,请执行以下操作:

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

  2. 根据工作流必须访问的资源来为服务帐号授予相应的角色

  3. 配置服务帐号以跨项目工作。

  4. roles/iam.serviceAccountTokenCreator 角色授予工作流服务代理:

    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. 向工作流部署者授予对项目和服务帐号的访问权限:

    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.comgroup:admins@example.comserviceAccount:test123@example.domain.comdomain:example.domain.com

  6. 使用跨项目服务帐号部署工作流

服务帐号权限

由于服务帐号是身份,因此您可以为服务帐号授予项目中的资源,就像为其他任何主帐号授予这些角色一样。例如,如果您想让工作流向 Cloud Logging 发送日志,请确保已向执行工作流的服务帐号授予具有 logging.logEntries.create 权限的角色(例如 Logs Writer 角色)。

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

如需详细了解如何向主帐号(包括服务帐号)授予角色,请参阅授予、更改和撤消访问权限

将服务帐号附加到资源

如需创建资源并附加服务帐号,您需要具备创建该资源的权限,以及模拟要附加到该资源的服务帐号。模拟服务帐号并间接访问服务帐号可以访问的所有资源的权限由包含 iam.serviceAccounts.actAs 权限的任何角色提供。

如需了解详情,请参阅管理服务帐号模拟

调用 Cloud Functions(第 2 代)

在 Cloud Functions(第 2 代)中,您可以通过管理底层 Cloud Run 服务来获得调用权限。如果您的工作流正在调用 Cloud Functions(第 2 代)服务,您无需向调用者的服务帐号授予 Cloud Functions Invoker (roles/cloudfunctions.invoker) 角色。您必须授予 Cloud Run Invoker (roles/run.invoker) 角色。

如需了解详情,请参阅 Cloud Functions(第 2 代)的差异

验证工作流的关联服务帐号

您可以验证与特定工作流关联的服务帐号。

控制台

  1. 在 Google Cloud Console 中,转到工作流页面:
    转到工作流

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

后续步骤