您的作业可能需要具有需要 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。
- 在名称 1 字段中,输入环境变量的名称。
- 从 Secret 列表中选择您要使用的 Secret。
- 从版本 1 列表中,选择要引用的 Secret 版本。
- 点击完成。
- 点击创建或部署。
如需将 Secret 装载为卷,请执行以下操作:
- 点击卷标签页,然后选择添加卷。
- 从卷类型列表中,选择 Secret。
- 在卷名称字段中,输入名称或接受默认名称。
- 从 Secret 列表中选择您要使用的 Secret。
- 在路径 1 字段中,输入要装载的文件的名称。
- 在版本 1 列表中,选择要引用的 Secret 版本。系统默认选择最新版本。您可以根据需要选择特定版本。
- 点击完成。
- 前往容器标签页,将 Secret 装载到容器中。
- 在卷装载标签页中,点击装载卷。
- 从名称 1 列表中,选择卷名称。
- 在装载路径 1 字段中,输入此 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
相同
- 将
Terraform
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。
将以下内容添加到 Terraform 配置中的google_cloud_run_v2_job
资源:对于作为环境变量公开的 Secret:
resource "google_cloud_run_v2_job" "default" {
name = "JOB_NAME"
location = "REGION"
template {
template {
containers {
image = "IMAGE_URL"
env {
name = "SECRET_NAME"
value_source {
secret_key_ref {
secret = "SECRET_NAME"
version = "VERSION"
}
}
}
}
}
}
}
您需要进行如下替换:
- 将 JOB_NAME 替换为 Cloud Run 作业的名称。
- 将 REGION 替换为 Google Cloud 区域。例如
europe-west1
。 - 将 IMAGE_URL 替换为对容器映像的引用,例如
us-docker.pkg.dev/cloudrun/container/job:latest
- 将 SECRET_NAME 替换为 Secret 名称,例如
mysecret
。 - 将 VERSION 替换为 Secret 版本。请使用
latest
获取最新版本,或者使用数字,例如2
。
对于作为文件路径装载的 Secret:
resource "google_cloud_run_v2_job" "default" {
name = "JOB_NAME"
location = "REGION"
template {
template {
containers {
image = "IMAGE_URL"
volume_mounts {
name = "VOLUME_NAME"
mount_path = "MOUNT_PATH"
}
}
volumes {
name = "VOLUME_NAME"
secret {
secret = "SECRET_NAME"
}
}
}
}
}
您需要进行如下替换:
- 将 JOB_NAME 替换为 Cloud Run 作业的名称。
- 将 REGION 替换为 Google Cloud 区域。例如
europe-west1
。 - 将 IMAGE_URL 替换为对容器映像的引用,例如
us-docker.pkg.dev/cloudrun/container/job:latest
- 将 VOLUME_NAME 替换为任何名称(例如
my-volume
),它可以与SECRET_NAME
相同 - 将 MOUNT_PATH 替换为卷的卷路径和 Secret 文件名。它必须以正斜杠开头,例如
/etc/secrets/dbconfig/password
,其中/etc/secrets/dbconfig/
是卷的装载路径,password
是 Secret 的文件名。 - 将 SECRET_NAME 替换为 Secret 名称,例如
mysecret
。
引用其他项目中的 Secret
如果您项目的服务账号允许访问 Secret,那么您可以引用其他项目中的 Secret。
控制台
在 Google Cloud 控制台中,前往 Cloud Run 作业页面:
从菜单中选择作业,然后点击部署容器以填写初始作业设置页面。如果要配置现有作业,请选择作业,然后点击修改。
点击容器、卷、连接和安全性以展开作业属性页面。
点击变量和 Secret 标签页。
- 在“变量和 Secret”标签页中:
如需将密文公开为环境变量,请执行以下操作:
- 点击容器标签页。
- 在变量和 Secret 标签页中,点击引用 Secret。
- 在名称 1 字段中,输入环境变量的名称。
- 在 Secret 列表中,点击手动输入 Secret。
按以下格式输入密文的资源 ID:
projects/PROJECT_NUMBER/secrets/SECRET_NAME
替换以下内容:
将 PROJECT_NUMBER 替换为您的 Google Cloud 项目编号。如需详细了解如何查找项目编号,请参阅创建和管理项目。
SECRET_NAME:Secret Manager 中的密文名称。
从版本 1 列表中,选择要引用的 Secret 版本。
点击完成。
点击创建或部署。
如需将 Secret 装载为卷,请执行以下操作:
- 点击卷标签页,然后选择添加卷。
- 从卷类型列表中,选择 Secret。
- 在卷名称字段中,输入名称或接受默认名称。
- 在 Secret 列表中,点击手动输入 Secret。
按以下格式输入密文的资源 ID:
projects/PROJECT_NUMBER/secrets/SECRET_NAME
替换以下内容:
将 PROJECT_NUMBER 替换为您的 Google Cloud 项目编号。如需详细了解如何查找项目编号,请参阅创建和管理项目。
SECRET_NAME:Secret Manager 中的密文名称。
在路径 1 字段中,输入要装载的文件的名称。
在版本 1 列表中,选择要引用的 Secret 版本。系统默认选择最新版本。您可以根据需要选择特定版本。
点击完成。
前往容器标签页,将 Secret 装载到容器中。
在卷装载标签页中,点击装载卷。
从名称 1 列表中,选择卷名称。
在装载路径 1 字段中,输入此 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
相同。
- 将
Terraform
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。
将以下内容添加到 Terraform 配置中的google_cloud_run_v2_job
资源:对于作为环境变量公开的 Secret:
resource "google_cloud_run_v2_job" "default" {
name = "JOB_NAME"
location = "REGION"
template {
template {
containers {
image = "IMAGE_URL"
env {
name = "SECRET_NAME"
value_source {
secret_key_ref {
secret = "projects/PROJECT_ID/secrets/SECRET_NAME"
version = "VERSION"
}
}
}
}
}
}
}
您需要进行如下替换:
- 将 JOB_NAME 替换为 Cloud Run 作业的名称。
- 将 REGION 替换为 Google Cloud 区域。例如
europe-west1
。 - 将 IMAGE_URL 替换为对容器映像的引用,例如
us-docker.pkg.dev/cloudrun/container/job:latest
- 将 SECRET_NAME 替换为 Secret 名称,例如
mysecret
。 - 将 PROJECT_ID 替换为在其中创建 Secret 的项目 ID。
- 将 VERSION 替换为 Secret 版本。请使用
latest
获取最新版本,或者使用数字,例如2
。
对于作为文件路径装载的 Secret:
resource "google_cloud_run_v2_job" "default" {
name = "JOB_NAME"
location = "REGION"
template {
template {
containers {
image = "IMAGE_URL"
volume_mounts {
name = "VOLUME_NAME"
mount_path = "MOUNT_PATH"
}
}
volumes {
name = "VOLUME_NAME"
secret {
secret = "projects/PROJECT_ID/secrets/SECRET_NAME"
}
}
}
}
}
您需要进行如下替换:
- 将 JOB_NAME 替换为 Cloud Run 作业的名称。
- 将 REGION 替换为 Google Cloud 区域。例如
europe-west1
。 - 将 IMAGE_URL 替换为对容器映像的引用,例如
us-docker.pkg.dev/cloudrun/container/job:latest
- 将 VOLUME_NAME 替换为任何名称(例如
my-volume
),它可以与SECRET_NAME
相同 - 将 MOUNT_PATH 替换为卷的卷路径和 Secret 文件名。它必须以正斜杠开头,例如
/etc/secrets/dbconfig/password
,其中/etc/secrets/dbconfig/
是卷的装载路径,password
是 Secret 的文件名。 - 将 PROJECT_ID 替换为在其中创建 Secret 的项目 ID。
- 将 SECRET_NAME 替换为 Secret 名称,例如
mysecret
。
查看 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
。