AWS Secrets Manager和云形成-无法创建秘密,因为它已经存在

时间:2019-01-07 09:22:51

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

我有一个CF模板,里面有一个简单的秘密,像这样:

Credentials:
    Type: 'AWS::SecretsManager::Secret'
    Properties:
    Name: !Sub ${ProjectKey}.${StageName}.${ComponentId}.credentials
    Description: client credentials
    SecretString: !Sub 
        '{"client_id":"${ClientId}","client_secret":"${ClientSecret}"}'

成功创建了堆栈,并且正确生成了机密。

但是,当我删除堆栈并再次重新创建它时,会出现以下错误消息:

  

由于密码pk.stage.compid.credentials导致操作失败   已经存在。 (服务:AWSSecretsManager;状态代码:400;错误   代码:ResourceExistsException;请求ID:###)

我想这是因为机密并未真正删除,只是标记了x天才能删除。

可以通过CLI立即删除机密,但是如何在CF模板中完成呢?

我需要删除并重新创建堆栈,因为它是持续集成/交付管道的一部分,该管道在源代码提交时自动触发。

1 个答案:

答案 0 :(得分:1)

通常,当您删除堆栈时,也应删除密码。 CFN会执行上述立即删除操作。即使已计划在CFN堆栈之外删除机密,此操作也应成功。

如果(在删除堆栈之后)秘密是由另一个云形成堆栈创建的,或者在另一个CI管道中运行的同一测试重新创建了秘密,则可能会看到此错误。此外,大多数AWS系统(包括Secrets Manager)最终都是一致的,您可能会看到要删除的堆栈与实际的秘密删除之间存在延迟。如果您的测试运行速度足够快,或者在多个测试中重复使用了相同的机密名称,则上一个删除操作可能在下一次创建之前尚未完成。

我们在CI堆栈中也遇到了类似的问题,解决该问题的方法是使用生成的每个测试随机名称。例如,您可以将一个随机前缀作为参数传递给堆栈,然后使用该前缀来构造名称(确保每个测试使用唯一的后缀)。

BTW-您可以通过在机密上运行get-secret-value来测试机密是否已安排删除。如果计划将其删除,则会看到错误“ ...您无法对机密执行此操作,因为它已被删除”,而如果实际上已删除了机密,则会看到“ Secrets Manager找不到指定的秘密”。如果您计划要删除的秘密,然后使用--force-delete-without-recovery删除它,则可能会在两个状态之间出现短暂的几秒钟的延迟。