Workflows 使用服务账号向工作流授予对 Google Cloud 资源的访问权限。服务账号是特殊账号,充当非用户(例如函数、应用或虚拟机)的身份。它们为您提供了一种对非用户进行身份验证的方法。服务账号既是身份也是资源。
- 如果将服务账号视为身份,您可以向服务账号授予角色,使其能够访问资源(例如工作流)。 
- 如果将服务账号视为资源,您可以向其他用户授予角色以访问或管理该服务账号。 
服务账号由其电子邮件地址(对该账号是唯一的)标识。
如需详细了解如何为生产应用设置身份验证,请参阅以服务账号身份进行身份验证。
默认服务账号
每个工作流在创建时都会与一个 Identity and Access Management (IAM) 服务账号相关联。如果您在工作流创建期间未指定服务账号,则工作流将使用默认的 Compute Engine 服务账号作为其身份。您可以验证工作流的关联服务账号。请参阅本文档中的验证工作流的关联服务账号。
- 我们建议您仅将默认服务账号用于测试和开发。对于生产环境,我们强烈建议您创建新的服务账号并为其授予一个或多个 IAM 角色,这些角色包含管理工作流所需的最低权限。 
- 您的服务账号唯一需要的角色是访问工作流编排的资源所需的角色。如需了解详情,请参阅本文档中的服务账号权限。 
服务账号权限
由于服务账号是身份,因此您可以为服务账号授予项目中的资源,就像为其他任何主账号授予这些角色一样。例如,如果您希望工作流能够将日志发送到 Cloud Logging,请确保执行工作流的服务账号已获授包含 logging.logEntries.create 权限的角色(例如 Logs Writer 角色)。一般来说,服务账号所需的角色取决于您要通过工作流编排的资源。如需确定需要哪些角色,请参阅您要编排的资源的产品文档,或选择预定义角色。
请注意,工作流服务账号不需要 workflows.invoker 角色,除非工作流会调用自身或其他工作流(即创建新的工作流执行)。如需了解详情,请参阅调用工作流。
如需详细了解如何向主账号(包括服务账号)授予角色,请参阅管理对项目、文件夹和组织的访问权限。
将服务账号附加到资源
如需创建资源并关联服务账号,您需要具备创建该资源的权限以及将服务账号关联到资源的权限。将服务账号关联到资源的权限由包含 iam.serviceAccounts.actAs 权限的任何角色提供。
如需了解详情,请参阅服务账号身份验证角色。
调用 Cloud Run functions
在 Cloud Run functions 中,您可以通过管理底层 Cloud Run 服务来获取调用权限。如果您的工作流要调用 Cloud Run functions 服务,则无需向调用者的服务账号授予 Cloud Functions Invoker (roles/cloudfunctions.invoker) 角色。您必须改为授予 Cloud Run Invoker (roles/run.invoker) 角色。
如需了解详情,请参阅比较 Cloud Run functions。
使用自定义服务账号部署工作流
您可以创建自己的用户代管式服务账号,以便更灵活地控制对工作流的访问权限。
- 创建服务账号并记下其名称。 
- 确保部署工作流的所有主账号都可以将服务账号附加到资源。如果您创建了服务账号,系统会自动为您授予此权限。如需了解详情,请参阅服务账号身份验证角色。 - 如需获得将服务账号关联到资源所需的权限,请让您的管理员为您授予项目或服务账号的 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:email或- domain: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是服务账号的名称。
 
 
- 使用自定义服务账号部署工作流。 
使用跨项目服务账号部署工作流
默认情况下,您无法将在一个项目中创建服务账号附加到其他项目中的资源上。以下说明介绍了如何将一个项目中的服务账号附加到另一个项目中的工作流。然后,您可以在不同项目中使用该服务账号来部署工作流。
如果服务账号和工作流资源位于不同的项目中,请在服务账号所在的项目中完成以下操作:
- 在 Google Cloud 控制台中,前往组织政策页面: - 检查项目的组织政策,确保未对项目强制执行 - iam.disableCrossProjectServiceAccountUsage布尔值限制条件。如需了解详情,请参阅允许跨项目关联服务账号。
- 创建服务账号并记下其名称。 
- 向 Workflows 服务代理授予 Service Account Token Creator 角色 ( - roles/iam.serviceAccountTokenCreator)。这允许服务代理管理服务账号的跨项目访问权限。服务代理是特定项目的给定Google Cloud 服务的身份。如需了解详情,请参阅服务代理。- 控制台- 在 Google Cloud 控制台中,前往 Workflows 页面: 
- 点击 Create(创建)以创建工作流,或选择您要更新的工作流的名称。 
- 在服务账号列表中,点击切换项目。 
- 选择其他项目中的服务账号。 
- 如果出现提示,请将 - roles/iam.serviceAccountTokenCreator角色授予给 Workflows 服务代理。
 - gcloud- 向 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.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 项目编号。
 
 
- 确保部署工作流的所有主账号都可以将服务账号附加到资源。如果您创建了服务账号,系统会自动为您授予此权限。如需了解详情,请参阅服务账号身份验证角色。 - 如需获得将服务账号关联到资源所需的权限,请让您的管理员为您授予项目或服务账号的 Service Account User ( - roles/iam.serviceAccountUser) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。- 此预定义角色可提供将服务账号关联到资源所需的 - iam.serviceAccounts.actAs权限。- 控制台- 在 Google Cloud 控制台中,前往 Workflows 页面: 
- 点击 Create(创建)以创建工作流,或选择您要更新的工作流的名称。 
- 在服务账号列表中,点击切换项目。 
- 选择其他项目中的服务账号。 
- 如果系统提示,请授予对项目的 - 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:email或- domain: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是服务账号的名称。
 
 
- 使用跨项目服务账号部署工作流。 
验证与工作流关联的服务账号
您可以验证与特定工作流相关联的服务账号。
控制台
- 在 Google Cloud 控制台中,前往 Workflows 页面: 
- 在工作流页面上,点击工作流名称。 
- 在工作流详细信息页面上,点击详细信息标签页。 - 系统会显示工作流的关联服务账号。 
gcloud
- 打开终端。 
- 输入以下命令: - 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: [...]