이번은 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 이중화 자동화 시나리오를 심화 다룰 수 있습니다.
'IT & Tech 정보' 카테고리의 다른 글
🏢 GitOps + Argo CD + Helm 기반 멀티테넌시 쿠버네티스 운영 전략 (0) | 2025.05.29 |
---|---|
⚠️ Prometheus + KEDA로 실시간 장애 탐지와 자동 트래픽 컷오프 + Slack 경고 파이프라인 만들기 (0) | 2025.05.28 |
OPA 기반 GitOps 정책 제어 파이프라인: GitHub Actions + Argo CD + Gatekeeper 완전 통합 (0) | 2025.05.28 |
AWS Lambda에 KEDA 도입하기: EventBridge 기반 Serverless Auto-Scaler 완전 자동화 (0) | 2025.05.28 |
Git 커밋도 없이 배포된다: Argo CD Image Updater로 완전 자동 GitOps 구축하기 (0) | 2025.05.28 |