如何为非支持的数据库创建 AWS Secrets Manager 密钥轮换函数?

上次更新日期:2020 年 10 月 19 日

如何创建 AWS Lambda 函数以轮换其他数据库或第三方服务的 AWS Secrets Manager 密钥?

简短描述

使用 Amazon Relational Database Service (Amazon RDS) 支持的数据库和其他 AWS 支持服务创建的 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 命令返回 ApplicationIdChangeSetIdSemanticVersionStackId。要更新堆栈状态,必须向 change-set-name 提供 ChangeSetIdchange-set-name 不产生任何输出,并会将堆栈状态代码更改为 CREATE_COMPLETE。AWS CloudFormation 堆栈会创建 Lambda 函数和附加到具有所需权限的 Lambda 函数的 IAM 角色。

运行以下 AWS CLI 命令:

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 轮换函数没有互联网访问权限,则应使用 Secrets Manager 的私有服务终端节点配置 VPC。这样可让轮换函数在 VPC 内的某个终端节点访问 Secrets Manager。运行 create-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 步骤则需为您的使用案例和数据库手动实施。有关详细信息,请参阅 Lambda 轮换函数的步骤

启用密钥轮换

使用参数 --rotation-rulesAutomaticallyAfterDays 来指定轮换的间隔天数:

aws secretsmanager rotate-secret --secret-id production/MyAwesomeAppSecret --rotation-lambda-arn arn:aws:lambda:region:123456789012:function:MySecretsManagerRotationFunction --rotation-rules AutomaticallyAfterDays=7