본문 바로가기
devops

AWS Cloudformation

by marble25 2023. 12. 9.

최근에 AWS 인프라가 점점 더 복잡해짐에 따라 AWS 인프라를 코드로 관리할 필요성이 생겼다. 이에 대해 좀 더 찾아보다가 AWS Cloudformation을 도입해보게 되었다.

IaC (Infrastructure as Code)

IaC는 매뉴얼한 프로세스가 아닌 코드를 통해 인프라를 관리하고 프로비저닝하는 일을 말한다.

장점

  • IaC를 사용하면 파일 형태의 config가 생성되어 편집하고 배포하기가 쉽다.
  • 매번 동일한 환경을 생성하도록 보장한다.
  • 환경에 대한 버전 관리도 가능하다.

방식

  • 선언적 접근 방식: 원하는 상태를 정의하고, 시스템은 원하는 상태에 도달하기 위해 노력한다.
  • 명령적 접근 방식: 인프라 상태 뿐만 아니라 어떻게 달성될 지도 명령으로 정의된다. 적절한 순서로 실행되어야 한다.

  • Terraform
  • Ansible
  • AWS Cloudformation

AWS Cloudformation

우리가 많은 IaC 툴 중에 AWS Cloudformation을 도입한 이유는 다음과 같다.

  • 클라우드 인프라로 AWS를 사용: 가장 중요한 이유이다. 우리가 정의해야 하는 대부분의 인프라 상태가 AWS 상에 존재하고, 몇 개의 노드만 on-premise로 동작하고 있다. 따라서 AWS 서비스를 대상으로 하는 AWS Cloudformation을 사용한다.
  • 사용 경험: 이미 AWS Cloudformation을 사용해본 경험이 있고, 좋은 유저 경험을 가졌기 때문이다.

시작하기

Cloudformation과 AWS CDK를 통해 시작할 수 있다.

AWS CDK(Cloud Development Kit)은 cloud infrastructure를 코드로 정의하고 AWS Cloudformation으로 프로비저닝하는 것을 도와주는 툴이다. 현재 다음 언어에서 가능하다.

  • Javascript, Typescript (Node.js ≥ 14.15.0)
  • Python (Python ≥ 3.8)
  • Java (Java ≥ 8 and Maven ≥ 3.5.4)
  • .NET (.NET ≥ 6.0)
  • Go (Go ≥ 1.16.4)

CDK는 Typescript로 개발되었다고 한다. 다른 언어는 Typescript에 대한 바인딩에 불과하다. 그래서 위 언어 중에 Typescript로 시작하기로 했다. 예제는 다음 페이지들을 참고할 수 있다.

https://cdkworkshop.com/

https://github.com/aws/aws-cdk

Authentication

CDK는 AWS 인증이 필요하다. 이를 위해 AWS CLI에서 sso 인증을 통해 시작할 수 있다. 설정한 session의 길이만큼 AWS CDK에 접근할 수 있다.

aws sso login

설치

npm install -g aws-cdk

부트스트래핑

스택을 배포하려면 AWS CloudFormation이 사용할 AWS S3 버킷 및 컨테이너가 필요하다. 이를 부트스트래핑이라고 한다.

cdk bootstrap aws://ACCOUNT-NUMBER/REGION

TIP) 나중에 cdk 개발하다 보면 다음과 같은 에러가 나는 경우가 있다.

✨  Synthesis time: 7.82s

AwsLab2Stack: deploying...
[0%] start: Publishing 7acebacf84a3ee9c1a08331d943a313131c77ec0f49614e1b7eb0a7c37362d71:040831115250-us-west-2
[100%] fail: No bucket named 'cdk-hnb659fds-assets-XXXXXXXXX-us-west-2'. Is account XXXXXXXXX bootstrapped?

 ❌  AwsLab2Stack failed: Error: Failed to publish one or more assets. See the error messages above for more information.
    at publishAssets (C:\\Users\\MyUserName\\AppData\\Roaming\\npm\\node_modules\\aws-cdk\\lib\\util\\asset-publishing.ts:28:11)
    at CloudFormationDeployments.publishStackAssets (C:\\Users\\MyUserName\\AppData\\Roaming\\npm\\node_modules\\aws-cdk\\lib\\api\\cloudformation-deployments.ts:418:7)
    at CloudFormationDeployments.deployStack (C:\\Users\\MyUserName\\AppData\\Roaming\\npm\\node_modules\\aws-cdk\\lib\\api\\cloudformation-deployments.ts:299:5)
    at CdkToolkit.deploy (C:\\Users\\MyUserName\\AppData\\Roaming\\npm\\node_modules\\aws-cdk\\lib\\cdk-toolkit.ts:208:24)
    at initCommandLine (C:\\Users\\MyUserName\\AppData\\Roaming\\npm\\node_modules\\aws-cdk\\lib\\cli.ts:312:12)

Failed to publish one or more assets. See the error messages above for more information.

분명히 방금까지 개발하던 코드인데 bootstrap을 다시 해야 한다는 뜻이다. 이는 계정 정보가 잘못되었거나 region이 잘못된 경우 발생한다. 다른 region으로 설정되어 있더라도 다른 cloudformation 스택으로 인식하니 주의해야 한다.

Initialize

폴더를 만들어주자.

mkdir hello-cdk
cd hello-cdk

Initialize는 다음과 같이 할 수 있다.

cdk init app --language typescript

List

App에 존재하는 stack을 보려면 ls 명령을 활용할 수 있다.

cdk ls

Deploy

Cloudformation에 배포하려면 deploy 명령을 활용할 수 있다.

cdk deploy

Diff

기존에 배포된 스택과의 차이를 보기 위해 diff 명령을 활용할 수 있다.

cdk diff

Destroy

기존에 배포된 스택을 삭제하려면 destroy 명령을 활용할 수 있다.

cdk destroy

'devops' 카테고리의 다른 글

[TIL] Grafana License  (1) 2023.11.19
[TIL] 소프트웨어 버전 체계  (0) 2023.11.06
temporal 사용 후기  (0) 2022.07.24
[책 리뷰] 배워서 바로 쓰는 14가지 AWS 구축 패턴  (0) 2022.04.13