728x90

"cdk 사용경험이 있으신가요?" 

최근 데이터 엔지니어 직무로 전환 이직을 하며 들었던 가장 난감했던 면접 질문이였다.

 

"그게 뭐죠?"

"그럼 Iac가 뭔지 아시나요?"

"인프라 애즈 코드,,,? 몰라요 죄송합니다."

"..."

이랬는데 합격을 했고 현재 불티나게 cdk를 만지고 있는 잡부 엔지니어 입니다.

이글을 읽는 여러분, cdk에 대해서 어느정도 뭔지 알고 들어오셨을거라 생각합니다.

이참에 한번 느껴보고 갑시다.

 


Iac가 뭔지 아시나요?

 

질문에 대해서 저처럼 답변을 했다면, 진정 그 스택의 필요성을 느끼기 힘들것이라 생각합니다.

뭐든 새로운 기술을 접했을때 진정으로 제것으로 만들기 위해서는 특정 상황에서 결핍 또는 불편함을 느껴야합니다.

 

예를들어 봅시다.



사이드 프로젝트 진행간 대부분 비슷한 환경인 ec2, rds, s3 연동간 이전과 동일한 환경을 구성하는 와중 일부 환경을 실수로 다르게 세팅하거나 반복 작업 자체에 대한 불편함을 느껴본 경험이 있으신가요?

 

이런 상황 속 해결책이 바로 Iac입니다.

 

Infra as code: 코드로 인프라를 정의한다.

 

"한번 잘작성한 코드는 십년은 간다" (feat.코린이형준) 라는 유명한말이있죠.

 

위에서 정의했던 문제인 동일한 환경이지만 새로운 프로젝트 시마다 계속해서 재구성해야하는 이러한 상황을 방지하고 뿐만아니라 기존의 복잡한 세팅도 실수 하지 않고 동일하게 세팅할 수 있도록 도와주는것이 "Iac"입니다. 

 


그럼, aws cdk 가 뭔지 아시나요?

자, 여기서 한가지 확인하고 가야할 친구가 있습니다.

 

바로, 한번 쯤은 들어봤을법한 "Terraform" 바로 이구역의 강자입니다.

resource "aws_vpc" "main" {
  cidr_block = var.base_cidr_block
}


<BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {
  # Block body
  <IDENTIFIER> = <EXPRESSIONS> # Argument
}

위와 같이 HCL 이라는 문법을 사용하여 인프라를 정의합니다. 이 또한 코드로 인프라를 정의할 수 있고 무엇보다 Azure, GCP등 aws 뿐만이 아니라 다양한 클라우드 서비스 또한 지원하기 때문에 멀티 클라우드 환경에서는 대체 할 수 없는 강자라고 볼수 있습니다.

 

근데, 여기서 또 한가지 불편한점이 있지 않나요?

 

 

예, 맞습니다. 우리의 시간은 한정적입니다.

 

"생각 보다 잦은 변화가 없는 인프라 구조인데 이것 때문에 새로운 언어를 배워야해요?"

"그냥 제가 잘하는 Python, Typescript, Golang, etc...로 정의할 수는 없나요?"

"우리 회사는 aws만 사용하면 되는데요...?"

 

등등 다양한 불만이 생길 수 있습니다.

 

이러한 고민을 해결하기 위해 aws 에서 직접 출시한 것이 "aws cdk" 입니다.


어떻게 동작하는가?

사실, cdk는 내부적으로 이전에 aws에서 Iac로써 출시 했던 CloudFormation 템플릿을 정의하여 사용합니다. 

외부에 프로그래밍 언어로 cloudformation 템플릿을 테스트, 구성 및 배포를 진행하는 구조입니다.

(이 챕터에서는 AWS CloudFormation에 대해 다루지 않기 때문에 모르시다면 컨셉만 확인하고 오시면 될것 같습니다.)

 

AWS CloudFormation란 무엇인가요? - AWS CloudFormation

AWS CloudFormation란 무엇인가요? AWS CloudFormation은 AWS 리소스를 모델링하고 설정하여 리소스 관리 시간을 줄이고 AWS에서 실행되는 애플리케이션에 더 많은 시간을 사용하도록 해 주는 서비스입니다.

docs.aws.amazon.com

 

