Amazon Web Services 한국 블로그

[AWS Heroes 특집] AWS CDK를 통한 인프라 운영 개선 방법

이 글은 AWS 컨테이너 히어로인 Philipp Garbe 가 기고하셨습니다. Philipp 는 독일의 Scout24에서 책임 플랫폼 엔지니어로 근무하고 있습니다. 더 많은 제품을 더 빠르게 출시하는 데 도움이 되는 기술과 도구를 주로 사용하며, 모든 커밋이 자동으로 프로덕션 환경에 적용될 수 있도록 합니다. Twitter(@pgarbe)에서 Philipp 를 만나볼 수 있습니다.

지난 몇 년 동안 많은 팀이 IaC(Infrastructure as Code)를 채택했습니다. IaC는 인프라를 손쉽게 프로비저닝하고 환경을 일관적으로 유지하는 데 도움이 됩니다.

그러나 선언적 템플릿을 사용하는 경우에도 “일반” 코드에서 익숙하게 사용하던 여러 방법이 편하게 느껴질 수 있습니다. 여러분 중 일부는 AWS CloudFormation 템플릿이 이전 프로젝트 또는 StackOverflow의 복사 후 붙여넣기에 불과하다는 문제점을 이미 느꼈을 것입니다. 또한 이러한 코드 조각의 신뢰성을 확인하는 방법, 코드베이스를 통해 개선 또는 보안 수정 사항을 일관적으로 적용하는 방법, 회사 또는 커뮤니티에서 모범 사례를 공유하는 방법을 알고 싶으셨을 것입니다.

다행히, 이 모든 문제점과 궁금증을 해결하기 위해 AWS에서 AWS CloudFormation의 중요한 추가 기능인 AWS CDK(AWS 클라우드 개발 키트)의 베타 버전을 게시했습니다.

AWS CDK가 중요한 이유

이제 올바른 AWS CloudFormation 템플릿을 작성하는 방법에 대한 모든 모범 사례를 회사 또는 개발자 커뮤니티에서 손쉽게 공유할 수 있습니다. 뿐만 아니라 다른 이들이 공유하는 모범 사례를 활용할 수도 있습니다.

예를 들어 Amazon DynamoDB의 경우 AWS CloudFormation에서 손쉽게 설정할 수 있습니다. 템플릿에 행 몇 개만 추가하면 됩니다. 그러나 이미 프로덕션 환경에 있는 경우에는 Auto Scaling, 정규 백업 및 모든 관련 지표에 대한 경보를 설정해야 합니다. 그러면 템플릿의 행이 수백 개로 늘어날 수 있습니다.

만일 DynamoDB 데이터베이스를 필요로 하는 또 다른 애플리케이션을 생성해야 한다면, 이 모든 YAML 코드를 복사 후 붙여넣으시겠습니까? 나중에 템플릿에서 버그가 발견되면 어떻게 합니까? 두 코드베이스 모두에 수정 사항을 적용합니까?

AWS CDK를 사용하면 프로덕션용 DynamoDB 데이터베이스 모범 사례에 대한 “구문”을 작성할 수 있습니다. 그런 다음 npm 패키지로 회사의 동료를 비롯한 모든 사용자와 공유할 수 있습니다.

AWS CDK란?

먼저, AWS CDK가 무엇인지를 알아보도록 하겠습니다. YAML(또는 JSON)의 선언적 접근 방식과 달리 CDK를 사용하면 인프라를 명령적으로 선언할 수 있습니다. 기본 언어는 TypeScript이지만 다수의 다른 언어도 지원됩니다.

다음은 Hello, AWS CDK!의 Hello World 예제입니다.

import cdk = require('@aws-cdk/cdk');
import s3 = require('@aws-cdk/aws-s3');

class MyStack extends cdk.Stack {
constructor(parent: cdk.App, id: string, props?: cdk.StackProps) {
super(parent, id, props);

new s3.Bucket(this, 'MyFirstBucket', {
versioned: true
});
}
}

class MyApp extends cdk.App {
constructor(argv: string[]) {
super(argv);

new MyStack(this, 'hello-cdk');
}
}

new MyApp().run();

은 기본 구문이며 CDK CLI에서 직접 사용하여 AWS CloudFormation 템플릿을 렌더링하고 배포할 수 있습니다.

