配置服务身份

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 中创建用户管理的服务账号。

如需配置服务身份,请使用 Google Cloud 控制台、gcloud CLI、API (YAML)(在创建新服务部署新修订版本时)或 Terraform:

控制台

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

    转到 Cloud Run

  2. 如果您是要配置一个新服务来作为部署目标,请点击创建服务。如果您要配置现有服务,请点击该服务,然后点击修改和部署新的修订版本

  3. 如果您要配置新服务,请根据需要填写初始服务设置页面,然后点击容器、网络、安全性以展开服务配置页面。

  4. 点击安全标签。

    图片

    • 点击服务账号下拉菜单,然后选择现有服务账号,或点击创建新服务账号(如适用)。
  5. 点击创建部署

gcloud

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

您可以使用以下命令更新现有服务以拥有新的服务账号:

gcloud run services update SERVICE --service-account SERVICE_ACCOUNT

您需要在其中:

  • SERVICE 替换为您的服务名称。
  • SERVICE_ACCOUNT 替换为与新身份关联的服务账号:此值是服务账号的电子邮件地址,例如 example@myproject.iam.gserviceaccount.com

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

gcloud run deploy --image IMAGE_URL --service-account SERVICE_ACCOUNT

您需要将其中的:

  • IMAGE_URL 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。 如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址格式为 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  • SERVICE_ACCOUNT 替换为与新身份关联的服务账号:此值是服务账号的电子邮件地址,例如 example@myservice.iam.gserviceaccount.com

YAML

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

  1. 如果您要创建新的服务,请跳过此步骤。如果您要更新现有服务,请下载其 YAML 配置

    gcloud run services describe SERVICE --format export > service.yaml
  2. 更新 serviceAccountName: 特性:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        spec:
          serviceAccountName: SERVICE_ACCOUNT
    

    替换

    • SERVICE 替换为您的 Cloud Run 服务的名称。
    • SERVICE_ACCOUNT 替换为与新身份关联的服务账号:此值是服务账号的电子邮件地址,例如 SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
  3. 使用以下命令创建或更新服务:

    gcloud run services replace service.yaml

Terraform

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

如需创建服务账号,请将以下资源添加到现有 main.tf 文件中:

resource "google_service_account" "cloudrun_service_identity" {
  account_id = "my-service-account"
}

创建或更新 Cloud Run 服务并添加服务账号:

resource "google_cloud_run_v2_service" "default" {
  name     = "cloud-run-srv"
  location = "us-central1"

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    service_account = google_service_account.cloudrun_service_identity.email
  }
}

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

如果您配置的服务账号来自与 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。

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

后续步骤