我想解决在重新部署 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 模板,然后检查 DeletionPolicy 和 updateReplacePolicy 是否设置为 Delete:
cdk synth