removalPolicy: cdk.RemovalPolicy.DESTROY 如何运作?

How does removalPolicy: cdk.RemovalPolicy.DESTROY works?

我正在使用移除策略:cdk.RemovalPolicy.DESTROY。

另外两个选项是 RETAIN 和 SNAPSHOT。

如果我从控制台删除我的 table 并尝试使用 cdk 创建它会给出一个错误,说找不到资源。

问题 -- 如果脚本无法找到应该创建的 table,我可以使用什么选项?

CDK RemovalPolicy is equivalent to Cloudformatoin DeletePolicy 当从 CDK/Cloudformation.

中删除资源时生效
  • DESTROY:这是默认选项,如果在 CDK 中删除了代码,则会删除实际资源。
  • 保留:如果资源代码从 CDK 中删除,这将保留实际资源。
  • SNAPSHOT:如果资源代码从 CDK 中删除,这也会删除资源,但会在删除前创建 SNAPSHOT。例如:RDS 集群或 EC2 卷。

当实际资源从 CDK 代码而不是 AWS 中删除时,这些选项适用。如果手动删除由 CDK/Cloudformation 创建的资源,CDK 将无法再维护它,并且会导致错误,除非更改 id 例如:MyQueue 更改为 MyQueueSomething。这将导致创建新队列并删除旧队列。由于旧队列不存在,它将被忽略。

new sqs.Queue(this, 'MyQueue', {
    encryption: sqs.QueueEncryption.KMS_MANAGED
});

如果我们错误地在cdk/cf之外手动删除了一个资源,而我们想通过cdk/cf继续管理它,我们必须手动创建具有相同物理ID的资源。 Here 是更多细节。

RemovalPolicy 与您在 CDK 之外自行删除的内容无关。这是一个坏主意(在某些情况下是不允许的),因为您应该通过更新 CDK 代码来删除该资源,然后重新部署它来删除资源。

如果您更改 CDK 代码以使资源不再是 CDK 堆栈的一部分,RemovalPolicy 会告诉 CloudFormation 做什么。

例如,如果您有一个 S3 存储桶,您不能重命名它,但您仍然可以在您的 CDK 堆栈中更改它的名称。如果这样做,CDK 将需要删除旧的 S3 存储桶并使用新名称创建一个新存储桶。这同样适用于许多其他无法重命名的资源,例如 DynamoDB tables.

CDK 如何处理删除此旧资源是 RemovalPolicy 的用途。如果您将其设置为 RETAIN,它将忘记它并留给您稍后手动清理。使用 DESTROY 策略告诉 CDK 尝试自动删除您的资源及其包含的所有数据。

通常,如果数据不重要并且可以轻松重新创建(例如缓存数据),您会使用 DESTROY,如果数据很重要并且您不想丢失它(例如用户数据),则使用 RETAIN。

通常只使用 RETAIN 是个好主意。这样,如果您不小心在 CDK 堆栈中输入错误并错误地重命名资源,其中的所有数据都不会被删除!

what option I can use if the script is unable to find the table then it should create ?

您只是正常创建资源。当您编写 CDK 堆栈时,您并不是在告诉它要做什么(创建这个 S3 存储桶,创建这个 DynamoDB table),而是告诉它您想要什么(我想要一个具有这个名称的 S3 存储桶,并且具有该名称的 DynamoDB table)。 CDK 将确定需要创建哪些资源以满足您的请求,如果 CDK 已经在较早的部署中创建了这些资源,它只会在需要更改时更新它们,或者如果不需要更改则保持不变。

您手动删除资源后出现错误的原因是CDK 试图找到它以确定是否需要更新。这就是为什么您不应该手动更改任何由 CDK 配置的 AWS 资源的原因 - 始终更新 CDK 模板并重新部署。如果您 fiddle 手动使用资源,很容易破坏 CDK,在这种情况下,唯一的解决方案是销毁堆栈,手动清理所有无法销毁的资源,然后从头开始重新部署(然后重新上传您可能拥有的任何用户数据,这通常很重要!)