为工作器池配置服务身份

本页面介绍了如何配置和查看用于控制从 Cloud Run 工作器池对 Google Cloud API 进行的访问的服务身份。

Cloud Run 工作器池具有用作经过身份验证的账号的服务身份,用于从 Cloud Run 实例容器访问 Google Cloud API。如需详细了解服务身份,请参阅服务身份简介指南。

服务身份的使用方式

在 Cloud Run 中,服务身份是同时作为资源和主账号的服务账号。

  • 服务身份作为资源:如需将服务账号附加为服务身份,部署者账号必须具有对该服务身份资源的访问权限。某些操作(例如创建或更新工作器池)要求部署者账号具有针对服务身份资源的权限。
  • 服务身份作为主账号:如需从 Cloud Run 工作器池访问 Google Cloud API,您必须为服务身份授予您希望工作器池执行的操作所需的角色或权限。

下一部分介绍了所需的角色,以用于向部署者账号授予对服务身份资源的访问权限以及授予服务账号主账号所需的角色或权限。

所需的角色

您或您的管理员必须为部署者账号和服务身份授予 IAM 角色和权限。

点击可查看部署者账号所需的角色

如需获得将服务账号附加为工作器池的服务身份所需的权限,您或您的管理员必须针对用作服务身份的服务账号,向部署者账号授予 Service Account User 角色 (roles/iam.serviceAccountUser)。

此预定义角色包含对工作器池附加服务账号所需的 iam.serviceAccounts.actAs 权限。您也可以通过配置自定义角色或使用其他预定义角色来获取此权限。

如需了解如何针对服务身份向部署者账号授予此角色,请参阅部署权限。如果服务账号与 Cloud Run 工作器池处于不同的项目中,您或您的管理员还必须为 Cloud Run 服务代理配置 IAM 角色并设置组织政策。如需了解详情,请参阅使用其他项目中的服务账号

点击可查看服务身份所需的角色

如需允许服务身份从 Cloud Run 访问 Google Cloud API,您或您的管理员必须为服务身份授予您要执行的操作所需的权限或角色。如需访问特定 Cloud 客户端库,请参阅 Google Cloud 服务的 Google Cloud 文档。

如果 Cloud Run 工作器池不会访问其他 Google Cloud 服务,则无需为服务身份授予任何角色或权限,并且可以使用已分配给项目的默认服务账号。

获取创建专用服务账号的建议

从 Google Cloud 控制台创建新的服务账号时,可选的“向此服务账号授予对项目的访问权限”步骤适用于所需的任何其他访问权限。例如,一项 Cloud Run 服务可能会调用另一项专用 Cloud Run 服务,或访问 Cloud SQL 数据库,两者都需要特定的 IAM 角色。如需了解详情,请参阅有关管理访问权限的文档。

Recommender 服务还会自动提供使用最低必需权限集创建专用服务账号的建议。

配置服务身份

如果您尚未创建服务账号,则可以在 IAM 或 Cloud Run 中创建用户管理的服务账号。

如需配置服务身份,请在创建新的工作器池部署新修订版本时使用 gcloud CLI:

gcloud

如果您尚未创建服务账号,请在 IAM 中创建用户管理的服务账号。

您可以使用以下命令更新现有工作器池以配置服务账号:

gcloud beta run worker-pools update WORKER_POOL --service-account SERVICE_ACCOUNT

您需要进行如下替换:

  • WORKER_POOL:服务的名称。
  • SERVICE_ACCOUNT:与新身份关联的服务账号所关联的服务账号。此值是服务账号的邮箱,例如 example@myproject.iam.gserviceaccount.com

您还可以在部署期间使用以下命令设置服务账号:

gcloud beta run worker-pools deploy WORKER_POOL --image IMAGE_URL --service-account SERVICE_ACCOUNT

您需要进行如下替换:

  • WORKER_POOL 替换为工作器池的名称。
  • IMAGE_URL 替换为对包含工作器池的容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/worker-pool:latest
  • SERVICE_ACCOUNT 替换为与新身份关联的服务账号:此值是服务账号的电子邮件地址,例如 example@myservice.iam.gserviceaccount.com

使用其他项目中的服务账号

