您的工作器池可能需要 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 将 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 版本所在的目录。
- 点击完成。
- 点击创建或部署。
gcloud
如需在部署工作池时将 Secret 公开为环境变量,请运行以下命令:
gcloud beta run worker-pools deploy WORKER_POOL \ --image IMAGE_URL \ --update-secrets=ENV_VAR_NAME=SECRET_NAME:VERSION
替换以下内容:
WORKER_POOL
:工作器池的名称。- IMAGE_URL:对包含工作器池的容器映像的引用,例如
us-docker.pkg.dev/cloudrun/container/worker-pool:latest
。 ENV_VAR_NAME
:您要与 Secret 搭配使用的环境变量的名称。SECRET_NAME
:同一项目中的 Secret 名称,例如mysecret
。VERSION
:Secret 版本。请使用latest
获取最新版本,或者使用数字,例如2
。
如需同时更新多个 Secret,请使用英文逗号分隔每个 Secret 的配置选项。以下命令会更新一个作为卷装载的 Secret,以及另一个作为环境变量公开的 Secret。如需更新现有 Secret,请运行以下命令:
gcloud beta run worker-pools deploy WORKER_POOL \ --image IMAGE_URL \ --update-secrets=PATH=SECRET_NAME:VERSION,ENV_VAR_NAME=SECRET_NAME:VERSION
如需清除现有 Secret 并使新 Secret 可用于工作器池,请使用
--set-secrets
标志:gcloud beta run worker-pools update WORKER_POOL \ --set-secrets="ENV_VAR_NAME=SECRET_NAME:VERSION"
引用其他项目中的 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 版本所在的目录。
点击完成。
点击创建或部署。
gcloud
如需将密文作为环境变量引用,请运行以下命令:
gcloud beta run worker-pools deploy WORKER_POOL \ --image IMAGE_URL \ --update-secrets=ENV_VAR_NAME=projects/PROJECT_NUMBER/secrets/SECRET_NAME:VERSION
替换以下内容:
WORKER_POOL
:工作器池的名称。- IMAGE_URL:对包含工作器池的容器映像的引用,例如
us-docker.pkg.dev/cloudrun/container/worker-pool:latest
。 - 将
PROJECT_NUMBER
替换为在其中创建 Secret 的项目的编号。 SECRET_NAME
:Secret 名称,例如mysecret
。- 将
VERSION
替换为 Secret 版本。请使用latest
获取最新版本,或者使用数字,例如2
。
查看 Secret 设置
如需查看 Cloud Run Worker 池的当前 Secret 设置,请执行以下操作:
控制台
在 Google Cloud 控制台中,前往 Cloud Run 工作池页面:
点击您感兴趣的工作器池以打开工作器池详情页面。
点击修改和部署新的修订版本。
在配置详细信息中找到 Secret 设置。
gcloud
使用以下命令:
gcloud beta run worker-pools describe WORKER_POOL
在返回的配置中找到并发设置。
从工作器池中移除 Secret
您可以使用 Google Cloud 控制台或 gcloud CLI 从工作器池中移除 Secret:
控制台
在 Google Cloud 控制台中,前往 Cloud Run:
从列表中选择您的工作器池,然后点击修改和部署新的修订版本。
点击容器标签页。
如需删除装载为卷的 Secret,请选择卷装载标签页,将鼠标指针悬停在要移除的 Secret 上,然后点击
删除。如需删除作为环境变量公开的 Secret,请选择变量和 Secret 标签页,将鼠标指针悬停在要移除的 Secret 上,然后点击
删除。点击部署。
gcloud
您可以从工作器池中移除所有 Secret,也可以指定一个或多个要移除的 Secret:
- 如需移除所有密文,请运行以下命令:
gcloud beta run worker-pools deploy WORKER_POOL --image IMAGE_URL \ --clear-secrets
替换以下内容:
- WORKER_POOL:工作器池的名称。
IMAGE_URL:对包含工作器池的容器映像的引用,例如
us-docker.pkg.dev/cloudrun/container/worker-pool:latest
。如需指定要移除的密文列表,请使用
--remove-secrets
标志。以下命令会移除一个装载为卷的密文,以及另一个公开为环境变量的密文。
gcloud beta run worker-pools deploy WORKER_POOL --image IMAGE_URL \ --remove-secrets=ENV_VAR_NAME,SECRET_FILE_PATH
替换以下内容:
- WORKER_POOL:工作器池的名称。
- IMAGE_URL:对包含工作器池的容器映像的引用,例如
us-docker.pkg.dev/cloudrun/container/worker-pool:latest
。 - ENV_VAR_NAME:环境变量的名称。
SECRET_FILE_PATH:Secret 的完整路径。例如
/mnt/secrets/primary/latest
,其中/mnt/secrets/primary/
是装载路径,latest
是密文路径。您也可以分别指定装载路径和密文路径:--set-secrets MOUNT_PATH:SECRET_PATH=SECRET:VERSION
在代码中使用 Secret
如需查看如何将代码中的 Secret 作为环境变量进行访问的示例,请参阅有关最终用户身份验证的教程,尤其是使用 Secret Manager 处理敏感配置部分。
不允许的路径及相关限制
挂载 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
。