본문 바로가기
IT & Tech 정보

Pulumi × TypeScript로 구축하는 멀티 클라우드 IaC: 진짜 ‘코드로서의 인프라’란 무엇인가

by 지식과 지혜의 나무 2025. 5. 28.
반응형

이번은 DevOps 고급 자동화 주제로, **“Pulumi + TypeScript로 작성하는 멀티 클라우드 IaC 자동화”**에 대한 실전급 가이드입니다. Terraform이 아닌 Pulumi를 활용하여, 코드 수준에서 로직 분기와 리유저블 모듈화가 가능한 구조로 멀티 클라우드 인프라를 운영하는 방법을 다룹니다. TypeScript로 작성되므로 개발자 친화적인 경험과 테스트 주도 설계(TDD)도 가능합니다.

📌 왜 Pulumi인가?

Terraform과 달리 Pulumi는 다음과 같은 장점으로 “개발자 관점에서” 인프라를 관리할 수 있게 해줍니다.

기능 Terraform Pulumi
언어 HCL (DSL) TypeScript, Go, Python, C# 등
조건문 / 반복문 제한적 (count, for_each) 일반 프로그래밍 로직 모두 가능
재사용성 모듈은 정적 구성 NPM 패키지처럼 import/export 구조화
테스트 terraform plan 수준 Jest, Mocha 등 단위 테스트 가능
구성 파일 수 *.tf, *.tfvars, *.backend, *.module 등 분산 하나의 index.ts에 집중 가능




🧱 아키텍처 개요

Pulumi는 일반 코드처럼 클라우드 공급자를 모듈로 불러와 선언합니다.
아래는 AWS와 GCP에 동시에 S3 + GCS 스토리지를 만들고 로깅을 통합하는 구성입니다.

project-root/
├─ Pulumi.yaml
├─ Pulumi.dev.yaml
├─ index.ts
├─ infra/
│  ├─ aws-storage.ts
│  └─ gcp-storage.ts
└─ utils/
   └─ log-policy.ts




⚙️ 핵심 예제: AWS + GCP 동시 IaC 선언

1. 프로젝트 초기화

pulumi new aws-typescript

이후 @pulumi/gcp와 @pulumi/aws를 함께 설치

npm install @pulumi/aws @pulumi/gcp




2. infra/aws-storage.ts

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

export const awsBucket = new aws.s3.Bucket("my-aws-bucket", {
  acl: "private",
  tags: { environment: "dev", team: "devops" },
});




3. infra/gcp-storage.ts

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

export const gcpBucket = new gcp.storage.Bucket("my-gcp-bucket", {
  location: "US",
  uniformBucketLevelAccess: true,
});




4. index.ts에서 통합 호출

import { awsBucket } from "./infra/aws-storage";
import { gcpBucket } from "./infra/gcp-storage";

export const awsBucketUrl = awsBucket.bucketDomainName;
export const gcpBucketUrl = gcpBucket.url;




📦 유틸리티: 공통 로깅 정책 모듈화

utils/log-policy.ts

export function generateLogPolicy(bucketName: string): string {
  return JSON.stringify({
    Version: "2012-10-17",
    Statement: [
      {
        Effect: "Allow",
        Principal: { Service: "logging.s3.amazonaws.com" },
        Action: "s3:PutObject",
        Resource: `arn:aws:s3:::${bucketName}/*`,
      },
    ],
  });
}




🧪 테스트: Jest 기반 단위 테스트 구성

__tests__/aws-storage.test.ts

test("S3 bucket must have devops tag", async () => {
  const bucket = await import("../infra/aws-storage");
  expect(bucket.awsBucket.tags["team"]).toBe("devops");
});

Pulumi는 실제 리소스 없이도 Preview 기반 객체를 반환하므로 테스트 가능



🔄 CI/CD 통합

GitHub Actions 또는 CircleCI에서 Pulumi CLI를 설치하고 다음 명령어 사용:

pulumi login
pulumi stack select dev
pulumi preview --diff
pulumi up --yes




🧠 고급 활용 팁

활용 예시
환경별 Stack 분기 Pulumi.dev.yaml, Pulumi.prod.yaml 등을 사용한 분기 배포
멀티 클라우드 라우팅 Cloudflare Worker + Pulumi로 DNS/트래픽 분산
리팩토링 NPM 모듈로 공통 보안 정책 추상화
시크릿 관리 pulumi config set --secret + AWS KMS 암호화
동적 리소스 생성 서비스 수에 따라 반복문으로 N개 리소스 선언




✅ 결론

Pulumi는 단순한 IaC 도구가 아니라, “인프라를 소프트웨어처럼” 개발하고 배포하고 테스트하는 체계입니다.
TypeScript 기반으로 작성하면:
• GitOps 친화적 코드 베이스 유지
• npm test로 인프라 단위 테스트 실행 가능
• 개발자와 인프라 엔지니어가 동일한 언어로 협업

이라는 강점을 누릴 수 있습니다.

다음 주제로는 Pulumi + GitHub Actions로 스택별 환경 동기화 및 다중 테넌트 멀티 클라우드 관리 혹은 Pulumi를 이용한 EKS + GKE 이중화 자동화 시나리오를 심화 다룰 수 있습니다.

반응형