创建服务代理并授予角色

在 Google Cloud中,项目级、文件夹级和组织级服务代理会在您启用和使用Google Cloud 服务时自动创建。有时,这些服务代理也会自动获得角色,以便代表您创建和访问资源。

如有必要,您还可以要求 Google Cloud 在您使用服务之前为服务创建项目级、文件夹级和组织级服务代理。通过要求 Google Cloud 创建服务代理,您可以在使用服务之前向服务代理授予角色。如果尚未创建服务代理,则无法向服务代理授予角色。

如果您使用以下策略之一来管理许可政策,此选项会非常有用:

  • 声明式框架,例如 Terraform如果您的 Terraform 配置未包含服务代理的角色,那么在您应用配置时,这些角色会被撤消。通过创建服务代理并在 Terraform 配置中为其授予角色,您可以确保这些角色不会被撤消。
  • 将当前允许政策的副本存储在代码库中的政策即代码系统。如果您让 Google Cloud 自动向服务代理授予角色,这些角色会显示在您的实际允许政策中,但不会显示在您存储的允许政策副本中。为了解决此不一致问题,您可能会错误地撤消这些角色。通过创建服务代理并主动向其授予角色,您可以帮助防止代码库与实际的许可政策之间出现偏差。

触发服务代理创建后,您必须向服务代理授予通常会自动授予的角色。如果您不这样做,某些服务可能无法正常运行。这是因为根据用户请求创建的服务代理不会自动获得角色。

准备工作

  • Enable the Resource Manager API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  • 了解服务代理

所需的角色

触发服务代理创建不需要任何 IAM 权限。但是,您需要拥有此页面上的其他任务的特定 IAM 权限:

  • 如需获得列出可用服务及其端点所需的权限,请让您的管理员为您授予要为其列出可用服务的项目、文件夹或组织的 Service Usage Viewer (roles/serviceusage.serviceUsageViewer) IAM 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

    此预定义角色包含列出可用服务及其端点所需的 serviceusage.services.list 权限。

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

  • 如需获得授予服务代理访问权限所需的权限,请让管理员向您授予要针对其授予访问权限的项目、文件夹或组织的以下 IAM 角色:

    • 授予服务代理对项目的访问权限: Project IAM Admin (roles/resourcemanager.projectIamAdmin)
    • 向服务代理授予对文件夹的访问权限: Folder Admin (roles/resourcemanager.folderAdmin)
    • 向服务代理授予对项目、文件夹和组织的访问权限:Organization Admin (roles/resourcemanager.organizationAdmin)

    如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

    这些预定义角色包含授予服务代理访问权限所需的权限。如需查看所需的确切权限,请展开所需权限部分:

    所需权限

    如需向服务代理授予访问权限,您需要具有以下权限:

    • 向服务代理授予对项目的访问权限:
      • resourcemanager.projects.getIamPolicy
      • resourcemanager.projects.setIamPolicy
    • 向服务代理授予对文件夹的访问权限:
      • resourcemanager.folders.getIamPolicy
      • resourcemanager.folders.setIamPolicy
    • 向服务代理授予对组织的访问权限:
      • resourcemanager.organizations.getIamPolicy
      • resourcemanager.organizations.setIamPolicy

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

确定要创建的服务代理

如需确定您需要 Google Cloud 创建的项目级、文件夹级和组织级服务代理,请执行以下操作:

  1. 列出您使用的服务及其 API 端点。如需查看所有可用服务及其端点,请使用以下方法之一:

    控制台

    前往 Google Cloud 控制台中的 API 库

    转到 API 库

    API 端点是其他详细信息部分中列出的服务名称

    gcloud

    gcloud services list 命令会列出项目的所有可用服务。

    在使用下面的命令数据之前,请先进行以下替换:

    • EXPRESSION:可选。用于过滤结果的表达式。例如,以下表达式会过滤名称包含 googleapis.com 但不包含 sandbox 的所有服务:

      name ~ googleapis.com AND name !~ sandbox

      如需查看过滤条件表达式列表,请参阅 gcloud topic filters

    • LIMIT:可选。列出的结果数上限。默认值为 unlimited

    执行以下命令:

    Linux、macOS 或 Cloud Shell

    gcloud services list --available --filter='EXPRESSION' --limit=LIMIT

    Windows (PowerShell)

    gcloud services list --available --filter='EXPRESSION' --limit=LIMIT

    Windows (cmd.exe)

    gcloud services list --available --filter='EXPRESSION' --limit=LIMIT

    响应包含所有可用服务的名称和标题。API 端点是 NAME 字段中的值。

    REST

    Service Usage API 的 services.list 方法可列出项目的所有可用服务。

    在使用任何请求数据之前,请先进行以下替换:

    • RESOURCE_TYPE:您要为其列出可用服务的资源类型。请使用 projectsfoldersorganizations
    • RESOURCE_ID:您要为其列出可用服务的 Google Cloud项目、文件夹或组织的 ID。项目 ID 是字母数字字符串,例如 my-project。文件夹和组织 ID 是数字,例如 123456789012
    • PAGE_SIZE:可选。要包含在响应中的服务的数量。默认值为 50,最大值为 200。如果服务数大于页面大小,则响应中会包含分页令牌,您可以使用该令牌检索下一页结果。
    • NEXT_PAGE_TOKEN:可选。此方法之前的响应中返回的分页令牌。如果已指定,则服务列表将从上一个请求结束的位置开始。

    HTTP 方法和网址:

    GET https://serviceusage.googleapis.com/v1/RESOURCE_TYPE/RESOURCE_ID/services?pageSize=PAGE_SIZE&pageToken=NEXT_PAGE_TOKEN

    如需发送您的请求,请展开以下选项之一:

    响应包含资源的所有可用服务的名称和标题。如果可用服务的数量大于页面大小,响应中还会包含分页令牌。

    API 端点是 name 字段中的值。

  2. 服务代理参考文档页面上,搜索每个 API 端点。

    如果表中列出了该端点,请找到该端点的所有服务代理。忽略电子邮件地址包含 IDENTIFIER 占位符的所有服务代理,这些服务代理适用于服务专属资源,而不适用于项目、文件夹或组织。

    对于每个项目级、文件夹级和组织级服务代理,请记录以下信息:

    • 服务代理的电子邮件地址的格式。
    • 服务代理获得的角色(如果有)。

触发服务代理创建

确定需要创建哪些服务代理后,您可以要求Google Cloud 创建这些服务代理。

当您要求 Google Cloud 创建服务代理时,您会为其提供服务和资源。然后, Google Cloud 为该服务和该资源创建所有服务代理。

gcloud

对于需要创建服务代理的每项服务,请执行以下操作:

  1. 查看该服务的服务代理电子邮件地址。使用电子邮件地址中的占位符来确定您需要为哪些资源创建服务代理:

    占位符 在哪里创建服务代理
    PROJECT_NUMBER 要在其中使用服务的每个项目
    FOLDER_NUMBER 要在其中使用服务的每个文件夹
    ORGANIZATION_NUMBER 要在其中使用服务的每个组织

  2. 为每项资源创建服务代理。

    gcloud beta services identity create 命令会为指定的 API 和资源创建所有服务代理。

    在使用下面的命令数据之前,请先进行以下替换:

    • ENDPOINT:要为其创建服务代理的 API 的端点,例如 aiplatform.googleapis.com
    • RESOURCE_TYPE:您要为其创建服务代理的资源类型。请使用 projectfolderorganization