【问题标题】:AWS Secrets Manager and Cloud Formation - can not create secret because it already existsAWS Secrets Manager 和 Cloud Formation - 无法创建密钥,因为它已经存在
【发布时间】:2022-04-14 02:58:33
【问题描述】:

我有一个 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 模板中完成?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 您说的完全正确,机密模板中的逻辑 ID 已更改。这就是为什么在创建堆栈时秘密仍然存在的原因。我通过 CLI 和 force 选项删除了秘密,现在每次管道运行时它都可以工作。
    【解决方案2】:

    另一种选择是立即通过 cli 删除密钥。这可以防止在它被标记为删除之后 7 天的延迟才真正消失。这个命令行选项可以解决问题:

    aws secretsmanager delete-secret --secret-id your-secret --force-delete-without-recovery --region your-region

    请相应地替换 your-secret 和 your-region。 请参阅此参考页面:https://aws.amazon.com/premiumsupport/knowledge-center/delete-secrets-manager-secret/

    【讨论】:

      猜你喜欢
      • 2020-09-29
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 2020-08-14
      • 2020-02-27
      • 2021-03-10
      • 2019-05-12
      • 1970-01-01
      相关资源
      最近更新 更多