排除 Amazon Secrets Manager 轮换故障 - Amazon Secrets Manager
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

排除 Amazon Secrets Manager 轮换故障

对于许多服务,Secrets Manager 使用 Lambda 函数来轮换密钥。有关更多信息,请参阅 通过 Lambda 函数进行旋转。Lambda 轮换函数与拥有密钥的数据库或服务以及 Secrets Manager 交互。当轮换无法按预期进行时,应先检查日 CloudWatch 志。

注意

某些服务可以为您管理密钥,包括管理自动轮换。有关更多信息,请参阅 Amazon Secrets Manager 密钥的托管轮换

查看 Lambda 函数的 CloudWatch 日志
  1. 打开 Secrets Manager 控制台,网址为https://console.aws.amazon.com/secretsmanager/

  2. 选择您的密钥,然后在详细信息页面上的 Rotation configuration(轮换配置)下,选择 Lambda 轮换函数。Lambda 控制台将打开。

  3. 在 “监控” 选项卡上,选择 “日志”,然后选择 “查看登录信息” CloudWatch。

    CloudWatch 控制台将打开并显示您的函数的日志。

“在环境变量中找到凭证”之后没有活动

如果“在环境变量中找到凭证”之后没有活动,并且任务持续时间很长,例如默认 Lambda 超时为 30000 毫秒,则 Lambda 函数可能会在尝试访问 Secrets Manager 端点时超时。

Lambda 轮换功能必须能够访问 Secrets Manager 端点。如果您的 Lambda 函数可以访问互联网,则可以使用公共终端节点。若要查找端点,请参阅 Amazon Secrets Manager 端点

如果您的 Lambda 函数在无法访问互联网的环境VPC中运行,我们建议您在中配置 Secrets Manager 服务的私有终端节点。VPC然后,VPC您可以拦截发往公共区域终端节点的请求并将其重定向到私有终端节点。有关更多信息,请参阅 VPC端点

或者,您可以通过向您的添加网关或互联网NAT网关,使您的 Lambda 函数能够访问 Secrets Manager 的公共终端节点VPC,从而允许来自您的流量VPC到达公有终端节点。这会VPC使您面临更大的风险,因为网关的 IP 地址可能会受到来自公共互联网的攻击。

“createSecret” 之后没有活动

以下是可能导致旋转之后停止的问题createSecret:

VPC网络ACLs不允许HTTPS流量进出。

有关更多信息,请参阅 Amazon VPC 用户指南ACLs中的使用网络控制子网流量

Lambda 函数超时配置过短,无法执行任务。

有关更多信息,请参阅《Amazon Lambda 开发人员指南》中的配置 Lambda 函数选项

Secrets Manager VPC 端点不允许进入分配的安全组。VPC CIDRs

有关更多信息,请参阅 Amazon VPC 用户指南中的使用安全组控制资源流量

Secrets Manager VPC 终端节点策略不允许 Lambda 使用该VPC终端节点。

有关更多信息,请参阅 使用 Amazon Secrets Manager VPC终端节点

该密钥使用用户交替轮换,超级用户密钥由 Amazon 管理RDS,而 Lambda 函数无法访问。RDS API

对于由其他 Amazon 服务管理超级用户密钥的交替用户轮换,Lambda 轮换函数必须能够调用服务端点来获取数据库连接信息。我们建议您为数据库服务配置VPC终端节点。有关更多信息,请参阅:

错误:“KMS不允许访问”

如果您看到ClientError: An error occurred (AccessDeniedException) when calling the GetSecretValue operation: Access to KMS is not allowed,则轮换功能无权使用用于加密密钥的密KMS钥来解密密钥。权限策略中可能存在将加密上下文限定为特定密钥的条件。有关所需权限的信息,请参阅 适用于客户托管密钥的策略语句

错误:“密钥从密钥中丢失JSON”

Lambda 轮换函数要求密钥值位于特定JSON结构中。如果您看到此错误,则JSON可能缺少轮换功能尝试访问的密钥。有关每种密钥类型JSON结构的信息,请参见JSON的结构 Amazon Secrets Manager 密钥

错误:“setSecret:无法登录数据库”

以下问题可能导致此错误:

轮换函数无法访问数据库。

如果任务持续时间过长,例如超过 5000 毫秒,则 Lambda 轮换函数可能无法通过网络访问数据库。

如果您的数据库或服务在中的某个 Amazon EC2 实例上运行VPC,我们建议您将您的 Lambda 函数配置为在同一个实例中运行。VPC然后轮换功能可以直接与您的服务通信。有关更多信息,请参阅配置VPC访问权限

要允许 Lambda 函数访问数据库或服务,您必须确保附加到 Lambda 轮换函数的安全组允许与数据库或服务的出站连接。您还必须确保附加到数据库或服务的安全组允许来自 Lambda 轮换函数进行入站连接。

密钥中的凭证有误。

如果任务持续时间过短,则 Lambda 轮换函数可能无法使用密钥中的凭证进行身份验证。使用 Amazon CLI 命令使用密钥AWSCURRENTAWSPREVIOUS版本中的信息手动登录,检查凭据get-secret-value

