development

Terraform 대신 Pulumi? TypeScript로 클라우드 인프라 코딩하기

들어가며

클라우드 인프라를 관리하는 표준 도구로 오랫동안 Terraform이 군림해 왔습니다. 하지만 HCL(HashiCorp Configuration Language)이라는 생소한 문법과 복잡한 조건부 로직 처리는 개발자들에게 진입장벽이 되곤 했죠.

오늘 소개할 Pulumi는 익숙한 TypeScript를 사용하여 인프라를 정의할 수 있게 해줍니다. 반복문, 조건문, 함수 호출 등 프로그래밍 언어의 강력함을 그대로 인프라 관리에 가져온 Pulumi의 세계로 들어가 보겠습니다.

1. Pulumi란 무엇인가?

Pulumi는 “Universal Infrastructure as Code” 플랫폼입니다. Terraform처럼 선언적으로 자원을 관리하지만, 그 선언을 우리가 사용하는 일반 프로그래밍 언어로 작성한다는 점이 핵심입니다.

  • 타입 안전성: TypeScript의 타입을 활용해 오타나 잘못된 설정을 컴파일 단계에서 잡아냅니다.
  • 풍부한 생태계: npm에 올라와 있는 수많은 라이브러리를 인프라 코드에서 그대로 활용할 수 있습니다.
  • 테스트 용이성: 인프라 코드를 대상으로 유닛 테스트나 통합 테스트를 작성하기가 매우 수월합니다.

2. 시작하기: 인프라 프로젝트 생성

Pulumi CLI를 설치한 후, TypeScript 템플릿으로 프로젝트를 시작할 수 있습니다.

# Pulumi 프로젝트 시작
pulumi new aws-typescript

실행 후 생성되는 index.ts 파일이 우리의 인프라 지도가 됩니다.

3. TypeScript로 자원 정의하기

예를 들어, AWS S3 버킷을 생성하고 정적 웹 사이트 호스팅을 설정하는 코드를 살펴봅시다.

import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";

// S3 버킷 생성
const siteBucket = new aws.s3.Bucket("my-site-bucket", {
    website: {
        indexDocument: "index.html",
    },
});

// 버킷 이름 출력 (Stack Output)
export const bucketName = siteBucket.id;

HCL에서는 변수 참조가 복잡했지만, Pulumi에서는 단순히 객체의 프로퍼티를 참조하는 것만으로 자원 간의 의존성이 자동으로 계산됩니다.

4. 강력한 로직 처리: 반복문과 조건문

수십 개의 자원을 생성해야 할 때, Pulumi의 진가가 드러납니다. 단순한 map 함수만으로 처리할 수 있죠.

const zones = ["us-east-1a", "us-east-1b", "us-east-1c"];

const subnets = zones.map((zone, index) => 
    new aws.ec2.Subnet(`subnet-${zone}`, {
        vpcId: mainVpc.id,
        availabilityZone: zone,
        cidrBlock: `10.0.${index}.0/24`,
    })
);

5. 배포 및 상태 관리

작성한 코드를 클라우드에 반영하는 과정도 매우 직관적입니다.

# 변경 사항 미리보기
pulumi preview

# 실제 배포 진행
pulumi up

Pulumi는 배포된 자원의 상태(State)를 기본적으로 Pulumi Cloud 서비스에서 관리해 주므로, Terraform처럼 별도의 S3 Backend 설정을 고민할 필요가 없습니다.

마치며

인프라가 복잡해질수록 설정 파일보다는 프로그래밍 코드로 관리하는 것이 유지보수 측면에서 압도적으로 유리합니다. 이미 TypeScript에 익숙한 프런트엔드나 풀스택 개발자라면, Pulumi는 클라우드 네이티브 개발자로 도약하기 위한 최고의 무기가 될 것입니다.

여러분은 인프라를 수동으로 클릭하며 만드시나요, 아니면 코드로 관리하시나요? Pulumi와 함께 인프라의 자동화를 경험해 보세요!

이 글이 마음에 드셨나요?

로딩 중...