您的实例可能需要 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 始终拥有该卷。
准备工作
启用 Secret Manager API。
启用 API 所需的角色
如需启用 API,您需要拥有
serviceusage.services.enable权限。如果您创建了项目,则可能已经通过 Owner 角色 (roles/owner) 获得了此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获得此权限。了解如何授予角色。- 使用现有 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 CLI 或 YAML 将 Secret 设为可供实例访问:
gcloud
要在部署实例时将密钥作为环境变量公开,请运行以下命令:
gcloud beta run instances deploy INSTANCE \ --image IMAGE_URL \ --update-secrets=ENV_VAR_NAME=SECRET_NAME:VERSION
替换以下内容:
INSTANCE:实例的名称。IMAGE_URL:对容器映像的引用,例如us-docker.pkg.dev/cloudrun/container/hello:latest。ENV_VAR_NAME:您要与 Secret 搭配使用的环境变量的名称。SECRET_NAME:同一项目中的 Secret 名称,例如mysecret。VERSION:Secret 版本。请使用latest获取最新版本,或者使用数字,例如2。
如需同时更新多个 Secret,请使用英文逗号分隔每个 Secret 的配置选项。以下命令会更新一个作为卷装载的 Secret,以及另一个作为环境变量公开的 Secret。 如需更新现有 Secret,请运行以下命令:
gcloud beta run instances deploy INSTANCE \ --image IMAGE_URL \ --update-secrets=PATH=SECRET_NAME:VERSION,ENV_VAR_NAME=SECRET_NAME:VERSION
如需清除现有 Secret 并使新 Secret 可用于实例,请使用
--set-secrets标志:gcloud beta run instances update INSTANCE \ --set-secrets="ENV_VAR_NAME=SECRET_NAME:VERSION"
YAML
如果您要创建新实例,请跳过此步骤。如果您要更新现有实例,请下载其 YAML 配置:
gcloud beta run instances describe INSTANCE --format export > instance.yaml
对于作为环境变量公开的 Secret:
apiVersion: run.googleapis.com/v1 kind: Instance metadata: name: INSTANCE annotations: run.googleapis.com/launch-stage: BETA spec: containers: - image: IMAGE_URL env: - name: ENV_VAR valueFrom: secretKeyRef: key: SECRET_VERSION name: SECRET_NAME
替换以下内容:
- INSTANCE:Cloud Run 实例的名称。
IMAGE_URL:对容器映像的引用,例如us-docker.pkg.dev/cloudrun/container/hello:latest。- ENV_VAR:环境变量的名称。
- SECRET_VERSION:Secret 版本。请使用
latest获取最新版本,或者使用数字,例如2。 - SECRET_NAME:Secret 名称,例如
mysecret。
对于作为文件路径装载的 Secret:
apiVersion: run.googleapis.com/v1 kind: Instance metadata: name: INSTANCE annotations: run.googleapis.com/launch-stage: BETA spec: containers: - image: IMAGE_URL volumeMounts: - name: VOLUME_NAME mountPath: MOUNT_PATH volumes: - name: VOLUME_NAME secret: secretName: SECRET_NAME items: - key: SECRET_VERSION path: SECRET_NAME
替换以下内容:
- INSTANCE:Cloud Run 实例的名称。
IMAGE_URL:对容器映像的引用,例如us-docker.pkg.dev/cloudrun/container/hello:latest。- VOLUME_NAME:您要用于卷的任何名称。
- MOUNT_PATH:您用于装载卷的相对路径,例如
/mnt/my-volume。 - SECRET_NAME:Secret 名称,例如
mysecret。 - SECRET_VERSION:Secret 版本。请使用
latest获取最新版本,或者使用数字,例如2。
使用以下命令将实例替换为其新配置:
gcloud beta run services replace service.yaml
引用其他项目中的 Secret
如需引用另一个项目中的密文,请验证您项目的实例账号是否有权访问该密文。
gcloud
如需将密文作为环境变量进行引用,请运行以下命令:
gcloud beta run instances deploy INSTANCE \ --image IMAGE_URL \ --update-secrets=ENV_VAR_NAME=projects/PROJECT_NUMBER/secrets/SECRET_NAME:VERSION
替换以下内容:
- INSTANCE:实例的名称。
IMAGE_URL:对容器映像的引用,例如us-docker.pkg.dev/cloudrun/container/hello:latest。- PROJECT_NUMBER:在其中创建 Secret 的项目的项目编号。
- SECRET_NAME:Secret 名称,例如
mysecret。 - VERSION:Secret 版本。请使用
latest获取最新版本,或者使用数字,例如2。
YAML
如果您要创建新实例,请跳过此步骤。如果您要更新现有实例,请下载其 YAML 配置:
gcloud beta run instances describe INSTANCE --format export > instance.yaml
对于作为环境变量公开的 Secret:
apiVersion: run.googleapis.com/v1 kind: Instance metadata: name: INSTANCE annotations: run.googleapis.com/launch-stage: BETA metadata: annotations: run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME spec: containers: - image: IMAGE_URL env: - name: ENV_VAR valueFrom: secretKeyRef: key: SECRET_VERSION name: SECRET_LOOKUP_NAME
替换以下内容:
- INSTANCE:Cloud Run 实例的名称。
- SECRET_LOOKUP_NAME:任何具有有效 Secret 名称语法的名称(例如
my-secret),它可以与 SECRET_NAME 相同。 - PROJECT_NUMBER:在其中创建 Secret 的项目的编号。
- SECRET_NAME:Secret 名称,例如
mysecret。 IMAGE_URL:对容器映像的引用,例如us-docker.pkg.dev/cloudrun/container/hello:latest。- ENV_VAR:环境变量的名称。
- SECRET_VERSION:Secret 版本。请使用
latest获取最新版本,或者使用数字,例如2。
对于作为文件路径装载的 Secret:
apiVersion: run.googleapis.com/v1 kind: Instance metadata: name: INSTANCE annotations: run.googleapis.com/launch-stage: BETA metadata: annotations: run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME spec: containers: - image: IMAGE_URL volumeMounts: - name: VOLUME_NAME mountPath: MOUNT_PATH volumes: - name: VOLUME_NAME secret: secretName: SECRET_NAME items: - key: SECRET_VERSION path: SECRET_LOOKUP_NAME
替换以下内容:
- INSTANCE:Cloud Run 实例的名称。
- SECRET_LOOKUP_NAME:任何具有有效 Secret 名称语法的名称,例如
my-secret。它可以与 SECRET_NAME 相同。 - PROJECT_NUMBER:在其中创建 Secret 的项目的编号。
- SECRET_NAME:Secret 名称,例如
mysecret。 IMAGE_URL:对容器映像的引用,例如us-docker.pkg.dev/cloudrun/container/hello:latest。- VOLUME_NAME:您要用于卷的任何名称。
- MOUNT_PATH:您用于装载卷的相对路径,例如
/mnt/my-volume。 - SECRET_VERSION:Secret 版本。请使用
latest获取最新版本,或者使用数字,例如2。
使用以下命令将实例替换为其新配置:
gcloud beta run instances replace instance.yaml
查看 Secret 设置
如需查看 Cloud Run 实例的当前 Secret 设置,请执行以下操作:
gcloud
使用以下命令:
gcloud beta run instances describe INSTANCE
在返回的配置中找到并发设置。
从实例中移除 Secret
您可以使用 gcloud CLI 从实例中移除 Secret:
gcloud
您可以从实例中移除所有 Secret,也可以指定一个或多个要移除的 Secret。
如需移除所有密文,请运行以下命令:
gcloud beta run instances deploy INSTANCE --image IMAGE_URL \ --clear-secrets
替换以下内容:
- INSTANCE:实例的名称。
IMAGE_URL:对容器映像的引用,例如us-docker.pkg.dev/cloudrun/container/hello:latest。
如需指定要移除的密文列表,请使用 --remove-secrets 标志。以下命令会移除一个装载为卷的密文,以及另一个公开为环境变量的密文。
gcloud beta run instances deploy INSTANCE --image IMAGE_URL \ --remove-secrets=ENV_VAR_NAME,SECRET_FILE_PATH
替换以下内容:
- INSTANCE:实例的名称。
IMAGE_URL:对容器映像的引用,例如us-docker.pkg.dev/cloudrun/container/hello: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 不支持区域级 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。