내용으로 건너뛰기

배포에서 스택을 삭제한 후 AWS CDK 코드를 재배포할 때 발생하는 ‘Already Exists’ 오류를 해결하려면 어떻게 해야 합니까?

3분 분량
0

AWS Cloud Development Kit(AWS CDK) 코드를 재배포할 때 ‘Already Exists’ 오류가 표시됩니다.

해결 방법

AWS CDK 구성 라이브러리에 있는 대부분의 리소스는 기본적으로 removalPolicy 속성을 RETAIN 상태로 설정합니다. 리소스의 removalPolicy 속성을 RETAIN으로 설정하지 않으면 리소스가 분리됩니다. 분리된 리소스는 스택을 삭제한 다음, DELETE_COMPLETE 상태로 전환한 후에도 AWS 계정에 남아 있습니다.

스택을 업데이트하면 AWS CDK가 리소스를 제거합니다. 리소스의 사용자 지정 이름을 지정한 경우 동일한 코드를 재배포하면 ‘Already Exists’ 오류가 발생할 수 있습니다.

참고: 다음 단계에서는 AWS CDK에서 s3.Bucket 클래스와 관련된 예제 Amazon Simple Storage Service(Amazon S3) 버킷 리소스를 사용합니다.

사용자 지정 이름이 지정된 리소스 예:

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에서 리소스 ID를 입력하라는 메시지가 표시되면 리소스 ID를 입력합니다. 이 예에서는 S3 버킷의 이름을 입력합니다.

  5. 코드에서 리소스를 다시 도입한 후 다음 deploy 명령을 실행합니다.

    cdk deploy

유지된 리소스를 수동으로 삭제

다음 단계를 완료합니다.

  1. AWS Management Console에 로그인합니다.
  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
     });
    참고: 위의 예제 코드는 AWS CDK가 새 이름을 생성할 수 있도록 bucketName 속성을 제거합니다.
  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. DeletionPolicyUpdateReplacePolicyDelete로 설정되어 있는지 확인합니다.