CDK
1 AWS CDK (Cloud Development Kit)
- AWS CDK는 클라우드 인프라를 코드로 정의하고 프로비저닝할 수 있게 해주는 오픈 소스 소프트웨어 개발 프레임워크입니다.
- CDK를 사용하면 친숙한 프로그래밍 언어를 사용하여 클라우드 리소스를 정의할 수 있습니다.
- CDK는 정의된 리소스를 AWS CloudFormation 템플릿으로 변환하여 실제 인프라를 생성합니다.
2 CDK의 주요 특징
- 다양한 프로그래밍 언어 지원: TypeScript, JavaScript, Python, Java, C#/.NET, Go 등을 지원합니다.
- 높은 수준의 추상화: 복잡한 인프라 구성을 간단한 코드로 표현할 수 있습니다.
- 재사용성: 컴포넌트를 모듈화하여 재사용할 수 있습니다.
- 유연성: 필요에 따라 로우 레벨 CloudFormation 구성과 혼합하여 사용할 수 있습니다.
- 타입 안정성: 정적 타입 언어를 사용할 경우, 컴파일 시점에 많은 오류를 잡을 수 있습니다.
3 CDK의 주요 개념
3.1 CDK Constructs
- CDK Construct는 최종 CloudFormation 스택을 생성하는 데 필요한 모든 것을 캡슐화한 컴포넌트입니다.
- 단일 AWS 리소스(예: S3 버킷)부터 여러 관련 리소스(예: 작업자 대기열과 컴퓨팅)까지 다양한 수준을 표현할 수 있습니다.
- AWS Construct Library는 CDK에 포함된 Construct 모음으로, 모든 AWS 리소스에 대한 Construct를 포함합니다.
- Construct Hub에는 AWS, 타사 및 오픈 소스 CDK 커뮤니티의 추가 Construct가 포함되어 있습니다.
3.1.1 Layer 1 Constructs (L1)
- CFN Resources라고도 불리며, CloudFormation에서 직접 사용 가능한 모든 리소스를 나타냅니다.
- CloudFormation 리소스 사양에서 주기적으로 생성됩니다.
- Construct 이름은 Cfn으로 시작합니다(예: CfnBucket).
- 모든 리소스 속성을 명시적으로 구성해야 합니다.
예시 코드
import * as s3 from 'aws-cdk-lib/aws-s3';
const myBucket = new s3.CfnBucket(this, 'MyBucket', {
bucketName: 'my-bucket-name',
versioning: {
status: 'Enabled'
}
});
3.1.2 Layer 2 Constructs (L2)
- AWS 리소스를 나타내지만 더 높은 수준의 intent-based API를 제공합니다.
- L1과 유사한 기능을 제공하지만 편리한 기본값과 boilerplate 코드가 포함되어 있습니다.
- 리소스 속성에 대한 모든 세부 사항을 알 필요가 없습니다.
- 리소스 작업을 더 간단하게 만드는 메서드를 제공합니다
- 예:bucket.addLifeCycleRule()
예시 코드
import * as s3 from 'aws-cdk-lib/aws-s3';
const myBucket = new s3.Bucket(this, 'MyBucket', {
bucketName: 'my-bucket-name',
versioned: true,
encryption: s3.BucketEncryption.S3_MANAGED,
removalPolicy: cdk.RemovalPolicy.DESTROY
});
myBucket.addLifecycleRule({
expiration: cdk.Duration.days(90)
});
3.1.3 Layer 3 Constructs (L3)
- Patterns라고도 불리며, 여러 관련 리소스를 나타냅니다.
- AWS에서 일반적인 작업을 완료하는 데 도움이 됩니다.
- 복잡한 아키텍처나 패턴을 단일 Construct로 추상화합니다.
예시
- aws-apigateway.LambdaRestApi: Lambda 함수로 지원되는 API Gateway를 나타냅니다.
- aws-ecs-patterns.ApplicationLoadBalancerFargateService: Application Load Balancer가 있는 Fargate 클러스터를 포함하는 아키텍처를 나타냅니다.
예시 코드
import * as apigateway from 'aws-cdk-lib/aws-apigateway';
import * as lambda from 'aws-cdk-lib/aws-lambda';
const helloFunction = new lambda.Function(this, 'HelloHandler', {
runtime: lambda.Runtime.NODEJS_14_X,
handler: 'hello.handler',
code: lambda.Code.fromAsset('lambda')
});
new apigateway.LambdaRestApi(this, 'HelloApi', {
handler: helloFunction
});
3.2 Stack
- Stack은 CDK의 배포 단위입니다.
- 하나 이상의 Construct를 포함하며, CloudFormation 스택으로 변환됩니다.
- 여러 Stack을 조합하여 복잡한 아키텍처를 구성할 수 있습니다.
- 각 Stack은 독립적으로 배포, 업데이트, 삭제될 수 있습니다.
예시 코드
import * as cdk from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
export class MyStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
new s3.Bucket(this, 'MyBucket', {
versioned: true,
encryption: s3.BucketEncryption.S3_MANAGED,
removalPolicy: cdk.RemovalPolicy.DESTROY
});
}
}