数据库使用 scram-sha-256 加密密码。

如果您的数据库是 Aurora Postgre SQL 版本 13 或更高libpq版本,用于加密密码,但轮换功能使用不支持的版本 9 或更早版本scram-sha-256,则轮换功能无法连接到数据库。scram-sha-256

确定哪些数据库用户使用 scram-sha-256 加密
确定您的轮换函数使用哪个 libpq 版本
  1. 在基于 Linux 的计算机上,在 Lambda 控制台上导航到您的轮换函数并下载部署包。将 zip 文件解压缩到工作目录中。

  2. 在命令行上,在工作目录中运行:

    readelf -a libpq.so.5 | grep RUNPATH

  3. 如果你看到字符串 Postgre -9.4.x SQL,或者任何小于 10 的主要版本,则不支持轮换功能scram-sha-256

    • 不支持 scram-sha-256 的轮换函数的输出:

      0x000000000000001d (RUNPATH) Library runpath: [/local/p4clients/pkgbuild-a1b2c/workspace/build/PostgreSQL/PostgreSQL-9.4.x_client_only.123456.0/AL2_x86_64/DEV.STD.PTHREAD/build/private/tmp/brazil-path/build.libfarm/lib:/local/p4clients/pkgbuild-a1b2c/workspace/src/PostgreSQL/build/private/install/lib]

    • 支持 scram-sha-256 的轮换函数的输出:

      0x000000000000001d (RUNPATH) Library runpath: [/local/p4clients/pkgbuild-a1b2c/workspace/build/PostgreSQL/PostgreSQL-10.x_client_only.123456.0/AL2_x86_64/DEV.STD.PTHREAD/build/private/tmp/brazil-path/build.libfarm/lib:/local/p4clients/pkgbuild-a1b2c/workspace/src/PostgreSQL/build/private/install/lib]

注意

如果您在 2021 年 12 月 30 日之前设置了自动密钥轮换,则轮换函数捆绑了不支持 scram-sha-256 的旧版本 libpq。为了支持 scram-sha-256,您需要重新创建您的轮换函数

数据库需要SSL/TLS访问权限。

如果您的数据库需要SSL/TLS连接,但轮换函数使用未加密的连接,则轮换函数无法连接到数据库。亚马逊RDS(Oracle 和 Db2 除外)和 Amazon DocumentDB 的轮换函数会自动使用安全套接字层 SSL TLS () 或传输层安全 () 连接到您的数据库(如果有)。否则,他们将使用未加密的连接。

注意

如果您在 2021 年 12 月 20 日之前设置了自动密钥轮换,则轮换功能可能基于不支持的旧模板SSL/TLS. To support connections that use SSL/TLS,则需要重新创建轮换函数

确定您的轮换函数的创建时间
  1. 在 Secrets Manager 控制台中 https://console.aws.amazon.com/secretsmanager/,打开你的密钥。例如,在旋转配置部分的 Lambda 旋转函数下,您可以看到 Lam bda 函数ARNarn:aws:lambda:aws-region:123456789012:function:SecretsManagerMyRotationFunction 在本示例中ARN,从末尾复制函数名称 SecretsManagerMyRotationFunction

  2. 在 Amazon Lambda 控制台的 “函数” 下 https://console.aws.amazon.com/lambda/,将您的 Lambda 函数名称粘贴到搜索框中,选择 “输入”,然后选择 Lambda 函数。

  3. 在函数详细信息页面中,在 Configuration(配置)选项卡上的 Tags(标签)下,复制键 aws:cloudformation:stack-name 旁边的值。

  4. 在 Amazon CloudFormation 控制台 https://console.aws.amazon.com/cloudformationStacks 下,将密钥值粘贴到搜索框中,然后选择 Enter。

  5. 堆栈列表将进行筛选,以便只显示创建 Lambda 轮换函数的堆栈。在 Created date(创建日期)列中,查看堆栈的创建日期。这是 Lambda 轮换函数的创建日期。

错误:“无法导入模块‘lambda_function’”

如果您运行的是早期版本的 Lambda 函数,且该函数是从 Python 3.7 自动升级到更新版本的 Python 的,则可能会遇到此错误。要解决此错误,您可以将 Lambda 函数版本改回 Python 3.7,然后 将现有的轮换函数版本从 Python 3.7 升级到 Python 3.9。要了解更多信息,请参阅 Amazon re:Post 中的 为什么我的 Secrets Manager Lambda 函数轮换失败并出现“找不到 pg 模块”错误?

将现有的轮换函数版本从 Python 3.7 升级到 Python 3.9

2022 年 11 月之前创建的部分轮换函数使用 Python 3.7。f Amazon SDK or Python 在 2023 年 12 月停止支持 Python 3.7。有关更多信息,请参阅 Python 支持政策更新 Amazon SDKs和工具。要切换到使用 Python 3.9 的新轮换函数,可以在现有轮换函数中添加运行时系统属性或重新创建轮换函数。

