如何创建 AWS Lambda 函数以轮换其他数据库或第三方服务的 AWS Secrets Manager 密钥?
简短描述
使用 Amazon Relational Database Service(Amazon RDS)支持的数据库和其他 AWS support 服务创建的 Secrets Manager 密钥会自动创建 Lambda 轮换。对于不受支持的 AWS 数据库和服务,您可以手动创建 Lambda 函数。
解决方法
使用通用轮换函数模板来轮换密钥。在为其他数据库或服务开启密钥轮换之前,您必须创建 Lambda 轮换函数的代码。
重要提示:
利用通用轮换函数模板创建 AWS CloudFormation 更改集
为下列值运行 AWS CLI 命令 create-cloud-formation-change-set:
--stack-name:您创建了更改集的 AWS CloudFormation 堆栈名称。
--parameter-override:您的区域的 AWS Secrets Manager 区域终端节点以及该模板创建的 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
注意:请务必使用与所显示完全一致的 Amazon 资源名称 (ARN),即 arn:aws:serverlessrepo:us-east-1:297356227824:applications/SecretsManagerRotationTemplate。
将为该模板创建一个 AWS CloudFormation 更改集。AWS CloudFormation 堆栈名称以 aws-serverless-repository- 开头,堆栈状态代码设置为 REVIEW_IN_PROGRESS。
使用变更集更新堆栈
create-cloud-formation-change-set 命令返回 ApplicationId、ChangeSetId、SemanticVersion 和 StackId。要更新堆栈状态,必须向 change-set-name 提供 ChangeSetId。change-set-name 不产生任何输出,并会将堆栈状态代码更改为 CREATE_COMPLETE。AWS CloudFormation 堆栈会创建 Lambda 函数和附加到具有所需权限的 Lambda 函数的 IAM 角色。
运行以下 AWS CLI 命令 execute-change-set,如下所示:
aws cloudformation execute-change-set --change-set-name arn:aws:cloudformation:region:123456789012:changeSet/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE/EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE
验证您的 Lambda 函数已成功创建
运行以下 AWS CLI 命令:
aws lambda list-functions
Output
{
...
"FunctionName": "MySecretsManagerRotationFunction",
...
"FunctionArn": "arn:aws:lambda:region:123456789012:function:MySecretsManagerRotationFunction",
...
}
注意:Lambda 函数的名称为 --parameter-overrides 中列明的函数名称值。
配置 Lambda 函数的 Amazon Virtual Private Cloud(Amazon VPC)访问权限
如果您的数据库或服务位于 Amazon VPC 中,则运行 update-function-configuration 命令,具体与以下类似。update-function-configuration 命令会配置将在 VPC 中运行的 Lambda 轮换函数。必须提供 VPC 子网 ID 和安全组 ID。有关更多信息,请参阅配置 Lambda 函数以访问 Amazon VPC 中的资源。
注意:如果您的数据库或服务不在 Amazon VPC 中,则跳过此步骤。
$ aws lambda update-function-configuration --function-name your-lambda-function \
--vpc-config SubnetIds=subnet-076c28105d486f3bd,subnet-0af00c796ccdc725f,SecurityGroupIds=sg-0aed64f81acc4c037
为 Secrets Manager 服务创建 VPC 端点
如果放置您的数据库或服务的 VPC 以及 Lambda 轮换函数没有互联网访问权限,请创建 VPC 端点。使用私有服务端点配置 VPC 以访问 Secrets Manager, 并在 VPC 内的端点上开启轮换函数。运行 create-vpc-endpoint 命令,具体与以下类似:
注意:如果您的数据库或服务不在 Amazon VPC 中,则跳过此步骤。
$ aws ec2 create-vpc-endpoint --vpc-id vpc-0abb11f5a28a8abe7 --vpc-endpoint-type Interface \
--service-name com.amazonaws.your-region.secretsmanager --subnet-ids subnet-076c28105d486f3bd subnet-0af00c796ccdc725f \
--security-group-ids sg-0bacf4bbed67e4df5
设置 Lambda 函数与数据库或服务之间的网络连接
确保 Lambda 函数可以通过所需的网络端口路由到您的数据库或服务。这取决于数据库或服务及其关联的 VPC 配置。
注意:如果您的数据库或服务并非位于 Amazon VPC 中,请跳过此步骤。
为您的使用案例自定义轮换函数
轮换模板为您实施 createSecret 和 finishSecret 步骤。setSecret 和 testSecret 步骤则需为您的使用案例和数据库手动实施。有关更多信息,请参阅轮换的工作原理。
开启密钥轮换
使用参数 --rotation-rules 和 AutomaticallyAfterDays 来指定轮换的间隔天数:
aws secretsmanager rotate-secret --secret-id production/MyAwesomeAppSecret --rotation-lambda-arn arn:aws:lambda:region:123456789012:function:MySecretsManagerRotationFunction --rotation-rules AutomaticallyAfterDays=7
有关更多信息,请参阅轮换 AWS Secrets Manager 密钥。
相关信息
AWS Secrets Manager 轮换函数模板
如何连接到 Virtual Private Cloud 中的 AWS Secrets Manager 服务