18

我创建了一个秘密并将其更新为具有 lambda 旋转功能

我的秘密看起来像

aws secretsmanager list-secret-version-ids --secret-id envir/username
{
    "Versions": [
        {
            "VersionId": "90179cd3-daa1-48e4-9fe5-dde0a4cf22e4",
            "VersionStages": [
                "AWSPREVIOUS"
            ],
            "LastAccessedDate": 1524528000.0,
            "CreatedDate": 1524568488.358
        },
        {
            "VersionId": "60576823-5d98-4360-af53-7e1f909b88d0",
            "VersionStages": [
                "AWSCURRENT"
            ],
            "LastAccessedDate": 1524528000.0,
            "CreatedDate": 1524568827.466
        }
    ],
    "ARN": "arn:aws:secretsmanager:eu-west-1:8282828282828:secret:username-YdgbPA",
    "Name": "envir/username"
}

当我尝试旋转它时,我得到了这个错误

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

如果我毫无问题地触发 lambda 函数,我可以毫无问题地轮换秘密。

有人有什么想法吗?


相关链接:

4

5 回答 5

20

只是给将来可能会遇到相同错误的人的注释...

如果您使用 AWS Secrets Manager 轮换 Amazon RDS 密码,Secrets Manager 将自动创建一个 Lambda 函数。此功能需要:

  • 访问Internet(以调用 Secrets Manager)或与 lambda 函数关联的子网中 Secrets Manager 服务的VPC 终端节点
  • 访问RDS 实例(登录和更改密码)

因此,以下组合有效:

  • 具有未附加到 VPC的 Lambda 函数的可公开访问的数据库(不利于安全性) ,或者
  • 私有子网中的 Lambda 函数和公有子网中的 NAT 网关(因此 Lambda 函数可以访问 Internet)附加到 Lambda 函数的 ENI 的弹性 IP 地址

此外,附加到数据库的安全组需要允许来自 Lambda 函数的入站访问。默认情况下,Lambda 函数分配有与数据库使用的相同的安全组,因此:

  • 编辑数据库安全组以允许来自自身的入站连接(即,通过同一安全组从 Lambda 到数据库),或者
  • 将 Lambda 函数使用的安全组更改为当前允许访问数据库安全组的安全组
于 2018-05-31T05:31:00.030 回答
17

对于仍然遇到此问题的任何人,您可以尝试清除待处理版本并重新尝试轮换

例如,使用带有 secret id 的 secret thefrog,调用

aws secretsmanager get-secret-value \
    --secret-id thefrog \
    --version-stage AWSPENDING

获取带有待处理标签的版本的版本 ID。结果看起来像

{                                                                      
    "CreatedDate": 1541540242.561,                         
    "Name": "thefrog",                
    "VersionStages": [                               
        "AWSPENDING"                                        
    ],                                                    
    "SecretString": "TOP-SECRET",                                                    
    "ARN": "arn:aws:secretsmanager:xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "VersionId": "2a27cecb-23c7-4320-b168-78661c24612f"   
} 

然后打电话

aws secretsmanager update-secret-version-stage \
    --secret-id thefrog \
    --version-stage AWSPENDING \
    --remove-from-version-id 2a27cecb-23c7-4320-b168-78661c24612f

删除具有待处理标签的密钥版本。

从这里您可以重试旋转

于 2018-06-26T23:16:03.467 回答
10

对于认为https://forums.aws.amazon.com/thread.jspa?threadID=280093&tstart=0上的链接不适用的任何人,请确保检查两者的输出aws secretsmanager list-secret-version-idsaws secretsmanager list-secrets确保它们同步彼此。我只有一个无法轮换的秘密,不断收到“前一个轮换未完成。将重新尝试该轮换”错误消息。我有一个打开了 AWS 的支持案例,当我等待与支持代表交谈时,我决定检查 的输出list-secrets,你瞧,我发现我无法轮换的秘密上有一个 AWSPENDING 标签(该标签未显示在list-secret-version-ids该秘密的输出中)。一旦我清除了那个标签,我就可以成功地轮换我遇到问题的秘密。

于 2018-05-14T19:46:18.553 回答
1

问题是 lambda 函数失败并且重试发生在我无法控制的情况下(目前无法限制 lambda 函数的重试)。

于 2018-04-30T14:31:29.523 回答
0

我有一个类似的问题。对于我的 documentdb,我有一个 cloudformation 模板,其中包含以下模板内容:

  MyDocumentDbSecret:
    Type: AWS::SecretsManager::Secret
    Properties:
      Name: "/secrets/documentdb/root"
      Description: 'DocDB root secret'
      GenerateSecretString:
        SecretStringTemplate: !Sub '{"username": "${DefaultDocDbUser}"}'
        GenerateStringKey: "password"
        PasswordLength: 16
        ExcludeCharacters: '"@/\'

但是使用这个 cloudformation 模板,我总是在 lambda 函数中遇到连接超时(尝试更改我的用户密码)。

但是,当我在 SecretStringTemplate 属性中使用 ssl = true 将我的 cloudformation 模板更改为此时:

  DocDBClusterRotationSecret:
    Type: AWS::SecretsManager::Secret
    Properties:
      Name: "/secrets/documentdb/root"
      Description: 'DocDB root secret'
      GenerateSecretString:
        SecretStringTemplate: !Sub '{"username": "${DefaultDocDbUser}", "ssl": "true"}'
        GenerateStringKey: "password"
        PasswordLength: 16
        ExcludeCharacters: '"@/\'

然后它可以正常工作。对于我的 cloudformation 类型:AWS::SecretsManager::SecretTargetAttachment 没有为我的密钥提供属性 ssl=true,因此我需要在我的 cloudformation 模板中手动添加它。现在它可以完美运行,没有错误。

我的秘密字符串现在看起来像这样:

{
 "password": "My PW",
 "engine": "mongo",
 "port": 27017,
 "host": "My Host",
 "ssl": "true",
 "username": "My User"
}
于 2020-03-30T13:40:52.040 回答