我有一个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模板中完成呢?
我需要删除并重新创建堆栈,因为它是持续集成/交付管道的一部分,该管道在源代码提交时自动触发。
答案 0 :(得分:1)
通常,当您删除堆栈时,也应删除密码。 CFN会执行上述立即删除操作。即使已计划在CFN堆栈之外删除机密,此操作也应成功。
如果(在删除堆栈之后)秘密是由另一个云形成堆栈创建的,或者在另一个CI管道中运行的同一测试重新创建了秘密,则可能会看到此错误。此外,大多数AWS系统(包括Secrets Manager)最终都是一致的,您可能会看到要删除的堆栈与实际的秘密删除之间存在延迟。如果您的测试运行速度足够快,或者在多个测试中重复使用了相同的机密名称,则上一个删除操作可能在下一次创建之前尚未完成。
我们在CI堆栈中也遇到了类似的问题,解决该问题的方法是使用生成的每个测试随机名称。例如,您可以将一个随机前缀作为参数传递给堆栈,然后使用该前缀来构造名称(确保每个测试使用唯一的后缀)。
BTW-您可以通过在机密上运行get-secret-value来测试机密是否已安排删除。如果计划将其删除,则会看到错误“ ...您无法对机密执行此操作,因为它已被删除”,而如果实际上已删除了机密,则会看到“ Secrets Manager找不到指定的秘密”。如果您计划要删除的秘密,然后使用--force-delete-without-recovery删除它,则可能会在两个状态之间出现短暂的几秒钟的延迟。