Workflows 使用服务帐号向工作流授予对 Google Cloud 资源的访问权限。服务帐号是充当非个人身份(如函数、应用或虚拟机)的特殊帐号。它们为您提供了验证这些非个人身份的方式。您可以将服务帐号视为身份和资源。
如果将服务帐号视为身份,您可以向服务帐号授予角色,使其能够访问资源(例如工作流)。
如果将服务帐号视为资源,您可以向其他用户授予角色以访问或管理该服务帐号。
服务账号由其电子邮件地址(对该账号是唯一的)标识。
如需详细了解如何使用生产应用设置身份验证,请参阅以服务帐号身份进行身份验证。
默认服务账号
在创建工作流时,每个工作流都与一个 Identity and Access Management (IAM) 服务帐号相关联。如果您在创建工作流期间没有指定服务帐号,工作流将使用默认 Compute Engine 服务帐号作为其身份。您可以验证工作流的关联服务帐号。在本文档中,请参阅验证工作流的关联服务帐号。
我们建议您仅将默认服务帐号用于测试和开发。对于生产环境,我们强烈建议您创建新的服务帐号,并向其授予一个或多个包含管理工作流所需的最低权限的 IAM 角色。
服务账号权限
由于服务账号是身份,因此您可以为服务账号授予项目中的资源,就像为其他任何主账号授予这些角色一样。例如,如果您希望允许工作流将日志发送到 Cloud Logging,请确保执行工作流的服务帐号已被授予包含 logging.logEntries.create
权限的角色(例如 Logs Writer
角色)。
请注意,除非工作流调用自身或其他工作流(即创建新的工作流执行作业),否则工作流服务帐号不需要 workflows.invoker
角色。如需了解详情,请参阅调用工作流。
如需详细了解如何向主账号(包括服务账号)授予角色,请参阅管理对项目、文件夹和组织的访问权限。
将服务账号附加到资源
如需创建资源并关联服务帐号,您需要拥有创建该资源并将服务帐号关联到该资源的权限。
将服务帐号附加到资源的权限由包含 iam.serviceAccounts.actAs
权限的任何角色提供。
如需了解详情,请参阅服务账号身份验证角色。
调用 Cloud Functions (第 2 代)
在 Cloud Functions (第 2 代)中,可通过管理底层 Cloud Run 服务获得调用权限。如果您的工作流正在调用 Cloud Function(第 2 代)服务,则无需向调用方的服务帐号授予 Cloud Functions Invoker (roles/cloudfunctions.invoker
) 角色。您必须授予 Cloud Run Invoker (roles/run.invoker
) 角色。
如需了解详情,请参阅 Cloud 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 项目 IDPRINCIPAL
:工作流部署者的标识符,格式为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 服务代理授予
roles/iam.serviceAccountTokenCreator
角色。
gcloud
将
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 项目编号。
请确保部署工作流的所有主帐号都能够将服务帐号关联到资源。如果是您创建的服务帐号,系统会自动为您授予此权限。如需了解详情,请参阅服务帐号身份验证角色。
如需获取将服务帐号关联到资源所需的权限,请让管理员向您授予项目或服务帐号的 Service Account User (
roles/iam.serviceAccountUser
) IAM 角色。如需详细了解如何授予角色,请参阅管理访问权限。此预定义角色包含
iam.serviceAccounts.actAs
权限,拥有将服务帐号附加到资源所需的权限。控制台
在 Google Cloud 控制台中,转到工作流页面:
点击
创建以创建工作流,或选择要更新的工作流的名称。在服务帐号列表中,点击切换项目。
从其他项目中选择服务帐号。
如果出现提示,请授予对项目的
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 项目 IDPRINCIPAL
:工作流部署者的标识符,格式为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 页面:
在 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: [...]