配置 Secret

您可以使用 Secret Manager 安全地存储 API 密钥、密码和其他敏感信息。本指南介绍如何配置 Cloud Functions 以访问存储在 Secret Manager 中的密文。

本文档介绍向函数提供密文的两种方法:

  • 将密文装载为卷。这会将密文作为文件提供给函数。如果您将密文作为卷引用,则每次从磁盘读取该文件时,函数都会从 Secret Manager 访问密文值。如果您希望引用最新版本的密文而不是固定版本的密文,则将其装载为卷是一个很好的策略。如果您计划实现密文轮替,则此方法也非常适用。

  • 将密文作为环境变量传递。环境变量值会在实例启动时进行解析,因此如果您使用此方法,我们建议您引用固定版本的密文,而不是引用最新版本的密文。

如需详细了解如何使用 Secret Manager,请参阅 Secret Manager 概览。 如需了解如何创建和访问 Secret,请参阅创建 Secret

准备工作

  1. 启用 Secret Manager API。

    启用 API

  2. 按照创建 Secret 中的说明在 Secret Manager 中创建 Secret(如果您尚未创建)。

授予对密文的访问权限

您的函数可以访问与该函数位于同一项目的密文,也可以访问位于另一个项目中的密文。要访问 Secret,函数的运行时服务账号必须被授予 Secret 的访问权限。

默认情况下,Cloud Functions 使用 App Engine 默认服务账号向 Secret Manager 进行身份验证。对于生产用途,Google 建议您将函数配置为使用用户管理的服务账号进行身份验证,该服务账号分配有包含完成该函数的任务所需的最小权限的一组角色。

如需将 Secret Manager 与 Cloud Functions 搭配使用,请向与您的函数关联的服务账号分配 roles/secretmanager.secretAccessor 角色:

  1. 转到 Google Cloud 控制台中的 Secret Manager 页面:
    转到 Secret Manager 页面

  2. 点击 Secret 旁边的复选框。

  3. 如果面板尚未打开,请点击显示信息面板以打开面板。

  4. 在信息面板中,点击添加主账号

  5. 新的主账号字段中,输入函数用于其身份的服务账号。函数的服务账号是以下之一:

  6. 选择角色下拉列表中,选择 Secret Manager,然后选择 Secret Manager Secret Accessor

准备函数以访问 Secret

您可以通过以下两种方式向函数提供 Secret:

  • 将 Secret 作为环境变量传递。
  • 将 Secret 装载为卷。

环境变量

如需使用环境变量将 Secret 提供给函数,请执行以下操作:

  1. 在函数部署期间设置运行时环境变量
  2. 使 Secret 在环境变量可供函数访问
  3. 在运行时以编程方式访问环境变量。

将 Secret 装载为卷

如需将 Secret 装载为卷,请执行以下操作:

  1. 创建一个包含 Secret 的文件。

  2. 选择未使用的非系统目录(例如 /mnt/secrets)作为 Secret 的装载路径。装载 Secret 后,该目录中除 Secret 及其版本以外的所有现有文件或子目录都将无法访问。

  3. 使 Secret 作为已装载的卷可供函数访问

  4. 在运行时,以编程方式读取文件内容以访问 Secret 值。

例如,如果 Secret 已装载到 /mnt/secrets/secret1,则函数必须读取此文件。以下示例展示了如何使用 Node.js 同步读取此文件:

fs.readFileSync('/mnt/secrets/secret1')

使密文可被函数访问

要从函数引用密文,您必须先使密文可被函数访问。您可以使用 Google Cloud Console 或 Google Cloud CLI 使密文可被新函数或现有函数访问:

控制台

要使密文可被函数访问,请执行以下操作:

  1. 转到 Google Cloud Console 中的 Cloud Functions 页面:
    转到 Cloud Functions 页面

  2. 点击要访问密文的函数的名称。

  3. 点击修改

  4. 点击运行时、构建...以展开高级配置选项。

  5. 点击安全和映像代码库以打开该标签页。

  6. 点击添加 Secret 引用,以为函数设置 Secret。

  7. 选择要使其可被访问的密文。如果需要,请创建 Secret

    • 如需引用与函数位于同一项目中的密文,请执行以下操作:

      1. 从下拉列表中选择 Secret。
    • 如需引用另一个项目中的密文,请执行以下操作:

      1. 验证您项目的服务账号已被授予密文的访问权限

      2. 选择手动输入 Secret

      3. 按以下格式输入密文的资源 ID:

        projects/PROJECT_ID/secrets/SECRET_NAME

        替换以下内容:

        • PROJECT_ID:密文所在项目的 ID。

        • SECRET_NAME:Secret Manager 中的密文名称。

  8. 选择密文的引用方法。您可以将密文作为卷装载,也可以将密文作为环境变量公开。

    • 如需将密文装载为卷,请执行以下操作:

      1. 选择装载为卷

      2. 装载路径字段中,输入此 Secret 的装载路径。这是所有 Secret 版本所在的目录。

      3. 路径 1 字段中,输入要装载的文件的名称。此名称会与上一步中的装载路径串联,以形成装载 Secret 的完整装载路径。

      4. 版本 1 下拉列表中,选择要引用的 Secret 版本。

      5. 如需装载此 Secret 的其他版本,您可以点击 +添加来指定其他路径以及要在其中装载的 Secret 版本。

    • 如需将密文公开为环境变量,请执行以下操作:

      1. 选择公开为环境变量

      2. 名称 1 字段中,输入环境变量的名称。

      3. 版本 1 下拉列表中,选择要引用的 Secret 版本。

      4. 如需将此 Secret 的其他版本公开给函数,您可以点击 +添加来定义其他环境变量以及要在其中存储的 Secret 版本。

  9. 点击完成

  10. 点击下一步

  11. 点击部署

函数的代码现在可以引用密文。

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:要使用的密文的版本。例如 1latest

    --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:要使用的密文的版本。例如 1latest

    --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:要使用的密文的版本。例如 1latest

  • 您可以一次更新多个 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:要使用的密文的版本。例如 1latest

    • SECRET_FILE_PATH:密文的完整路径。例如 /mnt/secrets/primary/latest,其中 /mnt/secrets/primary/ 是装载路径,latest 是密文路径。您也可以分别指定装载路径和密文路径:

      --set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'

从函数中移除密文

您可以使用 Google Cloud 控制台或 gcloud CLI 从函数中移除密文:

控制台

  1. 转到 Google Cloud 控制台中的 Cloud Functions 页面:
    转到 Cloud Functions 页面

  2. 点击要移除某个 Secret 的函数的名称。

  3. 点击修改

  4. 点击运行时、构建和连接设置以展开高级配置选项。

  5. 点击安全和映像代码库以打开“安全”标签页。

  6. 将鼠标指针悬停在要移除的 Secret 上,然后点击 删除

  7. 点击下一步

  8. 点击部署

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:

控制台

  1. 转到 Google Cloud Console 中的 Cloud Functions 页面:
    转到 Cloud Functions 页面

  2. 点击函数的名称以查看其可用密文。

  3. 点击修改

  4. 点击运行时、构建和连接设置以展开高级配置选项。

  5. 点击安全以打开“安全”标签页。

安全标签页列出了函数可访问的 Secret。

gcloud

如需查看函数可用的密文t,请使用 gcloud functions describe 命令:

gcloud functions describe FUNCTION_NAME

FUNCTION_NAME 替换为您的函数的名称。

后续步骤