AWS CDK 시작하기

시작 안내서

모듈 3: 처음으로 CDK 프로젝트 생성

이 모듈에서는 AWS Cloud Development Kit(CDK)를 사용하여 인프라를 생성합니다.

소개

이 안내서에서 TypeScript를 사용하여 새 인프라 프로젝트를 생성하기 위해 사용됩니다. 또한 간단한 리소스를 작성하는 방법과, CDK 코드를 합성 및 배포하는 방법에 대해 알아봅니다. 동기화는 CDK가 인프라 코드를 AWS CloudFormation 템플릿으로 전환하는 방식입니다.

배우게 될 내용

  • TypeScript로 새 CDK 프로젝트 생성하기.
  • CDK(VPC)에서 단순 리소스 작성하기.
  • CloudFormation 템플릿에 CDK 코드 동기화하기.
  • AWS 계정에 인프라 배포하기.

 완료 시간

15분

 모듈 선행 조건

  • 관리자 수준의 액세스 권한이 있는 AWS 계정**
  • 권장 브라우저: 최신 버전의 Chrome 또는 Firefox

[**]생성된 지 24시간이 지나지 않은 계정은 이 자습서를 완료하는 데 필요한 서비스에 액세스할 권한이 아직 없을 수 있습니다.

구현

새 CDK 프로젝트 만들기

새 CDK 프로젝트를 생성하기 위해 CDK CLI를 사용합니다. 시작하려면 시스템에 빈 디렉터리를 생성하고 이 디렉터리로 변경합니다. 이제 cdk init를 사용하여 새 TypeScript CDK 프로젝트를 생성합니다.

mkdir cdk-demo
cd cdk-demo
cdk init --language typescript

폴더 구조를 생성하고 TypeScript CDK 프로젝트에 필요한 일부 모듈을 설치합니다. 다음과 같은 출력이 표시되어야 합니다.

Applying project template app for typescript
# Welcome to your CDK TypeScript project!

This is a blank project for TypeScript development with CDK.

The `cdk.json` file tells the CDK Toolkit how to execute your app.

## Useful commands

 * `npm run build`   compile typescript to js
 * `npm run watch`   watch for changes and compile
 * `npm run test`    perform the jest unit tests
 * `cdk deploy`      deploy this stack to your default AWS account/region
 * `cdk diff`        compare deployed stack with current state
 * `cdk synth`       emits the synthesized CloudFormation template

Initializing a new git repository...
Executing npm install...
npm WARN deprecated urix@0.1.0: Please see https://github.com/lydell/urix#deprecated
npm WARN deprecated resolve-url@0.2.1: https://github.com/lydell/resolve-url#deprecated
npm WARN deprecated sane@4.1.0: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added
npm notice
npm notice New minor version of npm available! 7.19.0 -> 7.20.1
npm notice Changelog: https://github.com/npm/cli/releases/tag/v7.20.1
npm notice Run npm install -g npm@7.20.1 to update!
npm notice
✅ All done!

또한 CDK 프로젝트를 시작하기 위해 필요한 명령도 제공합니다. 이제 첫 CDK 코드를 작성하여 인프라를 생성할 준비가 되었습니다.

인프라 생성

프로젝트 구축을 시작하려면 일반적으로 사용자가 정의하는 논리적으로 분리된 가상 네트워크를 생성하는 것부터 시작하는 게 좋습니다. 이를 Amazon Virtual Private Cloud(VPC)라고 합니다. 첫 VPC를 생성하기에 앞서 cdk init 명령이 생성한 파일에 대해 이해해야 합니다.

CDK 애플리케이션 구축 및 배포

├── bin
│   └── cdk-demo.ts
├── cdk.json
├── jest.config.js
├── lib
│   └── cdk-demo-stack.ts
├── package.json
├── package-lock.json
├── README.md
├── test
│   └── cdk-demo.test.ts
└── tsconfig.json