如果您配置的服务账号来自与 Cloud Run 资源不同的 Google Cloud 项目,请执行以下操作:

  1. 您或您的管理员必须针对用作服务身份的服务账号授予 Service Account User 角色 (roles/iam.serviceAccountUser)。

    控制台

    1. 前往 Google Cloud 控制台的服务账号页面:

      转到“服务账号”

    2. 选择您要用作服务身份的服务账号电子邮件地址。

    3. 点击权限标签页。

    4. 点击 授予访问权限按钮。

    5. 输入与您要向其授予 Admin 或 Developer 角色的主账号匹配的部署者账号电子邮件地址。

    6. 请选择一个角色下拉菜单中,选择服务账号 > Service Account User 角色。

    7. 点击保存

    gcloud

    使用 gcloud iam service-accounts add-iam-policy-binding 命令,将突出显示的变量替换为适当的值:

    gcloud iam service-accounts add-iam-policy-binding \
        SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
        --member="PRINCIPAL" \
        --role="roles/iam.serviceAccountUser"

    您需要进行如下替换:

    • SERVICE_ACCOUNT_NAME:您要将 Cloud Run 资源关联到的服务账号的名称。
    • SERVICE_ACCOUNT_PROJECT_ID:服务账号所在的项目 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
  2. 您或您的管理员必须针对用作服务身份的服务账号,向 Cloud Run 资源的服务代理授予 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator)。服务代理遵循 service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com 格式。

    控制台

    1. 前往 Google Cloud 控制台的服务账号页面:

      转到“服务账号”

    2. 选择您要用作服务身份的服务账号电子邮件地址。

    3. 点击权限标签页。

    4. 点击 授予访问权限按钮。

    5. 输入服务代理电子邮件地址。例如:service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com

    6. 请选择一个角色下拉菜单中,选择服务账号 > Service Account Token Creator 角色。

    7. 点击保存

    gcloud

    使用 gcloud iam service-accounts add-iam-policy-binding 命令:

    gcloud iam service-accounts add-iam-policy-binding \
        SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
        --member="serviceAccount:service-CLOUD_RUN_RESOURCE_PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com" \
        --role="roles/iam.serviceAccountTokenCreator"

    替换以下值:

    • SERVICE_ACCOUNT_NAME:您要将 Cloud Run 资源关联到的服务账号的名称。
    • SERVICE_ACCOUNT_PROJECT_ID:服务账号所在的项目 ID。
    • CLOUD_RUN_RESOURCE_PROJECT_NUMBER:Cloud Run 所在的项目编号。

    该命令会输出用户管理的服务账号的更新后的允许政策。

  3. 包含该服务账号的项目要求将组织政策 iam.disableCrossProjectServiceAccountUsage 在文件夹级层设置为 false 或未实施,或从项目级层设置继承该配置。默认情况下,该设置为 true

    控制台

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

      转到组织政策

    2. 从项目选择器中,选择要为其停用跨项目服务账号使用情况的组织和项目。

    3. 选择停用跨项目服务账号使用情况政策。

    4. 点击管理政策

    5. 政策来源下方,选择覆盖父资源的政策

    6. 点击添加规则

    7. 强制执行下方,选择关闭

    8. 如需强制执行政策,请点击设置政策

    gcloud

    在具有服务账号的项目中,确保未强制执行 iam.disableCrossProjectServiceAccountUsage 组织政策限制条件。默认情况下,系统会强制执行此限制条件。

    如需停用此组织政策限制条件,请运行以下命令:

    gcloud resource-manager org-policies disable-enforce iam.disableCrossProjectServiceAccountUsage
        --project=SERVICE_ACCOUNT_PROJECT_ID

    SERVICE_ACCOUNT_PROJECT_ID 替换为包含服务账号的项目 ID。

您可以将角色成员资格直接应用于服务账号资源,也可以从资源层次结构中的更高级层继承。

查看工作器池的服务账号配置

  1. 在 Google Cloud 控制台中,前往 Cloud Run:

    转到 Cloud Run

  2. 点击工作器池以显示已部署的工作器池列表。

  3. 点击要检查的工作器池,以显示其详细信息窗格。

  4. 点击安全标签页,以显示工作器池安全信息,包括服务账号。

后续步骤