AWS CDK 애플리케이션 배포 - AWS Cloud Development Kit (AWS CDK) v2

이는 AWS CDK v2 개발자 안내서입니다. 이전 CDK v1은 2022년 6월 1일에 유지 관리에 들어갔으며 2023년 6월 1일에 지원이 종료되었습니다.

AWS CDK 애플리케이션 배포

AWS Cloud Development Kit (AWS CDK) 배포는 AWS에서 인프라를 프로비저닝하는 프로세스입니다.

AWS CDK 배포 작동 방식

AWS CDK는 AWS CloudFormation 서비스를 활용하여 배포를 수행합니다. 배포하기 전에 CDK 스택을 합성합니다. 이렇게 하면 앱의 각 CDK 스택에 대한 CloudFormation 템플릿과 배포 아티팩트가 생성됩니다. 배포는 로컬 개발 시스템 또는 지속적 통합 및 지속적 전송(CI/CD) 환경에서 시작됩니다. 배포 중에 자산은 부트스트래핑된 리소스에 업로드되고 CloudFormation 템플릿은 CloudFormation에 제출되어 AWS 리소스를 프로비저닝합니다.

배포가 성공하려면 다음이 필요합니다.

  • AWS CDK Command Line Interface(AWS CDK CLI)에 유효한 권한이 제공되어야 합니다.

  • AWS 환경이 부트스트래핑되어야 합니다.

  • AWS CDK에서 자산을 업로드할 부트스트래핑된 리소스를 알아야 합니다.

CDK 배포를 위한 사전 요구 사항

AWS CDK 애플리케이션을 배포하려면 먼저 다음을 완료해야 합니다.

  • CDK CLI에 대한 보안 자격 증명을 구성합니다.

  • AWS 환경을 부트스트래핑합니다.

  • 각 CDK 스택에 대해 AWS 환경을 구성합니다.

  • CDK 앱을 개발합니다.

보안 자격 증명 구성

CDK CLI를 사용하여 AWS와 상호 작용하려면 로컬 시스템에서 보안 자격 증명을 구성해야 합니다. 지침은 AWS CDKCLI에 대한 보안 자격 증명 구성 단원을 참조하십시오.

AWS 환경 부트스트래핑

배포는 항상 하나 이상의 AWS 환경과 연결됩니다. 배포하려면 먼저 환경을 부트스트래핑해야 합니다. 부트스트래핑은 CDK가 배포를 수행하고 관리하는 데 사용하는 환경의 리소스를 프로비저닝합니다. 이러한 리소스에는 자산을 저장하고 관리하기 위한 Amazon Simple Storage Service(Amazon S3) 버킷과 Amazon Elastic Container Registry(Amazon ECR) 리포지토리가 포함됩니다. 개발 및 배포 중 권한을 제공하는 데 사용되는 AWS Identity and Access Management(IAM) 역할도 이러한 리소스에 포함됩니다.

AWS CDK Command Line Interface(AWS CDK CLI) cdk bootstrap 명령을 사용하여 환경을 부트스트래핑하는 것이 좋습니다. 필요한 경우 부트스트래핑을 사용자 지정하거나 환경에서 이러한 리소스를 수동으로 생성할 수 있습니다. 지침은 AWS CDK와 함께 사용할 환경을 부트스트래팅 단원을 참조하십시오.

AWS 환경 구성

스택이 배포되는 위치를 결정하기 위해 각 CDK 스택이 환경과 연결되어야 합니다. 지침은 AWS CDK와 함께 사용할 환경 구성 단원을 참조하십시오.

CDK 앱 개발

CDK 프로젝트 내에서 CDK 앱을 생성하고 개발합니다. 앱 내에서 CDK 스택을 하나 이상 생성합니다. 스택 내에서 AWS Construct 라이브러리로부터 구문을 가져오고 이를 사용하여 인프라를 정의합니다. 배포하려면 CDK 앱에 스택이 하나 이상 있어야 합니다.

CDK 앱 합성