查找使用 Python 3.7 的 Lambda 轮换函数
  1. 登录 Amazon Web Services Management Console 并打开 Amazon Lambda 控制台,网址为https://console.aws.amazon.com/lambda/

  2. 函数列表中,筛选 SecretsManager

  3. 在筛选后的函数列表中,在运行时系统下,查找 Python 3.7。

选项 1:使用重新创建旋转函数 Amazon CloudFormation

当您使用 Secrets Manager 控制台开启轮换功能时,Secrets Manager 会使用 Amazon CloudFormation 创建必要的资源,包括 Lambda 轮换函数。如果您使用控制台开启轮换,或者使用 Amazon CloudFormation 堆栈创建了旋转功能,则可以使用相同的 Amazon CloudFormation 堆栈重新创建具有新名称的旋转函数。新函数将使用最新版本的 Python。

查找创建旋转函数的 Amazon CloudFormation 堆栈
  • 在 Lambda 函数的详细信息页面的配置选项卡上,选择标签。查看 aws: cloudformation: stack-id ARN 旁边的。

    堆栈名称嵌入在中ARN,如以下示例所示。

    • ARN: arn:aws:cloudformation:us-west-2:408736277230:stack/SecretsManagerRDSMySQLRotationSingleUser5c2-SecretRotationScheduleHostedRotationLambda-3CUDHZMDMBO8/79fc9050-2eef-11ed-80f0-021fb13c0537

    • 堆栈名称:SecretsManagerRDSMySQLRotationSingleUser5c2-SecretRotationScheduleHostedRotationLambda

重新创建轮换函数(Amazon CloudFormation)
  1. 在中 Amazon CloudFormation,按名称搜索堆栈,然后选择更新

    如果出现建议您更新根堆栈的对话框,请选择转到根堆栈,然后选择更新

  2. 在 “更新堆栈” 页面上的 “准备模板” 下,选择 “在应用程序编辑器中编辑”,然后在 “应用程序编辑器” 的 “编辑模板” 下,选择 “在应用程序编排器中编辑” 按钮。

  3. 在应用程序编辑器中,执行以下操作:

    1. 在模板代码中SecretRotationScheduleHostedRotationLambda,将的值替换为"functionName": "SecretsManagerTestRotationRDS"新的函数名称,例如在JSON,"functionName": "SecretsManagerTestRotationRDSupdated"

    2. 选择 “更新模板”。

    3. 在 “继续到 Amazon CloudFormation” 对话框中,选择 “确认” 并继续 Amazon CloudFormation

  4. 继续完成 Amazon CloudFormation 堆栈工作流程,然后选择提交

选项 2:使用更新现有旋转函数的运行时间 Amazon CloudFormation

当您使用 Secrets Manager 控制台开启轮换功能时,Secrets Manager 会使用 Amazon CloudFormation 创建必要的资源,包括 Lambda 轮换函数。如果您使用控制台开启轮换,或者使用 Amazon CloudFormation 堆栈创建了旋转函数,则可以使用相同的 Amazon CloudFormation 堆栈来更新旋转功能的运行时间。

查找创建旋转函数的 Amazon CloudFormation 堆栈
  • 在 Lambda 函数的详细信息页面的配置选项卡上,选择标签。查看 aws: cloudformation: stack-id ARN 旁边的。

    堆栈名称嵌入在中ARN,如以下示例所示。

    • ARN: arn:aws:cloudformation:us-west-2:408736277230:stack/SecretsManagerRDSMySQLRotationSingleUser5c2-SecretRotationScheduleHostedRotationLambda-3CUDHZMDMBO8/79fc9050-2eef-11ed-80f0-021fb13c0537

    • 堆栈名称:SecretsManagerRDSMySQLRotationSingleUser5c2-SecretRotationScheduleHostedRotationLambda

更新轮换函数的运行时系统(Amazon CloudFormation)
  1. 在中 Amazon CloudFormation,按名称搜索堆栈,然后选择更新

    如果出现建议您更新根堆栈的对话框,请选择转到根堆栈,然后选择更新

  2. 在 “更新堆栈” 页面上的 “准备模板” 下,选择 “在应用程序编辑器中编辑”,然后在 “应用程序编辑器” 的 “编辑模板” 下,选择 “在应用程序编排器中编辑” 按钮。

  3. 在应用程序编辑器中,执行以下操作:

    1. 在模板中JSON,对于、下方SecretRotationScheduleHostedRotationLambdaProperties、下方Parameters,添加"runtime": "python3.9"

    2. 选择 “更新模板”。

    3. 在 “继续到 Amazon CloudFormation” 对话框中,选择 “确认” 并继续 Amazon CloudFormation

  4. 继续完成 Amazon CloudFormation 堆栈工作流程,然后选择提交

选项 3:对于 Amazon CDK 用户,升级CDK库

如果您使用 v2.94.0 Amazon CDK 之前的版本为密钥设置轮换,则可以通过升级到 v2.94.0 或更高版本来更新 Lambda 函数。有关更多信息,请参见 Amazon Cloud Development Kit (Amazon CDK) v2 开发人员指南