为工作器池配置 Secret

您的工作器池可能需要 API 密钥、密码、证书或其他敏感信息才能满足其依赖项的要求。对于 Cloud Run,Google 建议您将此类敏感信息存储在您在 Secret Manager 中创建的 Secret 中。

您可以通过以下方式之一为容器提供 Secret:

  • 将每个 Secret 作为卷装载后,Cloud Run 会以文件的形式将 Secret 提供给容器。读取卷时,Cloud Run 始终从 Secret Manager 中提取 Secret 值,以便使用最新版本的值。此方法还非常适合 Secret 轮替。
  • 使用环境变量传递 Secret。环境变量在实例启动时解析,因此,如果您使用此方法,Google 建议您将 Secret 固定到特定版本,而不是使用 latest 作为版本。

如需了解详情,请参阅 Secret Manager 最佳实践

如何在部署和运行时检查 Secret

在部署工作器池期间,Cloud Run 会检查您使用的所有 Secret。此检查可确保运行容器的服务账号有权访问这些 Secret。

在运行期间,当实例启动时:

  • 如果 Secret 是环境变量,Cloud Run 会在启动实例之前检索 Secret 的值。如果 Secret 检索过程失败,则实例不会启动。
  • 如果将 Secret 作为卷装载,Cloud Run 在实例启动期间不会执行任何检查。但是,在运行时,如果 Secret 无法访问,则读取已装载的卷的尝试会失败。

卷所有权

Cloud Run Secret 卷的所有权因执行环境和部署类型而异。

使用第二代执行环境装载 Secret 卷时(在工作器池中始终如此),root 拥有该卷。

准备工作

  1. Enable the Secret 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

  2. 使用现有 Secret,或按照创建 Secret 中的说明在 Secret Manager 中创建 Secret。

所需的角色

如需获得配置 Secret 所需的权限,请让您的管理员为您授予以下 IAM 角色:

如需允许 Cloud Run 访问 Secret,服务身份必须拥有以下角色:

如需了解如何将服务身份主账号添加到 Secret Manager Secret Accessor 角色,请参阅管理对 Secret 的访问权限

如需查看与 Cloud Run 关联的 IAM 角色和权限的列表,请参阅 Cloud Run IAM 角色Cloud Run IAM 权限。如果您的 Cloud Run 工作器池与Google Cloud API(例如 Cloud 客户端库)进行交互,请参阅服务身份配置指南。如需详细了解如何授予角色,请参阅部署权限管理访问权限

将 Secret 设为可供 Cloud Run 访问

任何配置更改都会导致新修订版本的创建。后续修订版本也将自动采用此配置设置,除非您进行了明确更新。

您可以在部署新的工作器池或更新现有工作器池并部署修订版本时,使用 Google Cloud 控制台或 Google Cloud CLI 将 Secret 设为可供工作器池访问。点击所选的标签页:

控制台

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

    转到 Cloud Run

  2. 从菜单中选择工作器池,然后点击部署容器以配置新的工作器池。填写初始工作器池设置页面,然后点击容器、卷、网络、安全性以展开配置页面。

  3. 如果您要配置现有工作器池,请点击该工作器池,然后点击修改和部署新的修订版本

  4. 按照以下步骤将 Secret 装载为卷,或将 Secret 作为环境变量公开。

    • 如需将密文公开为环境变量,请执行以下操作:

      1. 点击容器标签页。
      2. 变量和 Secret 标签页中,点击引用 Secret
      3. 名称 1 字段中,输入环境变量的名称。
      4. Secret 列表中选择您要使用的 Secret。
      5. 版本 1 列表中,选择要引用的 Secret 版本。
      6. 点击完成
      7. 点击创建部署
    • 如需将某个 Secret 装载为卷,请执行以下操作:

      1. 点击标签页,然后选择添加卷
      2. 卷类型列表中,选择 Secret
      3. 卷名称字段中,输入名称或接受默认名称。
      4. Secret 列表中选择您要使用的 Secret。
      5. 路径 1 字段中,输入要装载的文件的名称。
      6. 版本 1 列表中,选择要引用的 Secret 版本。系统默认选择最新版本。您可以根据需要选择特定版本。
      7. 点击完成
      8. 前往容器标签页,将 Secret 装载到容器中。
      9. 卷装载标签页中,点击装载卷
      10. 名称 1 列表中,选择卷名称。
      11. 装载路径 1 字段中,输入此 Secret 的装载路径。这是所有 Secret 版本所在的目录。
      12. 点击完成
      13. 点击创建部署