합성을 수행하려면 CDK CLI cdk synth 명령을 사용하는 것이 좋습니다. 또한 cdk deploy 명령은 배포를 시작하기 전에 합성을 수행합니다. 그러나 cdk synth를 사용하면 배포를 시작하기 전에 CDK 앱을 검증하고 오류를 포착할 수 있습니다.

합성 동작은 CDK 스택에 대해 구성하는 스택 신디사이저에 의해 결정됩니다. 신디사이저를 구성하지 않으면 DefaultStackSynthesizer가 사용됩니다. 필요에 맞게 합성을 구성하고 사용자 지정할 수도 있습니다. 지침은 CDK 스택 합성 구성 및 수행 단원을 참조하십시오.

합성된 CloudFormation 템플릿이 환경에 성공적으로 배포되려면 환경 부트스트래핑 방식과 호환되어야 합니다. 예를 들어, CloudFormation 템플릿이 자산을 배포할 올바른 Amazon S3 버킷을 지정해야 합니다. 환경을 부트스트래핑하는 기본 방법을 사용하는 경우 기본 스택 신디사이저가 작동합니다. 부트스트랩 또는 합성을 사용자 지정하는 등 CDK 동작을 사용자 지정하는 경우 CDK 배포 동작이 달라질 수 있습니다.

앱 수명 주기

합성을 수행하면 앱 수명 주기라는 다음 단계를 통해 CDK 앱이 실행됩니다.

구성 또는 초기화

코드는 정의된 모든 구문을 인스턴스화한 다음 서로 연결합니다. 이 스테이지에서는 모든 구문(앱, 스택 및 자식 구문)이 인스턴스화되고 생성자 체인이 실행됩니다. 대부분의 앱 코드가 이 스테이지에서 실행됩니다.

준비

prepare 메서드를 구현한 모든 구문이 최종 수정 라운드에 참여하여 최종 상태를 설정합니다. 준비 단계는 자동으로 수행됩니다. 사용자는 이 단계의 피드백을 볼 수 없습니다. ‘준비’ 후크를 사용해야 하는 경우는 드물며 일반적으로 권장되지 않습니다. 작업 순서가 동작에 영향을 미칠 수 있으므로 이 단계에서 구문 트리를 변형할 때는 매우 주의해야 합니다.

이 단계에서는 구문 트리가 빌드되면 구성한 모든 측면도 적용됩니다.

검증

validate 메서드를 구현한 모든 구문은 올바르게 배포될 수 있는 상태인지 확인하기 위해 자체적으로 검증할 수 있습니다. 이 단계에서 검증에 실패하면 알림을 받게 됩니다. 일반적으로 가능한 한 빨리(보통 입력을 받는 즉시) 검증을 수행하고 최대한 빨리 예외를 발생시키는 것이 좋습니다. 조기에 검증을 수행하면 스택 트레이스가 더 정확해지고 코드가 계속 안전하게 실행될 수 있으므로 신뢰성이 향상됩니다.

합성

CDK 앱을 실행하는 마지막 스테이지입니다. 이는 app.synth()에 대한 직접 호출로 트리거되며 구문 트리를 통과하고 모든 구문에 대해 synthesize 메서드를 간접적으로 호출합니다. synthesize를 구현하는 구문은 합성에 참여하고 결과 클라우드 어셈블리에 배포 아티팩트를 생성할 수 있습니다. 이러한 아티팩트에는 CloudFormation 템플릿, AWS Lambda 애플리케이션 번들, 파일 및 Docker 이미지 자산, 기타 배포 아티팩트가 포함됩니다. 대부분의 경우 synthesize 메서드를 구현할 필요가 없습니다.

앱 실행

CDK CLI에서 CDK 앱을 실행하는 방법을 알아야 합니다. cdk init 명령을 사용하여 템플릿에서 프로젝트를 생성한 경우 앱의 cdk.json 파일에 app 키가 포함됩니다. 이 키는 앱이 작성된 언어에 필요한 명령을 지정합니다. 언어에 컴파일이 필요한 경우 명령줄은 앱을 자동으로 실행하기 전에 이 단계를 수행합니다.

