配置 Secret

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

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

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

如需了解详情,请参阅 Secret Manager 最佳做法文档。

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

在作业创建期间,系统会检查所有使用的 Secret(无论是作为环境变量还是作为卷装载),以确保用于运行容器的服务账号有权访问它们。如果任何检查失败,则作业创建会失败。

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

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

卷所有权因执行环境和部署类型而异

使用第二代执行环境装载 Secret 卷时(在作业情况下),卷归 root 所有。

准备工作

  1. Enable the Secret Manager API.

    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 或 YAML 将 Secret 设为可供作业访问:

控制台

  1. 在 Google Cloud 控制台中,进入 Cloud Run 作业页面:

    转到 Cloud Run

  2. 点击部署容器,然后选择作业以填写初始作业设置页面。如果要配置现有作业,请点击作业,然后点击修改

  3. 点击容器、变量和 Secret、连接、安全性以展开作业属性页面。

  4. 点击变量和 Secret 标签页。

    图片

    • 在“变量和 Secret”标签页中:
      • 在“Secret”下,点击添加 Secret 引用
      • Secret 下拉列表中选择要使用的 Secret。
      • 在“引用方法”下拉菜单中,选择您要使用 Secret 的方法,即作为卷装载或作为环境变量公开。
      • 如果要将 Secret 作为卷装载,
        1. 装载路径下,指定您要用于 Secret 的装载路径。
        2. 系统默认选择最新版本。您可以根据需要选择特定版本。在指定的 Secret 路径下,指定版本的路径和版本号。
        3. 点击完成
      • 如果您将 Secret 作为环境变量公开,请执行以下操作:
        1. 提供变量的名称并选择 Secret 版本,或者选择 最新版以始终使用当前的 Secret 版本。
        2. 点击完成
  5. 点击创建更新

gcloud

  • 如需在创建新作业时在环境变量中指定 Secret,请运行以下命令:

    gcloud run jobs create JOB_NAME \
    --image IMAGE_URL \
    --set-secrets ENV_VAR_NAME=SECRET_NAME:VERSION

    您需要进行如下替换

    • JOB_NAME 替换为作业的名称。
    • ENV_VAR_NAME 替换为要用于 Secret 的环境变量的名称。
    • SECRET_NAME 替换为同一项目中的 Secret 名称,例如 mysecret
    • VERSION 替换为 Secret 版本。请使用 latest 获取最新版本,或者使用数字,例如 2
    • IMAGE_URL 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/job:latest

    您可以使用英文逗号分隔列表指定多个环境变量/Secret 对。

  • 如需在更新作业时在环境变量中指定 Secret,请运行以下命令:

    gcloud run jobs update JOB_NAME \
    --set-secrets ENV_VAR_NAME=SECRET_NAME:VERSION
  • 如需在创建作业时将 Secret 作为卷装载,请运行以下命令:

    gcloud run jobs create JOB_NAME \
    --image IMAGE_URL \
    --set-secrets=PATH=SECRET_NAME:VERSION

    您需要进行如下替换:

    • JOB_NAME 替换为作业的名称。
    • IMAGE_URL 替换为对容器映像的引用(例如 us-docker.pkg.dev/cloudrun/container/job:latest)。
    • PATH 替换为卷的卷路径和 Secret 文件名。它必须以正斜杠开头,例如 /etc/secrets/dbconfig/password,其中 /etc/secrets/dbconfig/ 是卷的装载路径,password 是 Secret 的文件名。
    • SECRET_NAME 替换为同一项目中的 Secret 名称,例如 mysecret
    • VERSION 替换为 Secret 版本。请使用 latest 获取最新版本,或者使用数字,例如 2
  • 如需更新现有作业中的 Secret,请运行以下命令:

    gcloud run jobs update JOB_NAME \
    --update-secrets=PATH=SECRET_NAME:VERSION

YAML

