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

上次更新时间:2021 年 6 月 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 Relational Database Service(Amazon RDS)实例。以下示例使用了一个名为 vpc-0abb11f5a28a8abe7 的 Amazon VPC 中的私有 Aurora RDS 实例。

重要提示:

为 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-vpc-endpoint"
}

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

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

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

注意:如果您的 RDS 实例仅使用默认安全组,则必须执行此步骤。

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

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

1.    获取 VPC 的 CIDR 范围:

$ aws ec2 describe-vpcs --vpc-ids vpc-0a05c93c7ef7a8a1c --query 'Vpcs[].CidrBlock' --output text
10.0.0.0/16

2.    配置 Amazon VPC 终端节点的安全组规则,以允许来自您的 VPC 的入站流量通过端口 443:

$ aws ec2 authorize-security-group-ingress --group-id sg-vpc-endpoint --protocol tcp --port 443 --cidr 10.0.0.0/16

3.    配置 RDS 实例安全组,以允许来自 Lambda 函数安全组的入站连接:

注意:

  • 请将 your-rds-security-group 替换为您的安全组(现有安全组或可选的 RDS 实例安全组)。
  • your-db-port 替换为数据库配置使用的端口。
$ aws ec2 authorize-security-group-ingress --group-id your-rds-security-group --protocol tcp --port your-db-port --source-group sg-lambda-function

将安全组附加到 AWS 资源

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

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

$ aws rds modify-db-instance --db-instance-identifier your-rds-instance --vpc-security-group-ids sg-rds-instance 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-lambda-function

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

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

注意:请将 your-region 替换为您的 AWS 区域,以及您的 RDS 实例使用的子网 ID。

$ 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-vpc-endpoint

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

验证 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 轮换函数在后台异步运行,并且可能需要数分钟时间才能完成。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?