간단한 실습을 통해 더욱 자세히 알아가 봅시다.

 

초기 프로젝트 구조 세팅

기본적으로 cdk에서는 typescript 뿐만 아니라 python, csharp, javascript, java, golang을 지원합니다.

이중 가장 많은 레퍼런스가 있는 typescript로 진행해보도록 하겠습니다.

cdk init --language typescript

 

S3 Stack 정의

./lib/main.ts

import * as cdk from 'aws-cdk-lib';
import { aws_s3 as s3 } from 'aws-cdk-lib';

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

    new s3.Bucket(this, 'MyFirstBucket', {
      versioned: true,
      bucketName: 'my-test-bucket-for-hj',
    });
  }
}

 

부트스트래핑

cdk bootstrap

cdk bootstrap 명령어는 cdk 로인프라를 프로비저닝하기 전에 필요한 초기 설정 작업을 수행하는 역할을 합니다.

 

CDK 애플리케이션을 배포하기 위해 필요한 리소스(예: S3 버킷, IAM 역할 등)를 포함하는 특정 AWS 계정과 리전에 대한 환경을 준비합니다.

 

간단히 말해, cdk bootstrap은 CDK를 사용하여 클라우드 리소스를 관리하고 배포하기 위한 기본적인 환경을 설정하는 과정입니다. 이 과정을 통해 생성된 리소스는 CDK 애플리케이션의 배포 과정에서 사용됩니다.

 

stack 배포 사전 실행

cdk synth

./bin/main.ts 하위 정의된 stack들에 대해서 사전 실행을 합니다.

실제로, 배포 이전 인프라 구성에 사용된 stack들에 대한 테스트를 진행한다고 이해하면 됩니다.

 

이과정까지 모두 문제없이 진행되었을겁니다.

자, 이제 멋드러진 배포를 진행해봅시다.

stack 배포

cdk deploy

실제로 s3 이름이 중복되지만 않는다면 별 문제 없이 s3 자원이 생성된것을 확인할 수 있습니다.

 

stack 제거

cdk destroy

배포 된 stack에 포함되어있는 aws 자원을 제거합니다.


 

후기

 

실습의 굉장히 간단하게 진행했지만 aws에서 제공하는 api를 활용해 진행하는 만큼 굉장히 신뢰도가 높고 다양한 기능을 제공하고 있습니다. 무엇보다, 유연하게 본인의 주력 언어로 코드를 작성하여 코드를 재사용하고 인프라를 명시적으로 구성할 수 있다는 큰 장점을 가지고 있는 툴이라고 생각됩니다.

 

단점 또한 존재는 합니다. 레퍼런스가 많지 않고, 공식 문서가 생각보다 불친절한 부분이 있어서 어느정도 구현에 있어서 직접 하나하나 찾아가면서 작성해야한다는 점입니다.

 

물론, 이러한 단점을 커버할 만큼 프로그래밍 언어로 인프라를 정의할 수 있다는 점에서 앞으로 점차 큰 영향력을 행사하지 않을까?하는 기대감을 가지고 있습니다.

 

결론: Iac 도입에 대해서 고민을 하고 있다면 cdk 한번 고려해보는것 나쁘지 않은 선택이라고 생각이 듭니다!

언젠가 시간이 된다면, 좀더 딥한 구조의 cdk 실습 리뷰로 찾아뵙겠습니다.

감사합니다!

 

 

+) cdk for terraform이라는 cdk의 프로그래밍과 terraform의 멀티클라우드 지원이라는 장점만 모여있는 강려크한 도구가 있습니다. 확인해보시죠!

 

CDK for Terraform | Terraform | HashiCorp Developer

Cloud Development Kit for Terraform (CDKTF) lets you use familiar programming languages to define and provision infrastructure.

developer.hashicorp.com

 

728x90

'기술 > Devops' 카테고리의 다른 글

Serverless 왜 사용하나요?  (2) 2024.05.09
aws(2)VPC(Virtual Private Cloud)  (0) 2022.04.19
aws(1)S3(Simple Storage Services)  (0) 2022.04.19
도커(4)-이미지  (0) 2022.01.19
도커(3)-도커 컴포즈  (0) 2022.01.17

+ Recent posts