配置 Secret(第 1 代)
您可以使用 Secret Manager 安全地存储 API 密钥、密码和其他敏感信息。本指南介绍如何配置 Cloud Run 函数以访问存储在 Secret Manager 中的密文。
本文档介绍向函数提供密文的两种方法:
将 Secret 装载为卷。这会将密文作为文件提供给函数。如果您将密文作为卷引用,则每次从磁盘读取该文件时,函数都会从 Secret Manager 访问密文值。如果您希望引用最新版本的密文而不是固定版本的密文,则将其装载为卷是一个很好的策略。如果您计划实现密文轮替,则此方法也非常适用。
将 Secret 作为环境变量传递。环境变量值会在实例启动时进行解析,因此如果您使用此方法,我们建议您引用固定版本的密文,而不是引用最新版本的密文。
如需详细了解如何使用 Secret Manager,请参阅 Secret Manager 概览。 如需了解如何创建和访问 Secret,请参阅创建 Secret。
准备工作
-
Enable the Secret Manager API.
- 按照创建 Secret 中的说明在 Secret Manager 中创建 Secret(如果您尚未创建)。
授予对密文的访问权限
您的函数可以访问与该函数位于同一项目的密文,也可以访问位于另一个项目中的密文。要访问 Secret,函数的运行时服务账号必须被授予 Secret 的访问权限。
默认情况下,Cloud Run 函数使用 App Engine 默认服务账号向 Secret Manager 进行身份验证。对于生产用途,Google 建议您将函数配置为使用用户管理的服务账号进行身份验证,该服务账号分配有包含完成该函数的任务所需的最小权限的一组角色。
如需将 Secret Manager 与 Cloud Run 函数搭配使用,请向与您的函数关联的服务账号分配 roles/secretmanager.secretAccessor
角色:
转到 Google Cloud 控制台中的 Secret Manager 页面:
转到 Secret Manager 页面点击 Secret 旁边的复选框。
如果面板尚未打开,请点击显示信息面板以打开面板。
在信息面板中,点击添加主账号。
在新的主账号字段中,输入函数用于其身份的服务账号。函数的服务账号是以下之一:
在部署时分配给函数的用户管理的服务账号。如需了解如何使用用户管理的服务账号部署函数,请参阅为函数使用单独的服务账号。
App Engine 默认服务账号(不建议用于生产用途)。
在选择角色下拉列表中,选择 Secret Manager,然后选择 Secret Manager Secret Accessor。
准备函数以访问 Secret
您可以通过以下两种方式向函数提供 Secret:
- 将 Secret 作为环境变量传递。
- 将 Secret 装载为卷。
环境变量
如需使用环境变量将 Secret 提供给函数,请执行以下操作:
将 Secret 装载为卷
如需将 Secret 装载为卷,请执行以下操作:
创建一个包含 Secret 的文件。
选择一个未使用的非系统目录(例如
/mnt/secrets
)作为 Secret 的挂载路径。装载 Secret 后,该目录中除 Secret 及其版本以外的所有现有文件或子目录都将无法访问。在运行时,以编程方式读取文件内容以访问 Secret 值。
例如,如果 Secret 已装载到 /mnt/secrets/secret1
,则函数必须读取此文件。以下示例展示了如何使用 Node.js 同步读取此文件:
fs.readFileSync('/mnt/secrets/secret1')
使密文可被函数访问
要从函数引用密文,您必须先使密文可被函数访问。您可以使用 Google Cloud 控制台或 Google Cloud CLI 使密文可被新函数或现有函数访问:
控制台
要使密文可被函数访问,请执行以下操作:
前往 Google Cloud 控制台中的 Cloud Run 函数页面:
前往 Cloud Run 函数页面点击要访问密文的函数的名称。
点击修改。
点击运行时、构建...以展开高级配置选项。
点击安全和映像代码库以打开该标签页。
点击添加 Secret 引用,以为函数设置 Secret。
选择要使其可被访问的密文。如果需要,请创建 Secret。
如需引用与函数位于同一项目中的密文,请执行以下操作:
- 从下拉列表中选择 Secret。
如需引用另一个项目中的密文,请执行以下操作:
验证您项目的服务账号已被授予密文的访问权限。
选择手动输入 Secret。
按以下格式输入密文的资源 ID:
projects/PROJECT_ID/secrets/SECRET_NAME
替换以下内容:
PROJECT_ID:密文所在项目的 ID。
SECRET_NAME:Secret Manager 中的密文名称。
选择密文的引用方法。您可以将密文作为卷装载,也可以将密文作为环境变量公开。
如需将密文装载为卷,请执行以下操作:
选择装载为卷。
在装载路径字段中,输入此 Secret 的装载路径。这是所有 Secret 版本所在的目录。
在Path1 字段中,输入要装载的文件的名称。此名称会与上一步中的装载路径串联,以形成装载 Secret 的完整装载路径。
从Version1 下拉列表中,选择要引用的 Secret 版本。
如需装载此 Secret 的其他版本,您可以点击 +添加来指定其他路径以及要在其中装载的 Secret 版本。
如需将密文公开为环境变量,请执行以下操作:
选择公开为环境变量。
在Name1 字段中,输入环境变量的名称。
从Version1 下拉列表中,选择要引用的 Secret 版本。
如需将此 Secret 的其他版本公开给函数,您可以点击 +添加来定义其他环境变量以及要在其中存储的 Secret 版本。
点击完成。
点击下一步。
点击部署。
函数的代码现在可以引用密文。
gcloud
要使函数可访问密文,请输入以下命令之一。
如需将密文装载为卷,请输入以下命令:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --runtime RUNTIME \ --set-secrets 'SECRET_FILE_PATH=SECRET:VERSION'
替换以下内容:
FUNCTION_NAME:函数的名称。
RUNTIME:运行函数的运行时。
SECRET_FILE_PATH:密文的完整路径。例如
/mnt/secrets/primary/latest
,其中/mnt/secrets/primary/
是装载路径,latest
是密文路径。您也可以分别指定装载路径和密文路径:--set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'
SECRET:Secret Manager 中的密文名称。
VERSION:要使用的密文的版本。例如
1
或latest
。
--set-secrets
标志会替换任何现有密文。如需保留函数的现有密文,请改用--update-secrets
标志。如需将密文公开为环境变量,请输入以下命令:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --runtime RUNTIME \ --set-secrets 'ENV_VAR_NAME=SECRET:VERSION'
替换以下内容:
FUNCTION_NAME:函数的名称。
RUNTIME:运行函数的运行时。
ENV_VAR_NAME:环境变量的名称。
SECRET:Secret Manager 中的密文名称。
VERSION:要使用的密文的版本。例如
1
或latest
。
--set-secrets
标志会替换任何现有密文。如需保留函数的现有密文,请改用--update-secrets
标志。如果函数的服务账号已被授予另一个项目中密文的访问权限,则可以引用另一个项目中的密文。如需引用另一个项目中的密文,请使用该密文的资源路径:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --runtime RUNTIME \ --update-secrets 'SECRET_FILE_PATH=SECRET_RESOURCE_PATH:VERSION'
替换以下内容:
FUNCTION_NAME:函数的名称。
SECRET_RESOURCE_PATH:位于另一个项目中的密文的资源路径。资源路径采用以下格式:
projects/PROJECT_ID/secrets/SECRET_NAME
替换以下内容:
PROJECT_ID:密文所在项目的 ID。
SECRET_NAME:Secret Manager 中的密文名称。
RUNTIME:运行函数的运行时。
SECRET_FILE_PATH:密文的完整路径。例如
/mnt/secrets/primary/latest
,其中/mnt/secrets/primary/
是装载路径,latest
是密文路径。您也可以分别指定装载路径和密文路径:--set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'
SECRET:Secret Manager 中的密文名称。
VERSION:要使用的密文的版本。例如
1
或latest
。
您可以一次更新多个 Secret。请以英文逗号分隔每个密文的配置选项。以下命令会更新一个作为卷装载的 Secret,以及另一个作为环境变量公开的 Secret。
如需更新现有 Secret,请输入以下命令:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --runtime RUNTIME \ --update-secrets 'ENV_VAR_NAME=SECRET:VERSION, \ SECRET_FILE_PATH=SECRET:VERSION'
替换以下内容:
FUNCTION_NAME:函数的名称。
RUNTIME:运行函数的运行时。
ENV_VAR_NAME:环境变量的名称。
SECRET:Secret Manager 中的密文名称。
VERSION:要使用的密文的版本。例如
1
或latest
。SECRET_FILE_PATH:密文的完整路径。例如
/mnt/secrets/primary/latest
,其中/mnt/secrets/primary/
是装载路径,latest
是密文路径。您也可以分别指定装载路径和密文路径:--set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'
从函数中移除密文
您可以使用 Google Cloud 控制台或 gcloud CLI 从函数中移除密文:
控制台
前往 Google Cloud 控制台中的 Cloud Run 函数页面:
前往 Cloud Run 函数页面点击要移除某个 Secret 的函数的名称。
点击修改。
点击运行时、构建和连接设置以展开高级配置选项。
点击安全和映像代码库以打开“安全”标签页。
将鼠标指针悬停在要移除的 Secret 上,然后点击
删除。点击下一步。
点击部署。
gcloud
您可以从函数中移除所有密文,或指定一个或多个要移除的密文:
如需移除所有密文,请运行以下命令:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --runtime RUNTIME \ --clear-secrets
替换以下内容:
FUNCTION_NAME:函数的名称。
RUNTIME:运行函数的运行时。
所有密文都会从该函数中清除。
如需指定要移除的密文列表,请使用
--remove-secrets
标志。以下命令会移除一个装载为卷的密文,以及另一个公开为环境变量的密文。gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --runtime RUNTIME \ --remove-secrets='ENV_VAR_NAME,SECRET_FILE_PATH, ...'
替换以下内容:
FUNCTION_NAME:函数的名称。
RUNTIME:运行函数的运行时。
ENV_VAR_NAME:环境变量的名称。
SECRET_FILE_PATH:密文的完整路径。例如
/mnt/secrets/primary/latest
,其中/mnt/secrets/primary/
是装载路径,latest
是密文路径。您也可以分别指定装载路径和密文路径:--set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'
指定的密文会从函数中移除。
查看函数的可访问密文
您可以使用 Google Cloud 控制台或 gcloud CLI 查看函数可以访问的 Secret:
控制台
前往 Google Cloud 控制台中的 Cloud Run 函数页面:
前往 Cloud Run 函数页面点击函数的名称以查看其可用密文。
点击修改。
点击运行时、构建和连接设置以展开高级配置选项。
点击安全以打开“安全”标签页。
安全标签页列出了函数可访问的 Secret。
gcloud
如需查看函数可用的密文t,请使用 gcloud functions describe
命令:
gcloud functions describe FUNCTION_NAME
将 FUNCTION_NAME 替换为您的函数的名称。
后续步骤
- 考虑使用 Secret Manager 客户端库开发使用 Secret Manager 的函数。