AWS CDK 자동 교차 스택 참조 제거

8355 단어 cdk

자동 교차 스택 참조란 무엇입니까?



여러 스택에서 리소스를 사용할 때 CDK에서 생성되는 자동 참조는 편리하지만 이러한 방식으로 참조되는 리소스를 제거하려는 경우 배포를 차단할 수 있습니다. 다음과 같은 오류가 표시됩니다.

Export Stack1:ExportsOutputFnGetAtt-****** cannot be deleted as it is in use by Stack1


stack1에 Bucket이 있고 stack2가 해당 bucket.bucketName을 참조한다고 가정해 보겠습니다.
GitHub repository에서 전체 데모 코드를 볼 수 있습니다.

export class Stack1 extends Stack {
  readonly bucket: s3.Bucket
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props)

    // Let's say there is a Bucket in the stack1, and the stack2 references its bucket.bucketName.
    const bucket = new s3.Bucket(this, 'bucket', {
      removalPolicy: RemovalPolicy.DESTROY,
      autoDeleteObjects: true,
    })

    this.bucket = bucket
  }
}

export class Stack2 extends Stack {
  constructor(scope: Construct, id: string, props: Stack2Props) {
    super(scope, id, props)

    // comment out the following line and re-deploy to see the error
    //  ❌  Stack1 failed: Error: The stack named Stack1 failed to deploy: UPDATE_ROLLBACK_COMPLETE
    new CfnOutput(this, 'bucketName', {
      value: props.bucket.bucketName,
    })
  }
}


npx cdk deploy --all을 실행하여 모든 스택 배포



더 이상 사용하지 않기 때문에 이제 버킷을 제거하려고 합니다. stack2가 아직 사용 중인 상태에서 stack1.bucket을 제거하는 것은 안전하지 않습니다.
이를 재현하려면 stack1.bucket에 대한 모든 참조를 제거한 다음 npx cdk deploy --all를 실행하여 다시 배포할 수 있습니다. 다음 오류가 표시됩니다.

❌  Stack1 failed: Error: The stack named Stack1 failed to deploy: UPDATE_ROLLBACK_COMPLETE


따라서 이것으로부터 자신을 차단 해제하는 것은 두 단계 프로세스입니다. 작동 방식은 다음과 같습니다.

배포 1: 관계 끊기


  • stack2가 더 이상 bucket.bucketName을 참조하지 않는지 확인하십시오(소비자 스택이 이제 자체 버킷을 사용하거나 AWS DynamoDB 테이블에 쓰거나 Lambda 함수를 완전히 제거할 수 있음).
  • stack1 클래스에서 this.exportValue(this.bucket.bucketName)를 호출합니다. 이렇게 하면 두 스택 간의 관계가 끊어지는 동안 CloudFormation 내보내기가 계속 존재하는지 확인할 수 있습니다.

  • export class Stack1 extends Stack {
      readonly bucket: s3.Bucket
      constructor(scope: Construct, id: string, props?: StackProps) {
        super(scope, id, props)
    
        // Let's say there is a Bucket in the stack1, and the stack2 references its bucket.bucketName.
        const bucket = new s3.Bucket(this, 'bucket', {
          removalPolicy: RemovalPolicy.DESTROY,
          autoDeleteObjects: true,
        })
    
        this.bucket = bucket
    
        // Uncomment the following line
        // This will make sure the CloudFormation Export continues to exist while the relationship between the two stacks is being broken.
        this.exportValue(bucket.bucketName)
      }
    }
    


  • 배포(이렇게 하면 사실상 stack2만 변경되지만 둘 다 배포하는 것이 안전합니다).

  • npx cdk deploy --all
    


    배포 2: 리소스 제거


  • 이제 stack1에서 버킷 리소스를 자유롭게 제거할 수 있습니다.
  • exportValue() 호출도 제거하는 것을 잊지 마십시오.
  • 다시 배포합니다(이번에는 stack1만 변경됨 -- 버킷이 삭제됨).

  • 즉, 예상치 못한 AWS 비용을 피하기 위해 깨끗한 모든 리소스를 제거하는 것을 잊지 마십시오.

    npx cdk destroy --all
    


    읽어 주셔서 감사합니다! 도움이 되었기를 바랍니다. 질문이 있으시면 댓글을 남겨주세요. 나는 가능한 한 빨리 회신하려고 노력할 것입니다.

    원본 게시물은 My Blog에서 찾을 수 있습니다.

    좋은 웹페이지 즐겨찾기