轮换其他数据库或服务的 AWS Secrets Manager 密钥 - AWS Secrets Manager
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

轮换其他数据库或服务的 AWS Secrets Manager 密钥

如果您为支持的 Amazon RDS 数据库之一以外的其他应用程序创建密钥,则 AWS Secrets Manager 不会为您创建 Lambda 轮换函数。您必须创建并配置它,然后将已完成函数的 Amazon 资源名称 (ARN) 提供给密钥。要完成此操作,您可以使用 Secrets Manager 控制台、AWS CLI 或 AWS 开发工具包之一。

本主题介绍了使用您创建并运行的 AWS CloudFormation 更改集以创建 Lambda 函数。然后,您附加权限。此时,您可以编辑代码以使轮换函数按所需的方式工作。最后,您将完成的函数与您的密钥相关联,以便 Secrets Manager 在每次触发轮换时调用该函数。

您可以指定必须完全实施的“通用”模板。或者,您可以选择为特定数据库或服务完全实施轮换策略的模板之一,然后将其作为起点以自定义函数,从而满足您的需求。

最小权限

要运行启用和配置轮换的命令,您必须具有以下权限:

  • serverlessrepo:CreateCloudFormationChangeSet – 创建 AWS CloudFormation 更改集以配置和创建 Lambda 轮换函数。

  • cloudformation:ExecuteChangeSet – 运行 AWS CloudFormation 更改集以创建和配置 Lambda 轮换函数。

  • lambda:AddPermission – 在创建 Lambda 轮换函数后为其添加所需的权限。

  • lambda:InvokeFunction – 将轮换函数附加到密钥。

  • lambda:UpdateFunctionConfiguration – 允许控制台更新 Lambda 函数的 VPC 配置,以便它可以与位于 VPC 中的数据库或服务进行通信。

  • secretsmanager:RotateSecret – 配置和触发初始轮换。

您可以通过附加 SecretsManagerReadWrite AWS 托管策略,将所有这些权限授予 IAM 用户或角色。

以下命令将通用 SecretsManagerRotationTemplate 应用于 Lambda 函数。该模板来自于 AWS Serverless Application Repository,并由 AWS CloudFormation 使用以自动完成大多数步骤。有关您需要指定的完整模板和 ARN 集,请参阅可用于创建 Lambda 轮换函数的 AWS 模板

使用通用模板的 ARN,并完全按如下所示输入该 ARN:

arn:aws-cn:serverlessrepo:us-east-1:297356227824:applications/SecretsManagerRotationTemplate

如果使用您的凭证的数据库或服务位于 Amazon VPC 提供的 VPC 中,则必须在步骤 5 中包含该命令。该命令将函数配置为与该 VPC 进行通信。如果您没有 VPC,则可以跳过该命令。

将 Lambda 轮换函数创建为通用模板以进行自定义

  1. 第一个命令根据 Secrets Manager 提供的模板设置一个 AWS CloudFormation 更改集。您为模板提供两个参数:Secrets Manager 终端节点 URL 以及模板生成的 Lambda 轮换函数的名称。

    $ aws serverlessrepo create-cloud-formation-change-set \ --application-id arn:aws:serverlessrepo:us-east-1:297356227824:applications/SecretsManagerRotationTemplate \ --stack-name MyLambdaCreationStack \ --parameter-overrides '[{"Name":"endpoint","Value":"https://secretsmanager.region.amazonaws.com"},{"Name":"functionName","Value":"MySecretsManagerRotationFunction"}]' --capabilities CAPABILITY_IAM CAPABILITY_RESOURCE_POLICY { "ApplicationId": "arn:aws-cn:serverlessrepo:us-east-1:297356227824:applications/SecretsManagerRDSMySQLRotationSingleUser", "ChangeSetId": "arn:aws-cn:cloudformation:region:123456789012:changeSet/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE/EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE", "StackId": "arn:aws-cn:cloudformation:region:123456789012:stack/aws-serverless-repository-MyLambdaCreationStack/EXAMPLE3-90ab-cdef-fedc-ba987EXAMPLE" }
  2. 下一个命令运行刚创建的更改集。change-set-name 参数来自于上一个命令的 ChangeSetId 输出。该命令不会生成任何输出:

    $ aws cloudformation execute-change-set --change-set-name arn:aws-cn:cloudformation:region:123456789012:changeSet/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE/EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE
  3. 接下来,您必须查找上一个命令为您创建的 Lambda 函数的名称。

    $ aws lambda list-functions { ... "FunctionName": "MySecretsManagerRotationFunction", "FunctionArn": "arn:aws-cn:lambda:us-west-2:123456789012:function:MySecretsManagerRotationFunction", ... }
  4. 以下命令授予 Secrets Manager 权限以调用该函数。

    $ aws lambda add-permission \ --function-name MySecretsManagerRotationFunction \ --principal secretsmanager.amazonaws.com \ --action lambda:InvokeFunction \ --statement-id SecretsManagerAccess { "Statement": "{\"Sid\":\"SecretsManagerAccess\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"secretsmanager.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws-cn:lambda:us-west-2:123456789012:function:aws-serverless-repository-SecretsManagerRDSMySQLRo-10WGBDAXQ6ZEH\"}" }
  5. 如果您在 VPC 中运行数据库,则需要使用以下命令。如果您没有 VPC,请跳过该命令。该命令将 Lambda 轮换函数配置为在运行 Amazon RDS 数据库实例的 VPC 中运行。请使用 Amazon RDS 控制台或 aws rds describe-instances CLI 命令查找 Amazon RDS 数据库实例的 VPC 信息。然后,在以下命令中添加信息并执行该命令。

    $ aws lambda update-function-configuration \ --function-name arn:aws-cn:lambda:us-west-2:123456789012:function:MySecretsManagerRotationFunction \ --vpc-config SubnetIds=<COMMA SEPARATED LIST OF VPC SUBNET IDS>,SecurityGroupIds=<COMMA SEPARATED LIST OF SECURITY GROUP IDs> \
  6. 如果具有数据库实例和 Lambda 轮换函数的 VPC 无法访问 Internet,则必须为您的 VPC 配置 Secrets Manager 私有服务终端节点。这样,轮换函数可访问位于 VPC 内终端节点的 Secrets Manager。

    $ aws ec2 create-vpc-endpoint --vpc-id <VPC ID> \ --vpc-endpoint-type Interface \ --service-name com.amazonaws.<region>.secretsmanager \ --subnet-ids <COMMA SEPARATED LIST OF VPC SUBNET IDS> \ --security-group-ids <COMMA SEPARATED LIST OF SECURITY GROUP IDs> \ --private-dns-enabled
  7. 此时,您可以将代码输入到 Lambda 轮换函数中。

    通过以下网址打开 AWS Lambda 控制台:https://console.amazonaws.cn/lambda/

  8. 自定义代码以实施选定的轮换方案。有关详细信息,请参阅 了解和自定义您的 Lambda 轮换函数

  9. 最后,您可以将轮换配置应用于密钥并执行初始轮换。使用 --rotation-rules 参数指定连续轮换间隔的天数,并将 AutomaticallyAfterDays 设置为所需的天数。

    $ aws secretsmanager rotate-secret \ --secret-id production/MyAwesomeAppSecret \ --rotation-lambda-arn arn:aws-cn:lambda:us-west-2:123456789012:function:MySecretsManagerRotationFunction \ --rotation-rules AutomaticallyAfterDays=7

将立即轮换一次密钥,然后开始按指定的频率进行轮换。