跳至内容

如何解决从部署中删除堆栈后重新部署 AWS CDK 代码时收到的“Already Exists”错误?

2 分钟阅读
0

当我重新部署 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
 });

将保留的资源导入新堆栈

完成以下步骤:

  1. 确认您的环境满足使用 cdk import AWS CDK 命令行界面 (CLI) 命令的要求。
    **注意:**在堆栈中更新或创建资源时,无法将其他资源导入该堆栈。单次导入操作仅可导入一个或多个资源。

  2. 暂时从代码中移除除要保留的资源之外的所有其他资源。您导入的资源的定义属性必须与已部署资源的属性相匹配。例如,导入保留的 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 存储桶名称。

  3. 运行以下 cdk import 命令启动资源导入:

    cdk import
  4. 当 CDK 提示您输入时,输入 resource ID(资源 ID)。在此示例中,请输入 S3 存储桶的名称。

  5. 从代码中重新引入资源,然后运行以下 deploy 命令:

    cdk deploy

手动删除保留的资源

完成以下步骤:

  1. 登录到 AWS 管理控制台
  2. 选择不想保留的资源服务。
  3. 手动删除这些资源。例如,要删除 s3.bucket 资源,请删除 Amazon S3 存储桶
  4. 要重新部署 AWS CDK,请运行以下 deploy 命令:
    cdk deploy

更改保留的资源的名称

完成以下步骤:

  1. 打开资源的 AWS CDK 代码。
  2. 将资源名称更新为与保留资源名称不冲突的唯一值:
    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 可以生成一个唯一的名称,请完成以下步骤:

  1. 要从 AWS CDK 中删除资源名称,请运行以下代码:
    const s3Bucket = new s3.Bucket(this, 's3-bucket', {
     versioned: false,
     encryption: s3.BucketEncryption.S3_MANAGED
     });
    **注意:**上述示例代码删除了 bucketName 属性,以允许 AWS CDK 生成新名称。
  2. 要重新部署 AWS CDK,请运行以下 deploy 命令:
    cdk deploy

将 removalPolicy 属性设置为 DESTROY

完成以下步骤:

  1. 打开资源的 AWS CDK 代码。

  2. removalPolicy 属性设置为 DESTROY

    const s3Bucket = new s3.Bucket(this, 's3-bucket', {
     bucketName: 'amzn-s3-demo-bucket',
     removalPolicy: RemovalPolicy.DESTROY
     });
  3. 要访问 AWS CloudFormation 模板,请运行以下 cdk synth 命令:

    cdk synth
  4. 验证 DeletionPolicyUpdateReplacePolicy 是否设置为 Delete