CDK AWS v2 개발자 안내서입니다. 이전 CDK v1은 2022년 6월 1일에 유지 관리에 들어갔으며 2023년 6월 1일에 지원이 종료되었습니다.
기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
CDK 코드를 리팩터링할 때 배포된 리소스 보존
중요
CDK 리팩터링은 미리 보기 릴리스이며 변경될 수 있습니다.
AWS 클라우드 개발 키트(AWS CDK) 리팩터링을 사용하면 구문 이름 바꾸기, 스택 간 리소스 이동, 애플리케이션 재구성과 같은 CDK 코드를 리팩터링하는 동시에 배포된 리소스를 교체하는 대신 보존할 수 있습니다. 이 기능을 사용하면 의도하지 않은 리소스 교체 없이 우수한 소프트웨어 엔지니어링 모범 사례를 유지할 수 있습니다.
리소스 보존을 통한 CDK 리팩터링이란 무엇입니까?
CDK 애플리케이션을 배포할 때 AWS CloudFormation은 논리적 IDs. AWS CDK는 구문 IDs와 구문 트리의 경로를 기반으로 이러한 논리적 ID를 생성합니다. 구문의 ID를 변경하거나 코드의 다른 위치로 이동하는 경우 AWS CloudFormation은 일반적으로 이를 새 리소스를 생성하고 이전 리소스를 삭제하기 위한 요청으로 해석합니다. 데이터베이스, 스토리지 버킷 또는 대기열과 같은 상태 저장 리소스의 경우이 대체로 인해 서비스가 중단되거나 데이터가 손실될 수 있습니다.
CDK 리팩터링은 다음을 통해이 문제를 해결합니다.
-
코드에서 리소스가 이동되거나 이름이 변경된 시기를 감지합니다.
-
AWS CloudFormation의 리팩터링 기능을 사용하여 기본 물리적 리소스 보존.
-
실제 리소스를 교체하지 않고 논리적 IDs를 업데이트합니다.
-
스택 전반의 리소스 간 참조 유지.
CDK CLI cdk refactor
명령 또는 CDK Toolkit Library의 refactor
작업을 사용하여 CDK 리팩터링을 수행할 수 있습니다. 이 가이드에서는 주로 CLI 접근 방식에 대해 설명하지만 기본 원칙은 두 방법 모두에 적용됩니다. 도구 키트 라이브러리 사용에 대한 자세한 내용은 CDK 도구 키트 라이브러리를 사용하여 프로그래밍 작업 수행을 참조하세요.
중요
리팩터링 작업은 새 리소스 추가, 리소스 삭제 또는 리소스 속성 수정과 같은 다른 작업과 별도로 단독으로 수행해야 합니다.
리소스를 추가, 삭제 또는 수정하고 리팩터링해야 하는 경우 먼저 이러한 변경 사항을 별도로 배포한 다음 리팩터링을 사용하여 리소스를 재구성해야 합니다.
CDK 리팩터링의 이점
CDK 리팩터링은 AWS CDK 개발자에게 다음과 같은 이점을 제공합니다.
-
코드 조직 개선 - 리소스 교체 없이 CDK 애플리케이션의 구조 이름을 바꾸고 구조를 재구성합니다.
-
재사용 가능한 구성 요소 생성 - 배포된 리소스를 유지하면서 복제된 코드를 재사용 가능한 L3 구문으로 추출합니다.
-
아키텍처 분리 향상 - 스택 간에 리소스를 이동하여 애플리케이션의 다양한 부분을 더 잘 격리할 수 있습니다.
-
우발적인 리소스 교체 방지 - 구문의 이름을 바꿀 때 의도하지 않은 리소스 재생성을 방지합니다.
-
타사 라이브러리 변경 사항 완화 - 의존하는 구문 라이브러리의 논리적 ID 변경으로부터 애플리케이션을 보호합니다.
-
소프트웨어 엔지니어링 모범 사례 적용 - 배포된 인프라를 손상시키지 않고 코드를 리팩터링합니다.
CDK CLI cdk refactor
명령의 작동 방식
중요
이 기능을 사용하는 모든 명령과 함께 --unstable=refactor
옵션을 제공해야 합니다.
먼저 초기 CDK 애플리케이션을 배포하여 AWS 계정에 기준 리소스를 설정합니다. 구문 이름 바꾸기 또는 스택 간 리소스 이동과 같은 CDK 코드를 리팩터링한 후 cdk refactor
명령을 사용하여 배포된 리소스 리팩터링 프로세스를 시작합니다.
리팩터링 명령을 실행하면 CDK CLI는 현재 코드를 배포된 상태와 비교하여 로컬 변경 사항을 감지합니다. CDK 애플리케이션에 배포된 상태와 정확히 동일한 리소스 세트가 포함되어 있는지 확인하며, 구성 트리의 위치만 다릅니다. 그런 다음 CDK CLI는 이전 리소스 위치를 새 위치에 매핑하는 리팩터링 계획을 생성합니다. CDK CLI는 제안된 변경 사항을 표시하고 확인 후 AWS CloudFormation의 리팩터링 API를 사용하여 리소스의 논리적 IDs 대체하지 않고 업데이트합니다.
CDK CLI는 백그라운드에서 속성과 종속성을 비교하여 구성 트리에서 기능적으로 동일하지만 경로가 다른 리소스를 식별하여 이동된 리소스를 결정합니다. 리소스 추가, 삭제 또는 수정을 감지하면 리팩터링 작업이 오류 메시지와 함께 거부됩니다.
CDK 코드 리팩터링 시 리소스 보존 예제
이 예제에서는 CDK CLI cdk refactor
명령을 사용하여 CDK 코드를 리팩터링하면서 배포된 리소스를 보존합니다.
예제 CDK 애플리케이션은 S3 버킷, CloudFront 배포 및 Lambda 함수가 포함된 단일 스택으로 구성됩니다. 구문 트리는 다음과 같이 구성됩니다.
App └─ MyStack ├─ Bucket ├─ Distribution └─ Function
다음은 애플리케이션 코드의 예입니다.
const app = new cdk.App(); const myStack = new cdk.Stack(app, 'MyStack'); const bucket = new s3.Bucket(myStack, 'Bucket'); const distribution = new cloudfront.Distribution(myStack, 'Distribution', { defaultBehavior: { origin: new origins.S3Origin(bucket) } }); const function = new lambda.Function(myStack, 'Function', { // function properties }); // Synthesize the app app.synth();
이제이 코드를 다음과 같이 리팩터링하려고 한다고 가정해 보겠습니다.
-
버킷의 이름을에서 보다 설명적인
Bucket
로 바꿉니다WebsiteOrigin
. -
버킷과 배포를 새
WebStack
스택으로 이동합니다.
리팩터링 후 구문 트리는 다음과 같습니다.
App ├─ WebStack │ ├─ WebsiteOrigin │ └─ Distribution └─ MyStack └─ Function
리팩터링된 코드는 다음과 같습니다.
// Refactored structure const app = new cdk.App(); // New WebStack with the bucket and distribution const webStack = new cdk.Stack(app, 'WebStack'); const bucket = new s3.Bucket(webStack, 'WebsiteOrigin'); const distribution = new cloudfront.Distribution(webStack, 'Distribution', { defaultBehavior: { origin: new origins.S3Origin(bucket) } }); // Original MyStack with just the function const myStack = new cdk.Stack(app, 'MyStack'); const function = new lambda.Function(myStack, 'Function', { // function properties }); // Synthesize the app app.synth();
CDK 리팩터링이 없으면 논리적 ID가 변경되므로 이러한 변경으로 인해 AWS CloudFormation에서 새 리소스를 생성하고 이전 리소스를 삭제합니다. IDs
-
MyStack/Bucket/Resource
는이 됩니다WebStack/WebsiteOrigin/Resource
. -
MyStack/Distribution/Resource
는이 됩니다WebStack/Distribution/Resource
.
CDK 리팩터링을 사용하면 CDK CLI가 이러한 경로 변경을 감지하고 AWS CloudFormation의 리팩터링 기능을 사용하여 기본 리소스를 보존합니다. cdk refactor
를 실행하면 CLI에 다음과 같은 변경 사항이 표시됩니다.
$ cdk refactor The following resources were moved or renamed: ┌───────────────────────────────┬───────────────────────────────┬───────────────────────────────────┐ │ Resource Type │ Old Construct Path │ New Construct Path │ ├───────────────────────────────┼───────────────────────────────┼───────────────────────────────────┤ │ AWS::S3::Bucket │ MyStack/Bucket/Resource │ WebStack/WebsiteOrigin/Resource │ ├───────────────────────────────┼───────────────────────────────┼───────────────────────────────────┤ │ AWS::CloudFront::Distribution │ MyStack/Distribution/Resource │ WebStack/Distribution/Resource │ └───────────────────────────────┴───────────────────────────────┴───────────────────────────────────┘ Do you wish refactor these resources (y/n)?
를 입력하여 확인하면 CDK CLIy
에 리팩터링 작업의 진행 상황이 표시됩니다.
Refactoring... ✅ Stack refactor complete
확인 후 CDK CLI는 리팩터링 작업을 실행하여 논리적 IDs를 새 코드 구조와 일치하도록 업데이트하는 동안 두 리소스를 모두 보존합니다.
스택별로 구성된 cdk diff
명령의 출력에도 동일한 매핑이 표시됩니다.
Stack MyStack Resources [-] AWS::S3::Bucket Bucket Bucket1234567 destroy (OR move to WebStack.WebsiteOrigin1234567 via refactoring) [-] AWS::CloudFront::Distribution Distribution Distribution1234567 destroy (OR move to WebStack.Distribution1234567) ... Stack WebStack Resources [+] AWS::S3::Bucket WebsiteOrigin WebsiteOrigin1234567 (OR move from MyStack.Bucket1234567) [+] AWS::CloudFront::Distribution Distribution Distribution1234567 (OR move from MyStack.Distribution1234567) ...
CDK 리팩터링 시작하기
리팩터링을 시작하려면 다음 사전 조건을 완료하세요.
- 최신 템플릿으로 환경 부트스트랩
-
CDK 리팩터링 기능을 사용하려면 부트스트랩 스택에 새 권한이 필요합니다. 필요한 권한이 있는지 확인하려면 최신 템플릿을 사용하여 환경을 부트스트랩합니다.
cdk bootstrap
부트스트래핑에 대한 자세한 내용은 AWS CDK의 부트스트래핑 환경을 참조하세요.
- 최신 CDK CLI 버전 설치
-
CDK 리팩터링에는 최신 버전의 CDK CLI가 필요합니다. 최신 버전을 사용하려면:
npm install -g aws-cdk
자세한 설치 지침은 AWS CDK 시작하기를 참조하세요.
재정의 파일을 사용하여 리팩터링의 모호성 해결
CDK CLI는 코드를 배포된 리소스와 비교하여 모든 리소스 매핑을 자동으로 계산합니다. 대부분의 경우이 자동 감지는 잘 작동하지만 CLI에서 자체적으로 해결할 수 없는 모호성이 발생할 수 있는 상황이 있습니다. CDK CLI에 지침을 제공하려면 재정의 파일을 사용합니다.
- 재정의 파일을 생성하여 모호성 해결
-
재정의 파일은 CDK CLI가 리소스에 대한 리팩터링 해상도를 결정할 수 없을 때 매핑을 제공하는 JSON 파일입니다. 파일에는 환경별로 구성된 리소스 매핑이 포함되어 있습니다.
{ "environments": [ { "account": "123456789012", "region": "us-east-2", "resources": { "StackA.OldName": "StackB.NewName", "StackC.Foo": "StackC.Bar" } } ] }
이 파일에서:
-
environments
배열에는 계정 및 리전이 있는 환경 항목이 하나 이상 포함됩니다. -
각 환경 내에서
resources
객체에는 매핑이 포함됩니다. -
키는 형식의 현재 위치를 나타냅니다
<stack name>.<logical ID>
. -
값은 동일한 형식으로 새 위치를 나타냅니다.
CDK CLI에서 재정의 파일을 사용하려면:
cdk refactor --override-file=overrides.json
-
여러 환경에서 스택 리팩터링
CDK 애플리케이션에는 다양한 환경(AWS 계정 및 리전)에 배포되는 여러 스택이 포함될 수 있습니다. 이러한 애플리케이션에서 리팩터링 중에 리소스를 보존할 때 CDK CLI는 다음과 같은 특정 방식으로 환경을 처리합니다.
-
CLI는 환경별로 스택을 그룹화하고 각 환경에서 별도로 리팩터링을 수행합니다.
-
리팩터링 중에 스택 간에 리소스를 이동할 수 있지만 이동과 관련된 모든 스택은 동일한 환경에 있어야 합니다.
-
환경 간에 리소스를 이동하려고 하면 오류가 발생합니다.
이렇게 하면 CloudFormation 리소스를 AWS 계정 또는 리전 경계를 넘어 물리적으로 이동할 수 없으므로 리소스가 원래 계정 및 리전 내에 유지됩니다.
예를 들어 CDK 애플리케이션이 개발 환경과 프로덕션 환경 모두에 대해 스택을 정의하는 경우 리팩터링 작업은 각 환경에서 독립적으로 수행됩니다. 리소스는 개발 환경 또는 프로덕션 환경 내의 스택 간에 이동할 수 있지만 개발에서 프로덕션으로 또는 그 반대로 이동할 수는 없습니다.
교체하도록 설계된 리소스 처리
일부 CDK 구문은 설계의 일부로 CloudFormation의 리소스 대체 동작에 의존합니다. 예를 들어 API Gateway Deployment
및 Lambda의 Version
구문은 속성이 변경될 때 새 리소스를 생성하도록 설계되었습니다.
리팩터링할 때는 리소스 교체로 이어져야 하는 변경 사항을 포함하지 마십시오. 그렇지 않으면 CDK CLI가 이러한 리소스를 감지하고 보존할 수 있습니다. 즉, 교체하도록 설계된 리소스는 리팩터링 작업과 별도로 처리해야 합니다.
교체하도록 설계된 리소스를 올바르게 관리하려면:
-
먼저 애플리케이션을 배포하여 필요에 따라 이러한 리소스를 교체합니다.
-
그런 다음 리팩터링 작업을 별도로 수행하여 코드를 재구성합니다.
이 2단계 접근 방식을 사용하면 교체하도록 설계된 리소스가 제대로 처리되는 동시에 다른 리소스에 대한 CDK 리팩터링의 이점을 누릴 수 있습니다.
일반적인 고려 사항 및 제한 사항
CDK 리팩터링 중에 리소스를 보존할 때는 다음 사항을 고려해야 합니다.
-
환경 제약: 리소스는 동일한 환경의 스택 간에만 이동할 수 있습니다. 환경 간 이동은 지원되지 않습니다.
-
모호성: 동시에 이름이 바뀌는 동일한 리소스가 여러 개 있는 경우 CDK CLI가 올바른 매핑을 자동으로 확인하지 못할 수 있습니다. 이러한 경우 재정의 파일을 사용하여 명시적 매핑을 제공해야 합니다.
-
부트스트랩 요구 사항: 리팩터링 중에 리소스를 보존하려면 필요한 권한이 포함된 최신 버전으로 부트스트랩 스택을 업데이트해야 합니다.
-
제외된 특정 구문: API Gateway
Deployment
및 Lambda와 같은 일부 구문은 리소스 교체에Version
의존하며 리팩터링에서 자동으로 제외됩니다.
CI/CD 파이프라인을 사용한 리팩터링
CI/CD 파이프라인에서 리팩터링 기능을 사용하려면 파이프라인의 일부로 CDK CLI를 실행할 수 있어야 합니다. 다음은 리팩터링을 CI/CD 워크플로에 통합하기 위한 몇 가지 중요한 고려 사항입니다.
- CI/CD에서 리팩터링을 사용하기 위한 사전 조건
-
이 기능을 활용하려면 CI/CD 환경에서 CDK CLI를 사용할 수 있어야 합니다.
- 파이프라인 워크플로에 리팩터링 통합
-
CI/CD 파이프라인에서 배포를 위해 CLI를 사용하는 경우 스크립트는 일반적으로 다음과 같습니다.
... cdk deploy <stack filter> ...
워크플로의 일부로 리팩터링을 포함하려는 경우 기본 예제는 다음과 같습니다.
... cdk refactor <stack filter> cdk deploy <stack filter> ...
파이프라인에서 별도의 단계로 리팩터링을 사용할 수도 있습니다.
- 리팩터링 실패 처리
-
코드에 리팩터링과 함께 실제 리소스 수정이 포함된 경우
cdk refactor
가 실패합니다. 파이프라인에서 리팩터링을 자동으로 호출하므로 잠재적 장애를 처리해야 합니다.# Allow refactoring to fail but continue the pipeline cdk refactor <stack filter> || true cdk deploy <stack filter>
또는 성공적인 리팩터링을 실행할 때까지 배포가 발생하지 않도록 할 수 있습니다.
# Only deploy if refactoring succeeds cdk refactor <stack filter> && cdk deploy <stack filter>
- CI/CD 환경 모범 사례
-
CI/CD 파이프라인에서 리팩터링을 효과적으로 사용하려면:
-
다른 변경 사항과 리팩터링 분리: 리팩터링 작업은 리소스 추가, 삭제 또는 수정과 분리되어야 합니다. 파이프라인에서 리팩터링을 위한 전용 커밋 및 배포를 고려해 보세요.
-
재정의 파일 적절한 사용: 재정의 파일은 CDK CLI에서만 모호성 사례를 해결하기 위한 대체 파일로 사용된다는 점을 이해합니다.
-
파이프라인
--force
에서 필요 없음: CI/CD 파이프라인과 같은 비대화형 환경에서 CDK 리팩터링 명령은 확인 메시지를 표시하지 않고 자동으로 진행됩니다.--force
옵션은 대화형 환경에서만 필요합니다.
-
관련 리소스
CDK CLI cdk refactor
명령의 옵션 및 인수에 대한 자세한 내용은 섹션을 참조하세요 cdk refactor
.
CDK Toolkit Library의 refactor
작업을 시작하려면 CDK Toolkit Library를 사용하여 프로그래밍 방식 작업 수행을 참조하세요.