AWS Secrets Manager 和 Cloud Formation - 无法创建秘密,因为它已经存在

AWS Secrets Manager and Cloud Formation - can not create secret because it already exists

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

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

栈创建成功,secret正确生成

然而,当我删除堆栈并再次重新创建它时,我收到以下错误消息:

The operation failed because the secret pk.stage.compid.credentials already exists. (Service: AWSSecretsManager; Status Code: 400; Error Code: ResourceExistsException; Request ID: ###)

我猜这是因为机密并未真正删除,而只是标记为删除 x 天。

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

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

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

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

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

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

另一种选择是通过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/