앱은 배포 가능한 단위인 하나 이상의 스택으로 구성되며 리전 및 계정에 대한 정보를 포함합니다. 동시에 여러 리전에 서로 다른 스택을 배포하는 앱을 작성할 수 있습니다.

스택에는 DynamoDB 테이블 또는 AWS Lambda 함수 같은 AWS 리소스를 표현하는 구문이 포함됩니다.

라이브러리는 일반적으로 추가 구문을 캡슐화하는 구문입니다. 라이브러리를 사용하면 상위 클래스의 구문을 작성하고 재사용할 수 있습니다. 구문은 TypeScript(또는 다른 모든 지원되는 언어)이므로 패키지를 작성한 후 패키지 관리자를 통해 공유할 수 있습니다.

구문

이제 CDK에서 가장 중요한 구문에 대해 살펴보겠습니다. 구문은 구문 트리라고 하는 계층 구조입니다. 구문은 세 가지 레벨에서 설명될 수 있습니다.

레벨 1: AWS CloudFormation 리소스

기존 리소스의 1대1 매핑이며 자동으로 생성됩니다. 현재 YAML에서 사용하는 리소스와 동일합니다. 이상적으로는 이러한 구문을 직접 처리할 필요가 없습니다.

레벨 2: AWS 구문 라이브러리

이러한 구문은 AWS 서비스 레벨에 위치합니다. AWS가 직접 작성한 구문으로, AWS의 의견이 반영되어 있고, 올바른 아키텍처로 설계되어 있습니다. 적절한 기본값이 설정되어 있으므로 세부 정보에 대한 큰 고민 없이 손쉽게 AWS 리소스를 생성할 수 있습니다.

예를 들어 모든 가용 영역에 프라이빗 및 퍼블릭 서브넷을 갖춘 완전한 VPC를 생성하는 방법은 다음과 같습니다.

import ec2 = require('@aws-cdk/aws-ec2');

const vpc = new ec2.VpcNetwork(this, 'VPC');

AWS 구문 라이브러리에는 최소 권한 IAM 정책, 이벤트 기반 API 작업, 보안 그룹 및 지표라는 유용한 개념이 있습니다. 예를 들어 IAM 정책은 사용자의 의도에 따라 자동으로 생성됩니다. Lambda 함수에서 SNS 주제를 구독하면 해당 주제에서 함수를 호출할 수 있도록 하는 정책이 생성됩니다.

Amazon CloudWatch 지표를 제공하는 AWS 서비스에는 metricXxx() 같은 함수가 포함되며 이러한 서비스가 반환하는 지표 객체를 손쉽게 사용해 경보를 생성할 수 있습니다.

new Alarm(this, 'Alarm', {
metric: fn.metricErrors(),
threshold: 100,
evaluationPeriods: 2,
});

자세한 내용은 AWS 구문 라이브러리를 참조하십시오.

레벨 3: 회사의 직원

여기서부터가 재미있는 부분입니다. 앞서 말씀드렸듯이 구문은 계층 구조입니다. 구문은 다른 구문을 기반으로 하는 상위 레벨의 추상화일 수 있습니다. 예를 들어 이 레벨에서는 자동 노드 드레이닝, Auto Scaling 및 적합한 모든 경보를 포함하는 자체 Amazon ECS 클러스터 구문을 작성할 수 있습니다. 또는 Amazon RDS 데이터베이스가 모니터링해야 하는 모든 필수 경보에 대한 구문을 작성해도 됩니다. 생성한 구문은 자유롭게 공유할 수 있습니다.

결론

다행히 AWS는 초기 단계에서 CDK를 공개했습니다. 설명서는 이미 훌륭하지만 모든 항목이 다뤄진 것은 아닙니다. 일부 AWS 서비스의 경우 AWS 구문 라이브러리 모듈(레벨 2)이 정의되지 않았으며 순수한 AWS CloudFormation 구문(레벨 1)만 있는 경우가 많습니다.

개인적으로, AWS CDK는 AWS CloudFormation 코드를 재사용하고 다른 이와 공유할 수 있는 기능을 제공한다는 점에서 큰 발전이라고 생각합니다. 회사의 표준을 손쉽게 적용할 수 있을 뿐 아니라 공동으로 멋진 기능을 개발할 수 있으며 “지루한” 코드를 작성하는 데 소요되는 시간을 줄여줍니다.

– Philipp Garbe;