我该如何在私有 VPC 中轮换 AWS Secrets Manager 密钥?

上次更新时间:2020 年 4 月 2 日

我尝试在 Amazon Virtual Private Cloud (Amazon VPC) 中为 AWS 服务轮换 AWS Secrets Manager 密钥。然而,操作失败,并且 Amazon CloudWatch Logs 显示 AWS Lambda 任务已超时。

简要描述

Secrets Manager 无法为在 Amazon VPC 私有子网中运行的 AWS 服务轮换密码,因为这些子网不具有访问互联网的权限。

解决方案

按照下述说明配置 Amazon VPC 接口终端节点,以访问您的 Secrets Manager Lambda 函数和私有 Amazon RDS 实例。以下示例使用了 Amazon VPC 中名为 vpc-0abb11f5a28a8abe7 的私有 Aurora RDS 实例。

重要提示:开始之前,请确保您已安装配置 AWS 命令行界面 (AWS CLI)。

为 Secrets Manager VPC 终端节点、Amazon RDS 实例和 Lambda 轮换函数创建安全组。

请按照关于使用 AWS CLI 创建安全组 的说明进行操作。您要采取的步骤与以下命令类似:

1.    适用于 Secrets Manager Amazon VPC 终端节点的安全组:

注意:使用您的 VPC ID 替换 vpc-id vpc-0abb11f5a28a8abe7

$ aws ec2 create-security-group --vpc-id vpc-0abb11f5a28a8abe7 --group-name SMVPCEndpointSG --description "secretsmanager VPCEndpoint SG"
{
    "GroupId": "sg-0bacf4bbed67e4df5"
}

2.    适用于 Lambda 轮换函数的安全组:  

$ aws ec2 create-security-group --vpc-id vpc-0abb11f5a28a8abe7 --group-name LambdaFunctionSG --description "Lambda Rotation Function SG"
{
    "GroupId": "sg-0aed64f81acc4c037"
}

3.    (可选)为 Amazon RDS 实例创建安全组:

注意:若您的 RDS 实例仅使用默认安全组,则此为必要步骤。 

$ aws ec2 create-security-group --vpc-id vpc-0abb11f5a28a8abe7 --group-name RDSInstanceSG --description "RDS Instance SG"
{
    "GroupId": "sg-0d06795dffa052563"
}

为 Secrets Manager 服务创建 Amazon VPC 接口终端节点,并将其与安全组关联

请按照关于 创建接口终端节点的说明进行操作,类似于以下内容:

注意:将您的区域 替换为您的 AWS 区域,并将子网 ID 替换为您的 RDS 实例。

$ 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

重要提示:您的 Amazon VPC 必须拥有已启用的 DNS 主机名和 DNS 解析属性。有关更多信息,请参阅 查看和更新您的 VPC 的 DNS 支持

为 Amazon VPC 终端节点和 Amazon RDS 实例安全组添加规则

1.    为 Amazon VPC 终端节点配置安全组规则,以便在端口 443 允许来自 Lambda 函数安全组的入站流量:

$ aws ec2 authorize-security-group-ingress --group-id sg-0bacf4bbed67e4df5 --protocol tcp --port 443 --source-group sg-0aed64f81acc4c037

2.    Amazon RDS 实例的安全组允许在端口 3306 与 Lambda 函数安全组建立入站连接:

注意:your-rds-security-group 替换为您的安全组(现有安全组或可选的 RDS 实例 SG)。

$ aws ec2 authorize-security-group-ingress --group-id your-rds-security-group --protocol tcp --port 3306 --source-group sg-0aed64f81acc4c037

将安全组附加到 AWS 资源

1.    如果您已创建可选的 RDS 实例 SG, 修改 RDS 实例 配置, 类似于以下内容:

注意: 您的现有 rds-security-groups 替换为附加到 RDS 实例的组。

$ aws rds modify-db-instance --db-instance-identifier your-rds-instance --vpc-security-group-ids sg-0d06795dffa052563 your-existing-rds-security-groups

2.    按照说明更新 Lambda 函数配置,类似于:

$ aws lambda update-function-configuration --function-name your-lambda-function \
--vpc-config SubnetIds=subnet-076c28105d486f3bd,subnet-0af00c796ccdc725f,SecurityGroupIds=sg-0aed64f81acc4c037

验证 Secrets Manager 能够轮换密钥

1.    按照关于轮换的 Secrets Manager 密钥的说明进行操作,类似于:

注意:your-secret 替换为您的 Secrets Manager 密钥。

$ aws secretsmanager rotate-secret --secret-id your-secret

Secrets Manager 将尝试重试之前的轮换。

注意:由于之前尝试轮换密码未成功,您将收到类似于以下内容的输出:

An error occurred (InvalidRequestException) when calling the RotateSecret operation: A previous rotation isn't complete. That rotation will be reattempted.

2.    监控 AWS Lambda 控制台中的函数。如果轮换成功,则 Amazon CloudWatch Logs 流将包含与下列类似的条目:

[INFO] 2019-10-22T07:59:32.627Z 96179023-5b67-4e98-a057-885f68bc69f2 finishSecret: Successfully set AWSCURRENT stage to version 175b5e38-341f-4cd0-8c58-2b1e49769642 for secret arn:aws:secretsmanager:your-region:your-account:secret:your-secret

3.    检索 Secrets Manager 密钥,以确认它已轮换成功,类似于:

注意:your-secret-arn 替换为您的 Secrets Manager 密钥 ARN。

aws secretsmanager get-secret-value --secret-id your-secret-arn

注意:Secrets Manager 轮换函数会在后台异步运行,并且可能需要数分钟时间才能完成。


这篇文章对您是否有帮助?

我们可以改进什么?


需要更多帮助?