配置 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 所有。

准备工作

您可以使用现有的 Secret Manager Secret,也可以创建新的 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