由于 API 兼容性的限制,Secret 位置必须存储在注解中。

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

    gcloud run jobs describe JOB_NAME --format export > job.yaml
  2. 对于作为环境变量公开的 Secret:

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB
    spec:
      template:
        spec:
          template:
            spec:
              containers:
              - env:
                - name: SECRET_NAME
                  valueFrom:
                    secretKeyRef:
                      key: VERSION
                      name: SECRET_LOOKUP_NAME
                image: IMAGE_URL 

    您需要进行如下替换:

    • JOB 替换为作业的名称。
    • IMAGE_URL 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。 如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址格式为 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • SECRET_NAME 替换为 Secret 名称,例如 mysecret
    • VERSION 替换为 Secret 版本。请使用 latest 获取最新版本,或者使用数字,例如 2
    • SECRET_LOOKUP_NAME 替换为任何具有有效 Secret 名称语法的名称(例如 my-secret),它可以与 SECRET_NAME 相同
  3. 对于作为文件路径装载的 Secret:

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB_NAME
    spec:
      template:
        spec:
          template:
            spec:
              containers:
              - image: IMAGE_URL
                volumeMounts:
                - mountPath: MOUNT_PATH
                  name: VOLUME_NAME
              volumes:
              - name: VOLUME_NAME
                secret:
                  items:
                  - key: VERSION
                    path: FILENAME
                  secretName: SECRET_LOOKUP_NAME

    您需要进行如下替换:

    • JOB_NAME 替换为作业的名称。
    • IMAGE_URL 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。 如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址格式为 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • PATH 替换为卷的卷路径和 Secret 文件名。它必须以正斜杠开头,例如 /etc/secrets/dbconfig/password,其中 /etc/secrets/dbconfig/ 是卷的装载路径,password 是 Secret 的文件名。
    • PROJECT_NUMBER 替换为在其中创建 Secret 的项目的编号。
    • SECRET_NAME 替换为 Secret 名称,例如 mysecret
    • VERSION 替换为 Secret 版本。请使用 latest 获取最新版本,或者使用数字,例如 2
    • SECRET_LOOKUP_NAME 替换为任何具有有效 Secret 名称语法的名称(例如 my-secret),它可以与 SECRET_NAME 相同
    • VOLUME_NAME 替换为任何名称(例如 my-volume),它可以与 SECRET_NAME 相同

引用其他项目中的 Secret

如果您项目的服务账号允许访问 Secret,那么您可以引用其他项目中的 Secret。

控制台

  1. 在 Google Cloud 控制台中,进入 Cloud Run 作业页面:

    转到 Cloud Run

  2. 点击部署容器,然后选择作业以填写初始作业设置页面。如果要配置现有作业,请点击作业,然后点击修改

  3. 点击容器、变量和 Secret、连接、安全性以展开作业属性页面。

  4. 点击变量和 Secret 标签页。

    图片

    • 在“变量和 Secret”标签页中:
      • 在“Secret”下,点击添加 Secret 引用
      • 从“Secret”下拉列表中选择手动输入 Secret 以显示以下表单:

        跨项目 Secret

      • 按资源 ID 添加 Secret 表单中,输入其他项目的 Secret,格式为 projects/PROJECT_NUMBER/secrets/SECRET_NAME。您也可以选择复制并粘贴其他项目中的资源 ID,具体方法是:选择 Secret,点击 Secret 右侧的操作省略号,从下拉菜单中选择复制资源 ID
      • 点击添加 Secret
      • 在“引用方法”下拉菜单中,选择您要使用 Secret 的方法,即作为卷装载或作为环境变量公开。
      • 如果要将 Secret 作为卷装载,
        1. 装载路径下,指定您要用于 Secret 的装载路径。
        2. 系统默认选择最新版本。您可以根据需要选择特定版本。在指定的 Secret 路径下,指定版本的路径和版本号。
        3. 点击完成
      • 如果您将 Secret 作为环境变量公开,请执行以下操作:
        1. 提供变量的名称并选择 Secret 版本,或者选择 最新版以始终使用当前的 Secret 版本。
        2. 点击完成
  5. 点击创建更新

