您的作业可能需要 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 拥有该卷。
准备工作
-
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 theserviceusage.services.enable
permission. Learn how to grant roles. - 使用现有 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/job:latest
。 - 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/job:latest
。 - 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/job:latest
。 - 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/job:latest
。 - 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/job:latest
。 - 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
在返回的配置中找到并发设置。
不允许的路径及相关限制
挂载 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
。