TypeScript
{ "app": "npx ts-node --prefer-ts-exts bin/my-app.ts" }
JavaScript
{ "app": "node bin/my-app.js" }
Python
{ "app": "python app.py" }
Java
{ "app": "mvn -e -q compile exec:java" }
C#
{ "app": "dotnet run -p src/MyApp/MyApp.csproj" }
Go
{ "app": "go mod download && go run my-app.go" }

CDK CLI를 사용하여 프로젝트를 생성하지 않았거나 cdk.json에 지정된 명령줄을 재정의하려면 cdk 명령을 실행할 때 --app 옵션을 제공할 수 있습니다.

$ cdk --app 'executable' cdk-command ...

명령의 실행 가능 부분은 CDK 애플리케이션 실행을 위해 실행해야 하는 명령을 나타냅니다. 이러한 명령에는 공백이 포함되어 있으므로 표시된 대로 따옴표를 사용합니다. cdk-commandsynthdeploy와 같은 하위 명령으로, 앱에서 수행하려는 작업을 CDK CLI에 알려줍니다. 해당 하위 명령에 필요한 옵션을 뒤에 추가합니다.

CDK CLI는 이미 합성된 클라우드 어셈블리와 직접 상호 작용할 수도 있습니다. 이를 위해 --app에 클라우드 어셈블리가 저장되는 디렉터리를 전달합니다. 다음 예에서는 ./my-cloud-assembly 아래에 저장된 클라우드 어셈블리에 정의된 스택을 나열합니다.

$ cdk --app ./my-cloud-assembly ls

클라우드 어셈블리

app.synth()에 대한 직접 호출은 AWS CDK에 앱에서 클라우드 어셈블리를 합성하라고 지시합니다. 일반적으로 클라우드 어셈블리와 직접 상호 작용하지 않습니다. 클라우드 어셈블은 클라우드 환경에 앱을 배포하는 데 필요한 모든 것이 포함된 파일입니다. 예를 들어 앱의 각 스택에 대한 AWS CloudFormation 템플릿이 포함됩니다. 또한 앱에서 참조하는 모든 파일 자산 또는 Docker 이미지의 사본이 포함됩니다.

클라우드 어셈블리 형식 지정 방법에 대한 자세한 내용은 클라우드 어셈블리 사양을 참조하세요.

AWS CDK 앱이 생성하는 클라우드 어셈블리와 상호 작용하려면 일반적으로 AWS CDK CLI를 사용합니다. 그러나 클라우드 어셈블리 형식을 읽을 수 있는 모든 도구를 사용하여 앱을 배포할 수 있습니다.

애플리케이션 배포

애플리케이션을 배포하려면 CDK CLI cdk deploy 명령을 사용하여 배포를 시작하거나 자동 배포를 구성하는 것이 좋습니다.

cdk deploy를 실행하면 CDK CLI가 cdk synth를 시작하여 배포를 준비합니다. 다음 다이어그램은 배포의 맥락에서 앱 수명 주기를 보여줍니다.

AWS CDK 앱 수명 주기의 흐름도입니다.

배포 중 CDK CLI는 합성으로 생성된 클라우드 어셈블리를 가져와 AWS 환경에 배포합니다. 자산은 Amazon S3와 Amazon ECR에 업로드되고 CloudFormation 템플릿은 배포를 위해 AWS CloudFormation에 제출됩니다.

AWS CloudFormation 배포 단계가 시작될 때쯤이면 CDK 앱이 이미 실행을 마치고 종료된 상태입니다. 이는 다음과 같은 의미를 가집니다.

  • CDK 앱은 리소스 생성이나 전체 배포 완료 등 배포 중 발생하는 이벤트에 응답할 수 없습니다. 배포 단계에서 코드를 실행하려면 AWS CloudFormation 템플릿에 사용자 지정 리소스로 코드를 삽입해야 합니다. 앱에 사용자 지정 리소스를 추가하는 방법에 대한 자세한 내용은 AWS CloudFormation 모듈 또는 사용자 지정 리소스 예를 참조하세요. 배포 중 코드를 실행하도록 트리거 모듈을 구성할 수도 있습니다.

  • CDK 앱은 실행 시점에는 알 수 없는 값으로 작업해야 할 수도 있습니다. 예를 들어 AWS CDK 앱이 자동으로 생성된 이름으로 Amazon S3 버킷을 정의하고 bucket.bucketName(Python: bucket_name) 속성을 검색하는 경우 해당 값은 배포된 버킷의 이름이 아닙니다. 대신 Token 값을 가져옵니다. 특정 값을 사용할 수 있는지 확인하려면 cdk.isUnresolved(value)(Python: is_unresolved)를 직접적으로 호출합니다. 세부 정보는 토큰 및 AWS CDK를 참조하세요.

