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/
我有一个 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/