본문으로 건너뛰기
김신건의 로그

[IaC] Pulumi: 코드로 인프라 (TS/Python/Go)

· 수정 · 📖 약 1분 · 244자/단어 #pulumi #iac #devops #cloud
Pulumi, IaC in code, Pulumi stack, Pulumi automation API

정의

Pulumi = 일반 프로그래밍 언어로 IaC. TypeScript, Python, Go, .NET, Java. Terraform 의 HCL DSL 대신 코드 자유도.

TS 예시

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

const config = new pulumi.Config();
const env = pulumi.getStack();

const bucket = new aws.s3.Bucket("data", {
  bucket: `myapp-data-${env}`,
  tags: { Environment: env, ManagedBy: "pulumi" },
});

new aws.s3.BucketVersioningV2("data-version", {
  bucket: bucket.id,
  versioningConfiguration: { status: "Enabled" },
});

export const bucketName = bucket.id;

흐름

flowchart LR
    Code[index.ts] --> Preview[pulumi preview<br/>diff]
    Preview --> Up[pulumi up<br/>실제 변경]
    Up --> State[(stack state<br/>backend)]

명령

pulumi new aws-typescript    # 새 프로젝트
pulumi stack init dev        # 새 stack (Terraform workspace 비슷)
pulumi config set region us-east-1
pulumi config set --secret db-password xxx
pulumi preview               # diff
pulumi up                    # apply
pulumi destroy
pulumi stack output bucketName
pulumi import aws:s3/bucket:Bucket data my-legacy-bucket

Backend (state)

Backend의미
Pulumi Cloudmanaged (기본, free tier)
AWS S3self-host
Azure Blob / GCSself-host
Local file개발
pulumi login s3://my-pulumi-state
pulumi login --local

차이: HCL vs 코드

// Pulumi: 조건/반복은 코드 그대로
const instances = ["alice", "bob", "charlie"].map((name) =>
  new aws.iam.User(name, { name })
);

// 의존성 자동
const role = new aws.iam.Role("app", { ... });
new aws.iam.RolePolicyAttachment("attach", {
  role: role.name,    // pulumi.Output<string>, 의존성 자동
  policyArn: policy.arn,
});

Pulumi vs Terraform

항목PulumiTerraform
언어TS/Python/Go/.NET/JavaHCL
표현력높음 (코드 자유)DSL 한정
학습 곡선일반 코드 알면 쉬움HCL 학습
테스트unit test 가능tflint, terratest 등 별도
생태계작음가장 큼
가격Cloud paid (free tier)OSS / OpenTofu
멀티 클라우드

Automation API

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

const stack = await automation.LocalWorkspace.createOrSelectStack({
  stackName: "prod",
  projectName: "myapp",
  program: async () => {
    new aws.s3.Bucket("data", { ... });
  },
});

await stack.up({ onOutput: console.log });

Terraform 의 CLI 의존성 없이 Pulumi 를 프로그램 안에서 호출. self-service portal 같은 내부 도구 에 강력.

흔한 함정

WARNING

  1. pulumi.Output 처리 미숙 = .apply(), interpolate 사용. promise/await 와 다름.
  2. Secret 코드에 평문 = pulumi config set --secret.
  3. Stack 간 reference = StackReference 로 cross-stack output 읽기.
  4. 변수 vs config = config 가 stack 별. 변수는 코드.

관련 위키

이 글의 용어 (3개)
[CI/CD] GitHub Actions: workflow, action, runnerdevops
정의 GitHub Actions = GitHub 내장 CI/CD. YAML workflow + marketplace action. 2018 출시 → Travis CI 대체. 구조…
[IaC] AWS CDK: TypeScript 로 CloudFormation 생성cloud
정의 AWS CDK = TS/Python/Java/Go 로 AWS 인프라 정의 → CloudFormation 으로 컴파일 → 배포. AWS 전용. 흐름 예시 한 줄 = bucke…
[IaC] Terraform: HCL, provider, statecloud
정의 Terraform = 선언적 인프라 코드. HCL (HashiCorp Configuration Language) 로 리소스 정의 → AWS/GCP/Azure 등 provid…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기