gcloud

  • 如需在更新作业时将 Secret 作为卷进行装载,请运行以下命令:

    gcloud run jobs update JOB_NAME \
    --image IMAGE_URL \
    --update-secrets=PATH=projects/PROJECT_NUMBER/secrets/SECRET_NAME:VERSION
    • JOB_NAME 替换为作业的名称。
    • IMAGE_URL 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。 如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址格式为 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • PATH 替换为卷的卷路径和 Secret 文件名。它必须以正斜杠开头,例如 /etc/secrets/dbconfig/password,其中 /etc/secrets/dbconfig/ 是卷的装载路径,password 是 Secret 的文件名。
    • PROJECT_NUMBER 替换为在其中创建 Secret 的项目的编号。
    • SECRET_NAME 替换为 Secret 名称,例如 mysecret
    • VERSION 替换为 Secret 版本。请使用 latest 获取最新版本,或者使用数字,例如 2

YAML

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

    gcloud run jobs describe JOB_NAME --format export > job.yaml

由于 API 兼容性的限制,Secret 位置必须存储在注解中。

  1. 对于作为环境变量公开的 Secret:

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME
        spec:
          template:
            spec:
              containers:
              - env:
                - name: SECRET_NAME
                  valueFrom:
                    secretKeyRef:
                      key: VERSION
                      name: SECRET_LOOKUP_NAME
                image: IMAGE_URL 

    您需要进行如下替换:

    • JOB 替换为作业的名称。
    • IMAGE_URL 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。 如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址格式为 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • SECRET_NAME 替换为 Secret 名称,例如 mysecret
    • VERSION 替换为 Secret 版本。请使用 latest 获取最新版本,或者使用数字,例如 2
    • PROJECT_NUMBER 替换为在其中创建 Secret 的项目的编号。
    • SECRET_LOOKUP_NAME 替换为任何具有有效 Secret 名称语法的名称(例如 my-secret),它可以与 SECRET_NAME 相同。
  2. 对于作为文件路径装载的 Secret:

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB_NAME
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME
        spec:
          template:
            spec:
              containers:
              - image: IMAGE_URL
                volumeMounts:
                - mountPath: MOUNT_PATH
                  name: VOLUME_NAME
              volumes:
              - name: VOLUME_NAME
                secret:
                  items:
                  - key: VERSION
                    path: FILENAME
                  secretName: SECRET_LOOKUP_NAME

    您需要进行如下替换:

    • JOB_NAME 替换为作业的名称。
    • IMAGE_URL 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。 如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址格式为 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • PATH 替换为卷的卷路径和 Secret 文件名。它必须以正斜杠开头,例如 /etc/secrets/dbconfig/password,其中 /etc/secrets/dbconfig/ 是卷的装载路径,password 是 Secret 的文件名。
    • PROJECT_NUMBER 替换为在其中创建 Secret 的项目的编号。
    • SECRET_NAME 替换为 Secret 名称,例如 mysecret
    • VERSION 替换为 Secret 版本。请使用 latest 获取最新版本,或者使用数字,例如 2
    • SECRET_LOOKUP_NAME 替换为任何具有有效 Secret 名称语法的名称(例如 my-secret),它可以与 SECRET_NAME 相同。
    • VOLUME_NAME 替换为任何名称(例如 my-volume),它可以与 SECRET_NAME 相同。

查看 Secret 设置

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

控制台

  1. 在 Google Cloud 控制台中,进入 Cloud Run 作业页面:

    转到 Cloud Run 作业

  2. 点击相关作业以打开作业详情页面。

  3. 点击配置标签页。

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

gcloud

  1. 使用以下命令:

    gcloud run jobs describe JOB_NAME
  2. 在返回的配置中找到并发设置。

不允许的路径及相关限制

Cloud Run 不允许您在 /dev/proc/sys 或其子目录上装载 Secret。

如果您要在 /tmp 上装载 Secret,并且使用的是第一代执行环境,请参阅有关/tmp 上装载 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