您的作业可能需要具有需要 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 所有。
准备工作
-
Enable the Secret Manager API.
- 使用现有 Secret,或按照创建 Secret 中的说明在 Secret Manager 中创建 Secret。
所需的角色
如需获得配置 Secret 所需的权限,请让管理员向您授予以下 IAM 角色:
-
Cloud Run 作业的 Cloud Run Admin (
roles/run.admin
) 角色 -
服务身份的 Service Account User (
roles/iam.serviceAccountUser
) 角色
如需允许 Cloud Run 访问 Secret,服务身份必须拥有以下角色:
- Secret Manager Secret Accessor (
roles/secretmanager.secretAccessor
)
如需了解如何将服务身份主账号添加到 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 设为可供作业访问:
控制台
在 Google Cloud 控制台中,进入 Cloud Run 作业页面:
点击部署容器,然后选择作业以填写初始作业设置页面。如果要配置现有作业,请点击作业,然后点击修改。
点击容器、变量和 Secret、连接、安全性以展开作业属性页面。
点击变量和 Secret 标签页。
- 在“变量和 Secret”标签页中:
- 在“Secret”下,点击添加 Secret 引用
- 从 Secret 下拉列表中选择要使用的 Secret。
- 在“引用方法”下拉菜单中,选择您要使用 Secret 的方法,即作为卷装载或作为环境变量公开。
- 如果要将 Secret 作为卷装载,
- 在装载路径下,指定您要用于 Secret 的装载路径。
- 系统默认选择最新版本。您可以根据需要选择特定版本。在指定的 Secret 路径下,指定版本的路径和版本号。
- 点击完成。
- 如果您将 Secret 作为环境变量公开,请执行以下操作:
- 提供变量的名称并选择 Secret 版本,或者选择 最新版以始终使用当前的 Secret 版本。
- 点击完成。
- 在“变量和 Secret”标签页中:
点击创建或更新。
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 位置必须存储在注解中。
如果您要创建新的服务,请跳过此步骤。如果您要更新现有服务,请下载其 YAML 配置:
gcloud run jobs describe JOB_NAME --format export > job.yaml
对于作为环境变量公开的 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
相同
- 将
对于作为文件路径装载的 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。
控制台
在 Google Cloud 控制台中,进入 Cloud Run 作业页面:
点击部署容器,然后选择作业以填写初始作业设置页面。如果要配置现有作业,请点击作业,然后点击修改。
点击容器、变量和 Secret、连接、安全性以展开作业属性页面。
点击变量和 Secret 标签页。
- 在“变量和 Secret”标签页中:
- 在“Secret”下,点击添加 Secret 引用
- 从“Secret”下拉列表中选择手动输入 Secret 以显示以下表单:
- 在按资源 ID 添加 Secret 表单中,输入其他项目的 Secret,格式为
projects/PROJECT_NUMBER/secrets/SECRET_NAME
。您也可以选择复制并粘贴其他项目中的资源 ID,具体方法是:选择 Secret,点击 Secret 右侧的操作省略号,从下拉菜单中选择复制资源 ID。 - 点击添加 Secret。
- 在“引用方法”下拉菜单中,选择您要使用 Secret 的方法,即作为卷装载或作为环境变量公开。
- 如果要将 Secret 作为卷装载,
- 在装载路径下,指定您要用于 Secret 的装载路径。
- 系统默认选择最新版本。您可以根据需要选择特定版本。在指定的 Secret 路径下,指定版本的路径和版本号。
- 点击完成。
- 如果您将 Secret 作为环境变量公开,请执行以下操作:
- 提供变量的名称并选择 Secret 版本,或者选择 最新版以始终使用当前的 Secret 版本。
- 点击完成。
- 在“变量和 Secret”标签页中:
点击创建或更新。
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
如果您要创建新的作业,请跳过此步骤。如果您要更新现有服务,请下载其 YAML 配置:
gcloud run jobs describe JOB_NAME --format export > job.yaml
由于 API 兼容性的限制,Secret 位置必须存储在注解中。
对于作为环境变量公开的 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
相同。
- 将
对于作为文件路径装载的 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 设置,请执行以下操作:
控制台
在 Google Cloud 控制台中,进入 Cloud Run 作业页面:
点击相关作业以打开作业详情页面。
点击配置标签页。
在配置详细信息中找到 Secret 设置。
gcloud
使用以下命令:
gcloud run jobs describe JOB_NAME
在返回的配置中找到并发设置。
不允许的路径及相关限制
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
。