配置 Secret
您可以使用 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 函数使用默认计算服务账号向 Secret Manager 进行身份验证。如果默认服务账号已具有 Editor 角色,我们建议您将 Editor 角色替换为权限较少的角色。
如需将 Secret Manager 与 Cloud Run 函数搭配使用,请向与您的函数关联的服务账号分配 roles/secretmanager.secretAccessor
角色:
转到 Google Cloud 控制台中的 Secret Manager 页面:
转到 Secret Manager 页面点击 Secret 旁边的复选框。
如果面板尚未打开,请点击显示信息面板以打开面板。
在信息面板中,点击添加主账号。
在新的主账号字段中,输入函数用于其身份的服务账号。函数的服务账号是以下之一:
在部署时分配给函数的用户管理的服务账号。如需了解如何使用用户管理的服务账号部署函数,请参阅为函数使用单独的服务账号。
在选择角色下拉列表中,选择 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 \ --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 \ --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 \ --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 \ --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 \ --runtime RUNTIME \ --clear-secrets
替换以下内容:
FUNCTION_NAME:函数的名称。
RUNTIME:运行函数的运行时。
所有密文都会从该函数中清除。
如需指定要移除的密文列表,请使用
--remove-secrets
标志。以下命令会移除一个装载为卷的密文,以及另一个公开为环境变量的密文。gcloud functions deploy FUNCTION_NAME \ --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 的函数。