gcloud

  • 如需在部署工作池时将 Secret 公开为环境变量,请运行以下命令:

    gcloud beta run worker-pools deploy WORKER_POOL \
    --image IMAGE_URL \
    --update-secrets=ENV_VAR_NAME=SECRET_NAME:VERSION

    替换以下内容:

    • WORKER_POOL:工作器池的名称。
    • IMAGE_URL:对包含工作器池的容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/worker-pool:latest
    • ENV_VAR_NAME:您要与 Secret 搭配使用的环境变量的名称。
    • SECRET_NAME:同一项目中的 Secret 名称,例如 mysecret
    • VERSION:Secret 版本。请使用 latest 获取最新版本,或者使用数字,例如 2
  • 如需同时更新多个 Secret,请使用英文逗号分隔每个 Secret 的配置选项。以下命令会更新一个作为卷装载的 Secret,以及另一个作为环境变量公开的 Secret。如需更新现有 Secret,请运行以下命令:

    gcloud beta run worker-pools deploy WORKER_POOL \
    --image IMAGE_URL \
    --update-secrets=PATH=SECRET_NAME:VERSION,ENV_VAR_NAME=SECRET_NAME:VERSION
  • 如需清除现有 Secret 并使新 Secret 可用于工作器池,请使用 --set-secrets 标志:

    gcloud beta run worker-pools update WORKER_POOL \
    --set-secrets="ENV_VAR_NAME=SECRET_NAME:VERSION"

引用其他项目中的 Secret

如需引用另一个项目中的密文,请验证您项目的工作器池账号是否有权访问该密文

控制台

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

    转到 Cloud Run

  2. 从菜单中选择工作器池,然后点击部署容器以配置新的工作器池。填写初始工作器池设置页面,然后点击容器、卷、网络、安全性以展开配置页面。

  3. 如果您要配置现有工作器池,请点击该工作器池,然后点击修改和部署新的修订版本

  4. 按照以下步骤将 Secret 装载为卷,或将 Secret 作为环境变量公开。

    • 如需将密文公开为环境变量,请执行以下操作:

      1. 点击容器标签页。
      2. 变量和 Secret 标签页中,点击引用 Secret
      3. 名称 1 字段中,输入环境变量的名称。
      4. Secret 列表中,点击手动输入 Secret
      5. 按以下格式输入密文的资源 ID:

        projects/PROJECT_NUMBER/secrets/SECRET_NAME
        

        替换以下内容:

        • PROJECT_NUMBER 替换为您的 Google Cloud 项目编号。如需详细了解如何查找项目编号,请参阅创建和管理项目

        • SECRET_NAME:Secret Manager 中的密文名称。

      6. 版本 1 列表中,选择要引用的 Secret 版本。

      7. 点击完成

      8. 点击创建部署

    • 如需将某个 Secret 装载为卷,请执行以下操作:

      1. 点击标签页,然后选择添加卷
      2. 卷类型列表中,选择 Secret
      3. 卷名称字段中,输入名称或接受默认名称。
      4. Secret 列表中,点击手动输入 Secret
      5. 按以下格式输入密文的资源 ID:

        projects/PROJECT_NUMBER/secrets/SECRET_NAME
        

        替换以下内容:

        • PROJECT_NUMBER 替换为您的 Google Cloud 项目编号。如需详细了解如何查找项目编号,请参阅创建和管理项目

        • SECRET_NAME:Secret Manager 中的密文名称。

      6. 路径 1 字段中,输入要装载的文件的名称。

      7. 版本 1 列表中,选择要引用的 Secret 版本。系统默认选择最新版本。您可以根据需要选择特定版本。

      8. 点击完成

      9. 前往容器标签页,将 Secret 装载到容器中。

      10. 卷装载标签页中,点击装载卷

      11. 名称 1 列表中,选择卷名称。

      12. 装载路径 1 字段中,输入此 Secret 的装载路径。这是所有 Secret 版本所在的目录。

      13. 点击完成

      14. 点击创建部署

