우리가 지난 글에서 IaC가 필요한 이유와 Pulumi의 동작 방식까지 살펴봤는데요.

이번 글에서는 Pulumi를 활용해서 AWS SQS를 배포하는 과정을 통해 Pulumi의 핵심 워크플로우를 정리해봤습니다.

제가 직접 테스트하면서 작성한 가이드이니, IaC와 Pulumi에 관심 있으시다면 꼭 확인해주세요!


1️⃣Pulumi 설치 및 AWS 계정 설정

Pulumi를 사용하기 위해서는 먼저 사용 중인 PC에 Pulumi CLI를 설치하고, AWS 계정 설정을 마쳐야 합니다.

그리고 Python 패키지 관리자 pip와 가상 환경 venv가 미리 설치되어 있어야 합니다.

저는 WSL(Windows Subsystem for Linux) 환경이기 때문에 아래 명령어를 터미널에서 실행해 Pulumi를 설치했습니다. (설치 링크 참고)

curl -fsSL https://get.pulumi.com | sh

자동으로 Pulumi 설치 스크립트가 실행되어서 설치가 완료되면 아래와 같이 Pulumi 버전을 조회할 수 있게 됩니다.

Pulumi를 사용하려면 Pulumi 클라우드에 로그인을 하거나 로컬 로그인을 해야 합니다. 지금은 빠른 실습을 위해 아래 명령어로 로컬 로그인을 하겠습니다.

pulumi login --local

그럼 아래와 같이 현재 사용자 이름으로 로그인되었다고 표시됩니다.

다음은 클라우드 계정 설정인데요. Pulumi CLI가 AWS 리소스를 생성하거나 관리하려면 사용 중인 AWS 계정 정보를 알아야 합니다.

만약 로컬에 이미 AWS CLI가 설치되어 있다면 별도의 계정 설정은 필요 없지만, AWS CLI를 설치하지 않았거나 CI/CD에서 Pulumi를 사용하는 경우에는 아래처럼 AWS Access Key ID와 AWS Secret Access Key가 로컬 환경변수에 저장되어 있어야 합니다.

export AWS_ACCESS_KEY_ID="<AWS 계정의 ACCESS KEY ID>"
export AWS_SECRET_ACCESS_KEY="<AWS 계정의 SECRET ACCESS KEY>"

2️⃣새로운 Pulumi 프로젝트 생성

이제 Pulumi를 시작할 준비가 끝났습니다. 원하는 폴더로 이동한 다음 새로운 Pulumi 프로젝트를 생성해보죠.

본 가이드는 AWS 인프라 관리를 Python으로 할 것이기 때문에 aws-python이란 템플릿 이름을 붙인 아래 명령어를 실행합니다.

pulumi new aws-python

그러면 아래 이미지와 같이 터미널 상에서 프로젝트 이름과 설명, 스택 이름, 비밀번호, 패키지 관리자, AWS 리전을 설정하게 됩니다.

이 과정까지 무사히 마치면 Pulumi 프로젝트 생성에 성공입니다!🎉

해당 경로에 아래와 같이 기본적인 프로젝트 구조와 예제 코드가 생성된 것을 확인할 수 있는데요.

Pulumi 동작에 필요한 핵심 파일은 아래와 같습니다.

  • Pulumi.yaml: 프로젝트의 메타데이터가 포함된 파일
  • Pulumi.<스택명>.yaml: 특정 스택(예: dev, prod)의 구성 값을 저장된 파일
  • __main__.py: 실제 인프라 코드를 작성할 파일
  • requirements.txt: 의존성 관리 파일

“그렇군요… 근데 스택이 뭐예요?”

아까부터 스택이란 용어가 계속 나와서 궁금하실 수 있는데요.

Pulumi는 동일한 인프라 코드를 사용하되, 서로 격리된 인스턴스를 구성할 수 있도록 했습니다. 그걸 Pulumi에서 스택이라고 부릅니다.

예를 들어, dev, staging, production과 같이 각기 다른 목적의 환경을 동일한 코드로 관리할 수 있는 것이죠.

각 스택은 자신만의 구성 설정과 상태 정보를 가지기 때문에 하나의 스택이 변경되었다고 해서 다른 스택에 영향을 주지 않습니다.


3️⃣Pulumi 인프라 관리 코드 작성

다시 Pulumi 프로젝트로 돌아오겠습니다. 프로젝트를 새로 생성할 때 만들어진 실제 인프라 코드(__main__.py)에는 AWS S3 버킷을 생성하는 예제 코드가 들어있을 텐데요.

S3 버킷을 생성하는 예제 코드도 좋지만, 본 가이드에서는 애플리케이션 확장성과 안정성을 높일 때 자주 사용되는 AWS SQS 리소스 생성 예제를 준비했습니다.

AWS SQS가 무엇인지 궁금하신 분도 계실 텐데요.

SQS는 완전 관리형 메시지 대기열 서비스로, 애플리케이션의 구성 요소 간에 어떤 메시지든 안정적으로 전송, 저장, 수신할 수 있도록 도와줍니다.

좀 더 자세한 설명이 궁금하시다면 제가 지난번에 AWS SQS와 SNS를 비교한 글을 참고해주세요.

