如何解决在删除初始部署的堆栈后重新部署 CDK 代码时收到“已存在”错误?

2 分钟阅读
0

我想解决在重新部署 AWS Cloud Development Kit(AWS CDK)代码时收到“已存在”错误。

概述

AWS CDK 构造库中的大多数有状态资源都接受 removalPolicy 属性,并将 RETAIN 作为默认值。未设置 removalPolicy 的资源将成为孤立资源,并在堆栈遭到删除后保留在账户中。当堆栈过渡到 DELETE_COMPLETE 状态时,就会发生这种情况。在相应堆栈的更新期间,删除代码中类似资源的资源定义时,此行为保持不变。如果保留的资源是自定义命名的,则在重新部署相同的代码时会出现“已存在”错误。

要解决此错误,请根据您的用例完成以下操作:

  • 对于无意中保留的资源,请手动予以删除。
  • 对于有意保留的资源,请将 AWS CDK 代码中的资源名称更改为唯一值。
  • 对于有意保留的资源,另一种方法是删除 AWS CDK 代码中的资源名称,让 AWS CDK 自动生成新名称。
  • 在删除堆栈之前,请确认资源中的 removalPolicy 已设置为 DESTROY

解决方法

**注意:**以下步骤使用了由 AWS CDK 中的 s3.bucket 类表示的 Amazon Simple Storage Service(Amazon S3)存储桶示例资源。默认情况下,AWS CDK 中此资源的 removalPolicy 设置为 RETAIN。若资源的相应堆栈遭到删除,或资源在堆栈更新期间遭到删除,该资源将保留在账户中。

示例:

const s3Bucket = new s3.Bucket(this, 's3-bucket', {
 bucketName: ‘DOC-EXAMPLE-BUCKET1’,
 versioned: false,
 encryption: s3.BucketEncryption.S3_MANAGED
 });

手动删除保留的资源

1.    登录 AWS 管理控制台并访问您不想保留的资源的相应服务。

2.    手动删除您不想保留的资源。

**注意:**在此示例中,删除 Amazon S3 存储桶以删除 s3.bucket 资源。

3.    重新部署 AWS CDK 代码:

cdk deploy

更改保留的资源的名称

1.    访问您要更改名称的资源的 AWS CDK 代码。

2.    将资源名称更新为与保留资源名称不冲突的唯一值。

**注意:**在此示例中,更新 bucketName 参数以更改 s3.bucket 资源的名称。

示例:

const s3Bucket = new s3.Bucket(this, 's3-bucket', {
 bucketName: ‘EXAMPLE-NEW-NAME-S3-BUCKET’,
 versioned: false,
 encryption: s3.BucketEncryption.S3_MANAGED
 });

删除资源名称以允许 AWS CDK 自动生成唯一名称

1.    删除 AWS CDK 中的资源名称。

**注意:**在此示例中,删除 BucketName 属性来让 AWS CDK 自动生成新名称。

示例:

const s3Bucket = new s3.Bucket(this, 's3-bucket', {
 versioned: false,
 encryption: s3.BucketEncryption.S3_MANAGED
 });

2.    重新部署 AWS CDK 代码:

cdk deploy

将“removalPolicy”设置为“DESTROY”

1.    访问您不想保留的资源的 AWS CDK 代码。

2.    将 removalPolicy 属性设置为 DESTROY

const s3Bucket = new s3.Bucket(this, 's3-bucket', {
 bucketName: ‘EXAMPLE-S3-BUCKET’,
 removalPolicy: RemovalPolicy.DESTROY
 });

3.    运行 cdk synth 访问 AWS CloudFormation 模板,然后检查 DeletionPolicyupdateReplacePolicy 是否设置为 Delete

cdk synth
AWS 官方
AWS 官方已更新 1 年前