IaC 도구 이해: AWS CDK 대 Terraform

AWS CDK와 Terraform 중 어떤 것을 선택해야 할지 고민이신가요? 이 글은 여러분이 정보에 기반한 결정을 내리는 데 도움을 줄 것입니다.

클라우드 컴퓨팅은 정보와 기술의 패러다임을 변화시켰습니다. 애플리케이션 배포 및 유지 관리 방식부터 개발 방식까지, 모든 것이 클라우드 컴퓨팅의 영향을 받고 있습니다. 최근 개발되는 대부분의 애플리케이션은 클라우드 환경에 최적화되어 클라우드 서비스와 호환성을 갖추고 있습니다.

클라우드 컴퓨팅은 고가용성, 확장성, 효율성을 갖춘 아키텍처 구축을 지원하며, 이는 클라우드 서비스에 대한 수요 증가로 이어지고 있습니다. 이러한 클라우드 컴퓨팅의 성장으로 인해 인프라를 코드로 관리해야 할 필요성이 커졌습니다. 클라우드 리소스를 콘솔을 통해 수동으로 관리하는 것은 매우 복잡하고 추적하기 어려울 수 있습니다.

인프라형 코드(IaC 또는 Infrastructure as Code)는 이러한 문제를 해결합니다. IaC를 사용하면 코드로 리소스를 정의하고, 이 코드를 사용하여 클라우드 서비스를 프로비저닝할 수 있습니다. 코드를 통한 인프라 관리는 여러 개발자가 협업하고 변경 사항을 추적하는 데 유용합니다.

AWS의 인프라형 코드

AWS는 세계적으로 가장 크고 널리 사용되는 클라우드 서비스 제공 업체입니다. AWS는 자체 IaC 도구인 AWS CloudFormation 또는 AWS CDK를 제공하며, Terraform과 같은 타사 IaC 도구를 사용하여 리소스를 프로비저닝할 수도 있습니다. AWS용 IaC 도구를 선택할 때, 타사 도구인 Terraform은 AWS 관리 도구인 AWS CloudFormation 및 AWS CDK와 경쟁하고 있습니다.

각 도구가 제공하는 기능과 선택 사항이 많기 때문에 적절한 IaC 도구를 선택하는 것은 어려운 일입니다. 이 글에서는 AWS CDK와 Terraform의 차이점을 분석합니다. AWS CDK는 내부적으로 CloudFormation을 사용하므로, CloudFormation과 Terraform에 대한 자세한 내용은 관련 문서, “IaC 도구 비교: CloudFormation 대 Terraform”을 참조하십시오.

Terraform

Terraform은 Hashicorp에서 개발한 오픈 소스 인프라형 코드 도구입니다. AWS 뿐만 아니라 다른 클라우드 공급자도 지원하는 성숙하고 안정적인 도구입니다. Terraform은 모든 AWS 서비스를 지원하며, 개발자 커뮤니티는 AWS가 서비스에 새로운 기능을 추가할 때 빠르게 이를 반영합니다. Terraform은 Hashicorp Configuration Language(HCL)를 사용하여 코드를 작성합니다. HCL은 인프라 리소스를 정의하기 위한 JSON과 유사한 언어입니다.

AWS CDK

AWS CDK는 AWS CloudFormation을 감싸는 래퍼(Wrapper)입니다. AWS CDK의 작동 방식을 이해하려면 AWS CloudFormation에 대한 기본적인 지식이 필요합니다. AWS CloudFormation은 AWS 인프라를 YML 또는 JSON 형식으로 정의할 수 있는 AWS 관리 도구입니다. JSON과 YML은 읽기는 쉽지만, 프로그래밍 언어라고 할 수는 없습니다. 루프 및 함수에 대한 기본 지원이 부족하여 대규모 인프라를 유지 관리하는 데 어려움이 있습니다. AWS CDK는 이러한 문제점을 해결하기 위해 등장했습니다.

AWS CDK는 JAVA 또는 Python과 같은 친숙한 프로그래밍 언어를 사용하여 인프라를 프로비저닝할 수 있도록 AWS CloudFormation을 확장한 도구입니다. 이를 통해 코드 작성 및 유지 관리가 더욱 용이해집니다.

Terraform vs AWS CDK: 주요 차이점

#1. 언어 및 사용 편의성

언어와 사용 편의성은 AWS CDK와 Terraform의 차이점을 이해하는 데 매우 중요한 요소입니다.

먼저 Terraform에 대해 살펴보겠습니다. Terraform은 JSON과 유사한 언어인 HCL(HashiCorp Configuration Language)을 사용하여 리소스 및 기타 데이터를 정의합니다. HCL은 매우 간결하며, 설명서 또한 초보자도 쉽게 이해하고 따라 할 수 있도록 구성되어 있습니다.

S3 버킷을 생성하는 코드를 예시로 들어보겠습니다.

resource "aws_s3_bucket" "my_s3_bucket" {
  bucket = "my-tf-bucket"

  tags = {
    Name        = "My bucket"
    Environment = "Dev"
  }
}

위 코드는 매우 간단하며, 해당 리소스가 지원하는 추가 매개변수는 Terraform 문서에서 확인할 수 있습니다.

앞서 언급했듯이, AWS CDK는 프로그래밍 언어를 사용하여 리소스를 정의할 수 있게 해주는 CloudFormation 래퍼입니다. S3 버킷을 생성하는 AWS CDK 코드를 살펴보겠습니다.

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

