本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
旋转 AWS Secrets Manager 其他数据库或服务的秘密
如果您为支持的 Amazon RDS 数据库之一以外的其他应用程序创建密钥,则 AWS Secrets Manager 不会为您创建 Lambda 轮换函数。您必须创建并配置它,然后将已完成函数的 Amazon 资源名称 (ARN) 提供给密钥。您通过使用 Secrets Manager 控制台, AWS CLI,或 AWS SDKs.
本主题介绍了使用您创建并运行的 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
– 配置和触发初始轮换。
您可以将所有这些权限授予 IAM 用户或角色 SecretsManagerReadWrite
以下命令将通用 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 轮换函数创建为通用模板以进行自定义
-
第一个命令根据 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
\ --parameter-overrides '[{"Name":"endpoint","Value":"https://secretsmanager.MyLambdaCreationStack
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" } -
下一个命令运行刚创建的更改集。
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 -
接下来,您必须查找上一个命令为您创建的 Lambda 函数的名称。
$
aws lambda list-functions
{ ... "FunctionName": "MySecretsManagerRotationFunction", "FunctionArn": "arn:aws-cn:lambda:us-west-2:123456789012:function:MySecretsManagerRotationFunction", ... }
-
以下命令授予 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\"}" }
-
如果您在 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>
-
如果具有数据库实例和 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 -
此时,您可以将代码输入到 Lambda 轮换函数中。
通过以下网址打开 AWS Lambda 控制台:https://console.amazonaws.cn/lambda/
。 -
自定义代码以实施选定的轮换方案。有关详细信息,请参阅 了解并自定义您的 Lambda 旋转功能。
-
最后,您可以将轮换配置应用于密钥并执行初始轮换。使用
--rotation-rules
参数指定连续轮换间隔的天数,并将AutomaticallyAfterDays
设置为所需的天数。$
aws secretsmanager rotate-secret \ --secret-id
production/MyAwesomeAppSecret
\ --rotation-lambda-arnarn:aws-cn:lambda:us-west-2:123456789012:function:MySecretsManagerRotationFunction
\ --rotation-rules AutomaticallyAfterDays=7
将立即轮换一次密钥,然后开始按指定的频率进行轮换。