在 AWS Lambda 函数中使用 AWS Secrets Manager 密钥 - AWS Secrets Manager

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 AWS Lambda 函数中使用 AWS Secrets Manager 密钥

您可以使用 AWS 参数和密钥 Lambda 扩展程序来检索和缓存 Lambda 函数中的 AWS Secrets Manager 密钥,而无需使用开发工具包。检索已缓存密钥比从 Secrets Manager 中检索密钥的速度要快。由于调用 Secrets Manager API 会产生费用,因此使用缓存可以降低成本。该扩展可以检索 Secrets Manager 密钥和 Parameter Store 参数。有关 Parameter Store 的信息,请参阅《AWS Systems Manager 用户指南》中的 Parameter Store integration with Lambda extensions(Parameter Store 与 Lambda 扩展集成)。

Lambda 扩展是配套进程,其增加了 Lambda 函数的功能。有关更多信息,请参阅《Lambda 开发人员指南》中的 Lambda extensions(Lambda 扩展)。有关在容器镜像中使用扩展的信息,请参阅在容器镜像中使用 Lambda 层和扩展。Lambda 使用 Amazon CloudWatch Logs 记录有关扩展的执行信息以及函数。默认情况下,扩展将最少量的信息记录到 CloudWatch。若要记录更多详细信息,请将环境变量 PARAMETERS_SECRETS_EXTENSION_LOG_LEVEL 设置为 debug

为提供用于参数和密钥的内存缓存,该扩展向 Lambda 环境公开了本地 HTTP 端点,即 localhost 端口 2773。您可以通过设置环境变量 PARAMETERS_SECRETS_EXTENSION_HTTP_PORT 来配置端口。

Lambda 会实例化与函数所需的并发级别相对应的单独实例。每个实例都是独立的,并维护自己的配置数据本地缓存。有关 Lambda 实例和并发的更多信息,请参阅《Lambda 开发人员指南》中的 Managing concurrency for a Lambda function(管理 Lambda 函数并发)。

若要为 ARM 添加扩展,您必须使用 Lambda 函数的 arm64 架构。有关更多信息,请参阅《Lambda 开发人员指南》中的 Lambda instruction set architectures(Lambda 指令集架构)。扩展支持 ARM 在以下区域可用:亚太地区(孟买)、美国东部(俄亥俄州)、欧洲地区(爱尔兰)、欧洲地区(法兰克福)、欧洲(苏黎世)、美国东部(弗吉尼亚州北部)、欧洲地区(伦敦)、欧洲(西班牙)、亚太地区(东京)、美国西部(俄勒冈州)、亚太地区(新加坡)、亚太地区(海得拉巴)和亚太地区(悉尼)。

该扩展使用 AWS 客户端。有关配置 AWS 客户端的信息,请参阅《AWS SDK 和工具参考指南》中的 Settings reference。如果 Lambda 函数在 VPC 中运行,您需要创建一个 VPC 端点才能调用 Secrets Manager。有关更多信息,请参阅 使用 AWS Secrets Manager VPC 终端节点

所需权限:

  • Lambda 执行角色必须对密钥具有 secretsmanager:GetSecretValue 权限。

  • 如果密钥使用客户自主管理型密钥而不是 AWS 托管式密钥 aws/secretsmanager 进行加密,则执行角色还需要 KMS 密钥的 kms:Decrypt 权限。