gcloud

如需将密文作为环境变量引用,请运行以下命令:

gcloud beta run worker-pools deploy WORKER_POOL \
--image IMAGE_URL \
--update-secrets=ENV_VAR_NAME=projects/PROJECT_NUMBER/secrets/SECRET_NAME:VERSION

替换以下内容:

  • WORKER_POOL:工作器池的名称。
  • IMAGE_URL:对包含工作器池的容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/worker-pool:latest
  • PROJECT_NUMBER 替换为在其中创建 Secret 的项目的编号。
  • SECRET_NAME:Secret 名称,例如 mysecret
  • VERSION 替换为 Secret 版本。请使用 latest 获取最新版本,或者使用数字,例如 2

查看 Secret 设置

如需查看 Cloud Run Worker 池的当前 Secret 设置,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,前往 Cloud Run 工作池页面:

    前往 Cloud Run 工作器池

  2. 点击您感兴趣的工作器池以打开工作器池详情页面。

  3. 点击修改和部署新的修订版本

  4. 在配置详细信息中找到 Secret 设置。

gcloud

  1. 使用以下命令:

    gcloud beta run worker-pools describe WORKER_POOL
  2. 在返回的配置中找到并发设置。

从工作器池中移除 Secret

您可以使用 Google Cloud 控制台或 gcloud CLI 从工作器池中移除 Secret:

控制台

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

    转到 Cloud Run

  2. 从列表中选择您的工作器池,然后点击修改和部署新的修订版本

  3. 点击容器标签页。

  4. 如需删除装载为卷的 Secret,请选择卷装载标签页,将鼠标指针悬停在要移除的 Secret 上,然后点击 删除

  5. 如需删除作为环境变量公开的 Secret,请选择变量和 Secret 标签页,将鼠标指针悬停在要移除的 Secret 上,然后点击 删除

  6. 点击部署

gcloud

您可以从工作器池中移除所有 Secret,也可以指定一个或多个要移除的 Secret:

  • 如需移除所有密文,请运行以下命令:
  gcloud beta run worker-pools deploy WORKER_POOL --image IMAGE_URL \
  --clear-secrets

替换以下内容:

  • WORKER_POOL:工作器池的名称。
  • IMAGE_URL:对包含工作器池的容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/worker-pool:latest

  • 如需指定要移除的密文列表,请使用 --remove-secrets 标志。以下命令会移除一个装载为卷的密文,以及另一个公开为环境变量的密文。

  gcloud beta run worker-pools deploy WORKER_POOL --image IMAGE_URL \
  --remove-secrets=ENV_VAR_NAME,SECRET_FILE_PATH

替换以下内容:

  • WORKER_POOL:工作器池的名称。
  • IMAGE_URL:对包含工作器池的容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/worker-pool:latest
  • ENV_VAR_NAME:环境变量的名称。
  • SECRET_FILE_PATH:Secret 的完整路径。例如 /mnt/secrets/primary/latest,其中 /mnt/secrets/primary/ 是装载路径,latest 是密文路径。您也可以分别指定装载路径和密文路径:

    --set-secrets MOUNT_PATH:SECRET_PATH=SECRET:VERSION

在代码中使用 Secret

如需查看如何将代码中的 Secret 作为环境变量进行访问的示例,请参阅有关最终用户身份验证的教程,尤其是使用 Secret Manager 处理敏感配置部分。

不允许的路径及相关限制

挂载 Secret 存在以下限制:

  • Cloud Run 不允许您在 /dev/proc/sys 或其子目录上装载 Secret。
  • Cloud Run 不允许在同一路径下装载多个 Secret,因为两个卷装载无法装载到同一位置。

覆盖目录

如果 Secret 在 Cloud Run 中作为卷装载,并且卷装载路径中的最终目录已存在,则现有目录中的任何文件或文件夹都将无法访问。

例如,如果名为 my-secret 的 Secret 装载到路径 /etc/app_data 中,则 app_data 目录中的所有内容都将被覆盖,并且唯一可见的文件是 /etc/app_data/my-secret

如需避免覆盖现有目录中的文件,请创建新目录以用于装载 Secret(例如 /etc/app_data/secrets),以便 Secret 的装载路径为 /etc/app_data/secrets/my-secret