当我重新部署 AWS Cloud Development Kit (AWS CDK) 代码时,我收到“Already Exists”的错误。
解决方法
默认情况下,AWS CDK 构造库中的大多数资源都会将 removalPolicy 属性设置为 RETAIN 状态。如果您未在资源上将 removalPolicy 属性设置为 RETAIN,则这些资源将成为孤立资源。删除堆栈后,孤立资源会保留在您的 AWS 账户中,然后转换为 DELETE_COMPLETE 状态。
更新堆栈时,AWS CDK 会删除该资源。如果您为资源指定了自定义名称,则在重新部署相同代码时,您可能会收到“Already Exists”错误。
**注意:**以下步骤使用的 Amazon Simple Storage Service (Amazon S3) 存储桶资源示例关联了 AWS CDK 中的 s3.Bucket 类。
自定义命名资源示例:
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
bucketName: 'amzn-s3-demo-bucket',
versioned: false,
encryption: s3.BucketEncryption.S3_MANAGED
});
将保留的资源导入新堆栈
完成以下步骤:
-
确认您的环境满足使用 cdk import AWS CDK 命令行界面 (CLI) 命令的要求。
**注意:**在堆栈中更新或创建资源时,无法将其他资源导入该堆栈。单次导入操作仅可导入一个或多个资源。
-
暂时从代码中移除除要保留的资源之外的所有其他资源。您导入的资源的定义属性必须与已部署资源的属性相匹配。例如,导入保留的 S3 存储桶资源 s3-bucket。
**注意:**要导入资源,必须为该资源设置删除策略。
策略示例:
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
bucketName: 'amzn-s3-demo-bucket',
removalPolicy: RemovalPolicy.RETAIN
});
//const cfnFunction = new lambda.CfnFunction(this, 'MyCfnFunction', {
// code: {
// ...
// s3Bucket: s3Bucket.bucketArn
// },
// role: 'role',
**注意:**请将 s3-bucket 替换为您的 S3 存储桶名称。
-
运行以下 cdk import 命令启动资源导入:
cdk import
-
当 CDK 提示您输入时,输入 resource ID(资源 ID)。在此示例中,请输入 S3 存储桶的名称。
-
从代码中重新引入资源,然后运行以下 deploy 命令:
cdk deploy
手动删除保留的资源
完成以下步骤:
- 登录到 AWS 管理控制台。
- 选择不想保留的资源服务。
- 手动删除这些资源。例如,要删除 s3.bucket 资源,请删除 Amazon S3 存储桶。
- 要重新部署 AWS CDK,请运行以下 deploy 命令:
cdk deploy
更改保留的资源的名称
完成以下步骤:
- 打开资源的 AWS CDK 代码。
- 将资源名称更新为与保留资源名称不冲突的唯一值:
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
bucketName: 'amzn-s3-demo-bucket',
versioned: false,
encryption: s3.BucketEncryption.S3_MANAGED
});
**注意:**上述示例使用 bucketName 参数来更改 s3.Bucket 资源的名称。请将 amzn-s3-demo-bucket 替换为您的 S3 存储桶名称。
删除资源名称
要删除资源名称,以便 AWS CDK 可以生成一个唯一的名称,请完成以下步骤:
- 要从 AWS CDK 中删除资源名称,请运行以下代码:
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
versioned: false,
encryption: s3.BucketEncryption.S3_MANAGED
});
**注意:**上述示例代码删除了 bucketName 属性,以允许 AWS CDK 生成新名称。
- 要重新部署 AWS CDK,请运行以下 deploy 命令:
cdk deploy
将 removalPolicy 属性设置为 DESTROY
完成以下步骤:
-
打开资源的 AWS CDK 代码。
-
将 removalPolicy 属性设置为 DESTROY:
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
bucketName: 'amzn-s3-demo-bucket',
removalPolicy: RemovalPolicy.DESTROY
});
-
要访问 AWS CloudFormation 模板,请运行以下 cdk synth 命令:
cdk synth
-
验证 DeletionPolicy 和 UpdateReplacePolicy 是否设置为 Delete。