다음은 일부 중요 파일과 해당 파일의 사용 목적입니다.

  • bin/cdk-project.ts - CDK 애플리케이션에 대한 진입 포인트입니다. lib/* 하위에 정의한 모든 스택을 로드/생성합니다.
  • lib/cdk-project-stack.ts - 주요 CDK 애플리케이션이 정의되는 지점입니다. 리소스 및 그 속성이 여기로 이동할 수 있습니다.
  • package.json - 프로젝트 종속 파일, 그리고 일부 추가 정보를 정의하고 스크립트를 구축하는 지점입니다(npm buildnpm testnpm watch).
  • cdk.json - 이 파일은 애플리케이션은 물론 CDK 및 프로젝트에 관련된 일부 추가 설정 및 파라미터를 실행하는 방법에 대한 도구 키트를 알려줍니다.

이 안내서에서는 lib/cdk-demo.ts 및 bin/cdk-demo.ts 파일에 집중하여 인프라를 생성합니다. 몇 가지 코드를 추가하도록 합니다.

애플리케이션에서 몇 가지 정의하기

주요 스택에 VPC를 정의하기 전에 적절한 계정 및 리전에 배포하는 것인지 확인해야 합니다. CDK가 이 정보를 사용자의 로컬 aws cli 구성에서 가져올 것입니다. 구성 변경 시 잘못된 값을 방지하려면 CDK 코드에서 수동으로 구성하는 것이 가장 좋습니다. 이 안내서의 경우 VPC에서 정의할 설정 때문에 그렇게 할 필요가 있습니다. 이 값을 지정하지 않으면 스택은 환경에 구애받지 않겠지만 일부 기능 및 컨텍스트 검색이 작동하지 않을 것입니다. 자세한 내용은 설명서의 환경을 참조하십시오.

bin/cdk-demo.ts 스택을 이런 식으로 변형합니다. AWS 계정 ID를 적절한 숫자로 바꾸고, 적절한 리전을 선택합니다. 이 안내서의 경우 us-east-1 또는 eu-west-1를 선택하기를 권장합니다.

#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from '@aws-cdk/core';
import { CdkDemoStack } from '../lib/cdk-demo-stack';

const app = new cdk.App();
new CdkDemoStack(app, 'CdkDemoStack', {
  env: { account: '123456789012', region: 'eu-west-1' },

});

이제 첫 리소스를 작성할 준비가 되었습니다.

VPC용 코드

두 개의 퍼블릭 서브넷이 있는 VPC를 두 개의 가용성 영역에 걸쳐 분산되도록 생성할 것입니다. 코드 작성을 본격적으로 수행하기에 앞서 구축 라이브러리 모듈에 대해 설명하고 이를 설치해야 합니다. 프로비저닝 중인 인프라에 필요한 종속성만 추가할 수 있도록 여러 서비스가 모듈로 패키지되어 있습니다. 모듈은 단일 서비스에 대한 것(예: AWS Amplify) 또는 여러 서비스에 대한 것(예: Amazon EC2)이 있습니다. 이 안내서에서는 AWS VPC에 대한 지원도 포함하는 Amazon EC2 모듈이 필요합니다.

모듈을 설치하기 위해 npm을 사용합니다. 프로젝트 디렉터리에 있는 동안 다음 명령을 실행합니다.

npm install @aws-cdk/aws-ec2

이렇게 하면 작업에 필요한 모든 모듈이 설치됩니다. package.json 내부를 확인하면, 거기에도 설치되어 있음을 볼 수 있습니다.

이제 VPC를 생성할 준비가 되었습니다. lib/cdk-demo.ts에서 스택 정의를 엽니다. 파일을 처음 열 때는 다음과 같은 내용이 표시되어야 합니다.

import * as cdk from '@aws-cdk/core';

export class CdkDemoStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
  }
}

이것이 프로젝트의 뼈대입니다. CDK를 지금 실행한다면, 아직 정의하지 않았으므로 리소스가 생성되지 않습니다. VPC를 시작하려면 설치된 모듈을 가져와 그 안에 있는 코드 모듈을 참조해야 합니다. VPCSubnetType 클래스를 임포트할 것입니다.

import * as cdk from '@aws-cdk/core';

// CHANGE: This is where you import the classes from the module:
import { Vpc, SubnetType } from '@aws-cdk/aws-ec2';

export class CdkDemoStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
  }
}

VPC를 생성하면 거기에는 필요에 따라 맞춰서 설정할 수 있는 많은 속성이 있습니다. 기본적으로 3개의 가용 영역(AZ) 전반에 퍼블릭 및 프라이빗 서브넷을 포함하는 VPC를 생성합니다(단일 인터넷 게이트웨이 및 3개의 NAT 게이트웨이). 이 안내서서는 각각 퍼블릭 서브넷을 포함하고 있는 AZ 2개 범위의 아주 단순한 설정만을 생성하고자 합니다. 차이점에 대한 보다 자세한 설명이 필요하다면 이 설명서를 참조하십시오. 

VPC를 생성하기 위해 두 개의 AZ와 세부 정보를 지정하여 아래에 보이는 퍼블릭 서브넷을 생성합니다.

import * as cdk from '@aws-cdk/core';
import { Vpc, SubnetType } from '@aws-cdk/aws-ec2';

export class CdkDemoStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
    // CHANGE: We have created the vpc object from the Vpc class.
    const vpc = new Vpc(this, 'MainVpc',{
    
    // CHANGE: this is where we define how many AZs to use
    maxAzs: 2,
      
   // CHANGE: We define a single subnet configuration per AZ.
      subnetConfiguration:  [
        {
          // CHANGE: this is it's CIDR mask so 255.255.255.0
          cidrMask: 24,

          // CHANGE: a name for each of these subnets
          name: 'public-subnet',

          // CHANGE: and the subnet type to be used - here we will have
          // a public subnet. There are other options available here.
          subnetType: SubnetType.PUBLIC
        },
      ]
    });
  }
}

이제 이 인프라 변경을 계정에 배포할 준비가 되었습니다.

배포 시간

배포를 테스트할 시간입니다. 코드가 유효한지 확인하기 위해 TypeScript를 JavaScript로 컴파일할 npm 구축을 실행할 수 있습니다. 성공적이라면 배포 명령을 실행할 수 있습니다.

cdk deploy

그러면 사용자의 TypeScript가 JavaScript로 컴파일되고, 이 변경 사항을 배포하기 위해 CloudFormation 변경 집합이 생성됩니다. CDK는 사용자에 대한 이 모든 것을 관리하며, 템플릿 파일을 S3에 업로드하고 CloudFormation을 사용하여 실행합니다. 다음과 유사한 출력이 표시되어야 합니다.

# cdk deploy
CdkDemoStack: deploying...
CdkDemoStack: creating CloudFormation changeset...
[··························································] (0/13)

3:50:17 PM | CREATE_IN_PROGRESS   | AWS::CloudFormation::Stack            | CdkDemoStack
3:50:21 PM | CREATE_IN_PROGRESS   | AWS::EC2::InternetGateway             | MainVpc/IGW
3:50:21 PM | CREATE_IN_PROGRESS   | AWS::EC2::VPC                         | MainVpc
3:50:22 PM | CREATE_IN_PROGRESS   | AWS::CDK::Metadata                    | CDKMetadata/Default

몇 분 후 새롭게 생성한 CloudFormation 스택의 ARN(Amazon 리소스 이름) 옆에 녹색 체크 표시가 생겨야 합니다. 이제 새 VPC가 배포되었으며 사용할 준비가 되었습니다.

리소스 정리(선택)

이 안내서에서 생성한 VPC는 월별 요금이 부과되지 않으나, 계정의 각 리전으로 5개의 VPC만 허용하도록 제한하는 할당량이 존재합니다. 지원 티켓을 통해 필요 시 이 한도를 높일 수 있습니다. 새로 생성한 리소스를 제거하고 싶다면, cdk destroy 명령을 실행할 수 있습니다. 그러면 CloudFormation 스택을 통해 앞서 생성한 모든 리소스가 제거됩니다.

cdk destroy

아래의 메시지를 받아야 합니다. y를 누르고 엔터 키를 누르면 모든 인프라가 제거되기 시작하고 업데이트가 제공됩니다. 완료하면 다음을 볼 수 있습니다.

Are you sure you want to delete: CdkEcsInfraStack (y/n)? y
CdkEcsInfraStack: destroying...

✅  CdkEcsInfraStack: destroyed

결론

축하합니다! AWS CDK 시작 안내서를 완료했습니다. 이 안내서에서는 VPC를 생성하여 첫 TypeScript의 AWS CDK 프로젝트를 생성했습니다. 새 CDK 프로젝트를 초기화하는 방법과 이를 사용하여 이 인프라를 생성하는 방법을 다뤘습니다. 이 CDK 코드 및 VPC는 향후 안내서에서 사용될 것이며, 첫 웹 애플리케이션 배포 방법에 대한 안내서로 보시길 권장합니다. 

폴더 구조, 구성, 스택 및 앱과 같은 개념에 대해 자세히 알아보려면 설명서를 참조하십시오. 

내용이 마음에 드셨는지요.

피드백을 제공해 주셔서 감사합니다.
이 페이지가 도움이 되어 기쁩니다. 지속적인 개선에 도움이 되는 추가 세부 정보를 공유해 주시겠습니까?
닫기
피드백을 제공해 주셔서 감사합니다.
이 페이지가 도움이 되지 못해 죄송합니다. 지속적인 개선에 도움이 되는 추가 세부 정보를 공유해 주시겠습니까?
닫기