若要使用 AWS 参数和密钥 Lambda 扩展
  1. 将名为 AWS Parameters and Secrets Lambda ExtensionAWS 层添加到您的函数。有关说明,请参阅《Lambda 开发人员》指南中的向函数添加层。如果使用 AWS CLI 来添加层,则需要扩展的 ARN。有关 ARN 的列表,请参阅《AWS Systems Manager 用户指南》中的 AWS 参数和秘密 Lambda 扩展 ARN

  2. 授予 Lambda 执行角色访问密钥的权限:

  3. 使用 Lambda 环境变量配置缓存。

  4. 若要从扩展缓存中检索密钥,您首先需要将 X-AWS-Parameters-Secrets-Token 添加到请求标头中。将令牌设置为 AWS_SESSION_TOKEN,Lambda 为所有正在运行的函数提供此令牌。使用此标头表示调用方在 Lambda 环境中。

    下列 Python 示例说明如何添加标头。

    import os headers = {"X-Aws-Parameters-Secrets-Token": os.environ.get('AWS_SESSION_TOKEN')}
  5. 若要在 Lambda 函数中检索密钥,请使用下列 HTTP GET 请求之一:

    • 要检索密钥,对于 secretId,请指定密钥的 ARN 或名称。

      GET: /secretsmanager/get?secretId=secretId
    • 要通过暂存标签检索先前的密钥值或特定版本,对于 secretId,请使用密钥的 ARN 或名称,对于 versionStage,请使用暂存标签。

      GET: /secretsmanager/get?secretId=secretId&versionStage=AWSPREVIOUS
    • 要通过 ID 检索特定密钥版本,对于 secretId,请使用密钥的 ARN 或名称,对于 versionId,请使用版本 ID。

      GET: /secretsmanager/get?secretId=secretId&versionId=versionId
    例 检索密钥 (Python)

    下列 Python 示例说明如何使用 json.loads 检索密钥并解析结果。

    secrets_extension_endpoint = "http://localhost:" + \ secrets_extension_http_port + \ "/secretsmanager/get?secretId=" + \ <secret_name> r = requests.get(secrets_extension_endpoint, headers=headers) secret = json.loads(r.text)["SecretString"] # load the Secrets Manager response into a Python dictionary, access the secret

AWS 参数和密钥 Lambda 扩展环境变量

您可以使用下列环境变量配置扩展。

有关如何使用环境变量的更多信息,请参阅《Lambda 开发者指南》中的 Using Lambda environment variables(使用 Lambda 环境变量)。

PARAMETERS_SECRETS_EXTENSION_CACHE_ENABLED

设置为 true,以缓存参数和密钥。设置为 false,以不进行缓存。默认设置为 true。

PARAMETERS_SECRETS_EXTENSION_CACHE_SIZE

要缓存的密钥和参数的最大数量。值必须介于 0 到 1000 之间。值 0 表示无缓存。如果 SSM_PARAMETER_STORE_TTLSECRETS_MANAGER_TTL 均为 0,则将忽略此变量。默认为 1000。

PARAMETERS_SECRETS_EXTENSION_HTTP_PORT

本地 HTTP 服务器的端口。默认为 2773。

PARAMETERS_SECRETS_EXTENSION_LOG_LEVEL

扩展的日志记录级别为:debuginfowarnerrornone。设置为 debug 以查看缓存配置。默认值为 info

PARAMETERS_SECRETS_EXTENSION_MAX_CONNECTIONS

扩展用于向 Parameter Store 或 Secrets Manager 发出请求的 HTTP 客户端的最大连接数。这是各个客户端的配置。默认为 3。

SECRETS_MANAGER_TIMEOUT_MILLIS

对 Secrets Manager 的请求超时(以毫秒为单位)。值 0 表示没有超时。默认值为 0。

SECRETS_MANAGER_TTL

缓存中密钥的 TTL(以秒为单位)。值 0 表示无缓存。最大值为 300 秒。如果 PARAMETERS_SECRETS_EXTENSION_CACHE_SIZE 为 0,则将忽略此变量。默认为 300 秒。

SSM_PARAMETER_STORE_TIMEOUT_MILLIS

对 Parameter Store 的请求超时(以毫秒为单位)。值 0 表示没有超时。默认值为 0。

SSM_PARAMETER_STORE_TTL

缓存中参数的 TTL(以秒为单位)。值 0 表示无缓存。最大值为 300 秒。如果 PARAMETERS_SECRETS_EXTENSION_CACHE_SIZE 为 0,则将忽略此变量。默认为 300 秒。