Amazon web services AWS机密管理器和云形成-无法创建机密,因为它已存在

Amazon web services AWS机密管理器和云形成-无法创建机密,因为它已存在,amazon-web-services,stack,amazon-cloudformation,aws-secrets-manager,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":"${C

我有一个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模板中执行此操作?


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

通常删除堆栈时,也应删除机密;CFN执行上述立即删除操作。即使计划在CFN堆栈之外删除机密,也应该成功

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

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


顺便说一句,您可以通过对机密运行get secret value来测试该机密是否计划删除或实际上不存在。如果计划删除该机密,您将看到错误“…您无法对该机密执行此操作,因为它已被删除”,而如果该机密已实际删除,您将看到“机密管理器无法找到指定的机密”。如果您计划删除一个秘密,然后使用--force delete not recovery将其删除,您可能会看到这两种状态之间有几秒钟的短暂延迟。

通常,当您删除一个堆栈时,该秘密也应该被删除;CFN执行上述立即删除操作。即使计划在CFN堆栈之外删除机密,也应该成功

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

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


顺便说一句,您可以通过对机密运行get secret value来测试该机密是否计划删除或实际上不存在。如果计划删除该机密,您将看到错误“…您无法对该机密执行此操作,因为它已被删除”,而如果该机密已实际删除,您将看到“机密管理器无法找到指定的机密”。如果您计划删除一个秘密,然后使用--force delete not recovery将其删除,您可能会看到这两种状态之间有几秒钟的短暂延迟。

您完全正确,该秘密的模板中的逻辑ID已更改。这就是为什么在创建堆栈时,秘密仍然存在的原因。我通过CLI和force选项删除了该机密,现在它在每次管道运行时都能正常工作。您完全正确,该机密的模板中的逻辑ID已更改。这就是为什么在创建堆栈时,秘密仍然存在的原因。我通过CLI和force选项删除了这个秘密,现在它在每次管道运行时都能正常工作。