배포 권한

배포를 수행하려면 먼저 권한을 설정해야 합니다. 다음 다이어그램은 기본 부트스트래핑 프로세스와 스택 신디사이저를 사용할 때 기본 배포 중 사용되는 권한을 보여줍니다.

기본 AWS CDK 배포 프로세스의 흐름도입니다.
액터가 배포 시작

배포는 CDK CLI를 사용하여 액터에 의해 시작됩니다. 액터는 사람 또는 AWS CodePipeline과 같은 서비스일 수 있습니다.

필요한 경우 cdk deploy를 실행할 때 CDK CLI가 cdk synth를 실행합니다. 합성 중 AWS ID가 AWS 환경에서 컨텍스트 조회를 수행하기 위해 LookupRole을 수임합니다.

권한이 설정됨

첫째, 액터의 보안 ID는 AWS에 인증하고 프로세스에서 첫 번째 IAM ID를 얻는 데 사용됩니다. 인적 액터의 경우 보안 자격 증명이 구성되고 획득되는 방법은 사용자나 조직이 사용자를 관리하는 방식에 따라 달라집니다. 자세한 내용은 AWS CDKCLI에 대한 보안 자격 증명 구성 단원을 참조하십시오. CodePipeline과 같은 서비스 액터의 경우 IAM 실행 역할이 수임되고 사용됩니다.

다음으로 부트스트래핑 중 AWS 환경에서 생성된 IAM 역할은 배포에 필요한 작업을 수행할 수 있는 권한을 설정하는 데 사용됩니다. 이러한 역할과 해당 역할이 권한을 부여하는 대상에 대한 자세한 내용은 부트스트래핑 중 생성된 IAM 역할 섹션을 참조하세요. 이 프로세스에는 다음이 포함됩니다.

  • AWS ID는 DeploymentActionRole 역할을 수임하고 CloudFormationExecutionRole 역할을 CloudFormation에 전달하여 CloudFormation이 AWS 환경에서 작업을 수행할 때 해당 역할을 수임하도록 합니다. DeploymentActionRole은 환경에 배포를 수행할 수 있는 권한을 부여하고 CloudFormationExecutionRole은 CloudFormation이 수행할 수 있는 작업을 결정합니다.

  • AWS ID는 부트스트래핑 중 생성된 Amazon S3 버킷에서 수행할 수 있는 작업을 결정하는 FilePublishingRole을 수임합니다.

  • AWS ID는 부트스트래핑 중 생성된 Amazon ECR 리포지토리에서 수행할 수 있는 작업을 결정하는 ImagePublishingRole을 수임합니다.

  • 필요한 경우 AWS ID가 AWS 환경에서 컨텍스트 조회를 수행하기 위해 LookupRole을 수임합니다. 이 작업은 템플릿 합성 중에도 수행될 수 있습니다.

배포가 수행됨

배포 중 CDK CLI는 부트스트랩 버전 파라미터를 읽어 부트스트랩 버전 번호를 확인합니다. AWS CloudFormation도 배포 시 이 파라미터를 읽어 확인합니다. 배포 워크플로 전반의 권한이 유효한 경우 배포가 수행됩니다. 자산은 부트스트래핑된 리소스에 업로드되고, 합성 시 생성된 CloudFormation 템플릿은 CloudFormation 스택으로 CloudFormation 서비스를 사용하여 리소스를 프로비저닝해서 배포됩니다.