AWS秘密经理,以前的轮换未完成'在旋转秘密时

时间:2018-04-24 11:41:00

标签: amazon-web-services aws-secrets-manager

我创建了一个秘密,并将其更新为具有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函数,我可以毫无问题地轮换秘密。

任何人都有任何想法?

相关链接:

5 个答案:

答案 0 :(得分:6)

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

例如,对于具有秘密ID 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

删除带有待定标签的机密版本。

您可以从此处重试旋转

答案 1 :(得分:5)

对于将来可能会遇到同样错误的人来说只是一张纸条......

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

  • 访问 Internet (调用Secrets Manager)
  • 访问 RDS实例(登录并更改密码)

因此,以下组合起作用:

  • 使用连接到VPC的Lambda函数, OR
  • 的可公开访问的数据库(对安全性有害)
  • 私有子网中的Lambda函数在公有子网中具有NAT网关(因此Lambda函数可以访问Internet) OR 附加到Lambda函数的ENI的弹性IP地址

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

  • 编辑数据库安全组以允许来自本身的入站连接(即,通过相同的安全组从Lambda到数据库), OR
  • 将Lambda函数使用的安全组更改为当前允许访问数据库安全组的安全组

答案 2 :(得分:4)

对于认为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的输出上。一旦我清除了那个标签,我就可以成功地转动我遇到问题的秘密。

答案 3 :(得分:1)

问题是lambda函数失败了,重试发生在我的控制之下(目前没有办法限制lambda函数的重试)。

答案 4 :(得分: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"
}