export class BucketStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    new s3.Bucket(this, 'MyFirstBucket', {
      bucketName: 'my-first-bucket',
    });
 }
}

Terraform 코드가 CDK 코드보다 조금 더 깔끔해 보일 수 있지만, 두 코드 모두 사용하기 쉽습니다. 소규모 프로젝트에서 IaC를 사용한다면 Terraform과 CDK 모두 언어 및 사용 편의성 측면에서 좋은 선택입니다.

하지만 대규모 프로젝트에 적합한 IaC 도구를 선택할 때는 Terraform에 몇 가지 단점이 있습니다. Terraform은 사용하기 쉬운 언어이지만, 완전히 새로운 언어를 익혀야 한다는 점이 개발자에게 부담이 될 수 있습니다. 더욱 중요한 것은 Terraform에서 데이터를 조작하는 것이 다른 프로그래밍 언어만큼 쉽지 않다는 것입니다. 특히 초보자에게는 목록과 객체를 반복하고 값을 변환하는 것이 어려울 수 있습니다.

개인적으로 사용 편의성을 고려한다면 Terraform보다 AWS CDK를 선호합니다. Terraform을 사용할 때 원하는 결과를 얻기 위해 우회 방법이나 복잡한 스크립트를 사용해야 했던 경험이 있습니다. AWS CDK에서는 데이터를 쉽게 제어하고 조작할 수 있다는 점이 큰 장점입니다.

#2. 적용 범위

Terraform은 멀티 클라우드 IaC 도구입니다. 즉, AWS 뿐 아니라 Azure 또는 GCP와 같은 다른 클라우드 공급자에서도 Terraform을 사용할 수 있습니다. Terraform은 멀티 클라우드 환경을 구축하고, 원하는 클라우드 공급자를 선택하여 애플리케이션을 배포하는 데 유용합니다.

클라우드 서비스 제공업체의 문제로 인해 대규모 플랫폼이 다운되는 경우가 발생합니다. 따라서 현재는 애플리케이션을 위한 둘 이상의 클라우드 공급자를 확보하는 것이 현명한 결정입니다.

반면 AWS CDK는 AWS에서 제공하는 IaC 도구입니다. 강력하고 안정적인 AWS CDK는 AWS 클라우드에만 국한됩니다.

IaC 도구의 적용 범위 측면에서 Terraform이 확실한 승자입니다. 개발자가 모든 클라우드 플랫폼에서 동일한 도구를 사용할 수 있게 하는 것이 더 효율적입니다.

#3. 성능

일반적으로 성능은 IaC 도구를 선택할 때 가장 중요한 기준은 아니지만, 대규모 프로젝트에서는 고려해야 할 요소입니다. Terraform은 AWS SDK를 사용하여 리소스를 배포하는 반면, CDK 코드는 먼저 CloudFormation 템플릿으로 변환된 후 적용됩니다.

Terraform은 코드를 CloudFormation 템플릿으로 변환하는 시간이 필요하기 때문에 AWS CDK보다 약간 더 빠르게 작동합니다.

#4. 모듈성

Terraform과 AWS CDK 모두를 사용하여 모듈을 생성할 수 있습니다. Terraform은 모듈을 기본적으로 지원합니다. 사용자는 자체 모듈을 생성하고, 개인 모듈 레지스트리에 저장하여 조직 내에서 공유할 수 있습니다. Terraform은 공개 모듈을 호스팅하고 사용할 수 있는 공개 모듈 레지스트리도 제공합니다.

AWS CDK에서도 재사용 가능한 함수 및 클래스를 생성하고 조직 내에서 공유하여 동일한 결과를 얻을 수 있습니다. 이는 AWS CloudFormation에서는 불가능했던 AWS CDK의 큰 장점입니다. CloudFormation에서 중첩 스택을 사용하여 모듈과 유사한 기능을 구현할 수 있지만, AWS CDK를 사용하는 것이 훨씬 더 효과적인 방법입니다.

전반적으로 두 도구는 이 측면에서 유사합니다.

#5. 제어 및 거버넌스

AWS 콘솔에 대한 모든 접근 권한은 AWS의 Identity Management Service인 IAM을 통해 제어됩니다. AWS CDK와 Terraform 모두 IAM 정책을 사용하여 특정 작업을 허용하거나 거부할 수 있습니다. IAM을 사용하면 계정에서 수행할 수 있는 작업을 세부적으로 제어할 수 있습니다.

계정 리소스에 대한 접근을 제어하는 것 외에도 Terraform은 Sentinel이라는 정책 코드 프레임워크를 제공합니다. Sentinel을 사용하면 Terraform을 통해 사용자의 작업을 올바르게 제어하는 세분화된 정책을 작성할 수 있습니다.

결론

AWS CDK는 내부적으로 CloudFormation을 사용하므로, CloudFormation과 Terraform을 비교 분석한 자료를 살펴보면 AWS CDK와 Terraform의 차이점을 더 잘 이해할 수 있을 것입니다.

전반적으로 AWS CDK와 Terraform은 모두 성숙하고 강력한 도구입니다. Terraform은 데이터 조작과 관련된 몇 가지 단점이 있지만, Terraform 사용에 익숙해지면 데이터 변환 작업을 처리하는 방법을 익힐 수 있습니다. 멀티 클라우드 환경에서 작업할 경우 Terraform이 가장 좋은 선택일 수 있습니다. 하지만 AWS를 주 클라우드 공급자로 사용하는 경우 AWS CDK도 좋은 대안이 될 수 있습니다.