그럼, 이제 인프라 코드 파일(__main__.py)에 아래 AWS SQS 생성 예제 코드를 넣어줍니다.

import pulumi
import pulumi_aws as aws
 
# SQS 생성
# mySimpleQueue는 Pulumi 프로그램 내에서 이 리소스를 식별하는 논리적 이름
my_queue = aws.sqs.Queue("mySimpleQueue",
    name="my-app-queue",  # 실제 생성될 큐 이름 (선택 사항, 지정 안하면 Pulumi가 자동 생성)
    tags={
        "Environment": "dev",
        "Project": "MyNewsletterApp",
    })
 
# 생성된 SQS Queue의 정보 출력
# pulumi.export()를 사용하면 pulumi up 실행 후 터미널에 해당 값 출력
pulumi.export("queue_url", my_queue.id) # 생성된 SQS의 URL 반환
pulumi.export("queue_arn", my_queue.arn) # 생성된 SQS의 Amazon Resource Name (ARN) 반환

4️⃣Pulumi로 인프라 리소스 배포

인프라 관리 코드 작성을 완료했다면 이제 Pulumi로 실제 인프라 리소스를 배포해야겠죠?

물론 바로 배포할 수도 있지만, 인프라를 안정적으로 관리하기 위해 아래 워크플로우를 따를 것을 권장드립니다.

  1. pulumi preview 명령어를 실행하여 실제 인프라 변경 없이 예정된 작업을 미리 확인
  2. pulumi up 명령어를 실행하여 실제 인프라를 생성 및 업데이트

pulumi preview 명령어를 먼저 실행하면 아래와 같이 비밀번호를 입력하라는 안내 후, 미리보기를 보여줍니다.

아까 인프라 관리 코드에서 생성하려고 했던 SQS가 미리보기에도 잘 표시되고 있네요.

그럼 pulumi up 명령어로 실제 AWS SQS를 배포해보겠습니다!

명령어를 실행하면 아까 pulumi preview 명령어를 실행할 때처럼 먼저 비밀번호를 입력하라는 안내 후, 미리보기를 보여줍니다.

그 다음 업데이트를 진행하겠냐는 질문에 yes를 선택하면, 아래처럼 실제 인프라 리소스가 생성된 다음 SQS URL과 ARN이 표시됩니다.

아래는 pulumi up 명령어 실행 전 AWS 콘솔의 SQS 페이지입니다. 보이는 것처럼 아직 생성된 큐가 없죠.

하지만 pulumi up 명령어 실행이 완료되자, 아래처럼 인프라 코드에서 정의한 이름(my-app-queue)의 새로운 큐가 AWS 콘솔 페이지에 표시된 것이 보입니다.

해당 큐의 이름을 눌러서 상세 정보를 보면, 인프라 코드에서 정의했던 태그("Environment": "dev", "Project": "MyNewsletterApp")가 정상 반영된 것을 알 수 있습니다.


5️⃣Pulumi로 배포한 인프라 리소스 제거

지금까지 인프라 코드 작성과 배포 과정을 실습으로 진행해봤는데요.

이렇게 배포한 리소스를 다시 제거하는 방법도 알아보겠습니다.

인프라 리소스 제거도 배포만큼이나 간단합니다.

동일한 경로의 터미널에서 아래처럼 pulumi destroy 명령어를 실행한 다음, 비밀번호만 입력하면 되거든요.

pulumi destroy 명령어는 해당 스택의 인프라 리소스를 안전하게 제거해주지만, 스택과 관련된 설정과 히스토리는 여전히 남아있습니다.

이전에 살펴봤던 상태 관리 시스템에 스택과 관련된 정보가 저장되어 있는 건데요.

만약 이런 스택과 관련된 정보도 모두 지우고 싶다면 pulumi stack rm 명령어를 사용하면 됩니다.

단, 유의할 점이 두 가지 있으니 꼭 확인해주세요.

  1. pulumi stack rm 명령어 실행 전에 반드시 먼저 pulumi destroy 명령어로 해당 스택에 의해 관리되는 모든 인프라 리소스를 제거할 것
  2. 한번 제거된 스택 정보는 복구가 어려우므로 신중할 것

터미널에서 pulumi stack rm 명령어를 실행하면 아래와 같이 제거하려는 스택의 이름(dev)을 직접 타이핑해야 스택을 제거할 수 있습니다.

지금까지 Pulumi로 AWS 리소스를 관리하는 과정을 아래의 핵심 워크플로우를 따라 진행했습니다.

  1. Pulumi 설치 및 계정 설정
  2. 새로운 Pulumi 프로젝트 생성
  3. Pulumi 인프라 관리 코드 작성
  4. Pulumi로 인프라 리소스 배포
  5. Pulumi로 배포한 인프라 리소스 제거

🔭마무리

이번 글에서는 Pulumi 도입에 도움이 될 수 있도록 Pulumi 설치부터 계정 설정, 인프라 코드 작성 및 배포까지 핵심 내용을 차근차근 다뤄봤는데요.

Pulumi와 IaC 도입에 관심 있으신 분들께 도움이 되었길 바랍니다.


References