ASHD Dev_Blog

인프라 일기 0편 : IAC 메커니즘(Terrafrom)

인프라 일기 0편 : IAC 메커니즘(Terrafrom)

이재룡
이재룡 May 8, 2026

[ Terraform vs Pulumi ]

IAC : Infrastructe As a Code

→ 인프라 환경 설정을 코드로

 

일단 현재 팀에서 기본적으로 사용하던 (Setting은 내가 안함 = 사용만 할 줄 안다 ㅎㅎ)

Pulumi와 비교해보면

일단 현재 팀에서 기본적으로 사용하고 있다 (Setting은 내가 안함 = 사용만 할 줄 안다 ㅎㅎ)

  1. 언어
      • Declarative(전체 설계도) : Terrafrom은 HCL이라는 자체 도메인 언어를 사용하면서 (like .tf)
        • → 조건문, 반복문 등을 사용할 때, for_each나 count 등 생소한 문법을 사용하며

        • 반복을 한다기 보다, 매번 다르게 적용이나 / 동일한 설정을 반복하는 것에 가까움
       
      • OOP(개별) : Pulumi는 Java, Go, Python, TypeScript 등등 기본적인 백엔드 언어 사용
        • → if / for in range 등을 사용하면서

        • 각 객체를 만들고 해당 객체를 다시 불러서 수정 또는 다시 사용하는 OOP 개념
       
  1. 상태 관리 파일
    1. IAC 프로그램은 무조건 상태 관리가 필수!

      → 현재의 상태와 코드의 상태를 보고 변화한 부분을 적용하기 때문에 SOT 역할이 필요하다!

       
      • 로컬 저장 : Terraform은 .tfState라는 파일로 해당 정보를 저장
        • → 여러 명이 동시 작업할 경우 DB Locking 등의 충돌 제어 필수

       
      • SAAS 관리 : Pulumi는 자체 관리형 서비스인 Pulumi Service에 상태를 저장
        • → 동시에 apply 하더라도, SOT를 외부 서비스가 가지고 있으므로 (자동 충돌 제어)

        • 일단 SOT 요청 → 받은 apply system 만 작업 → SOT update
        • 나머지는 대기 → 이후에 앞선 작업이 끝나면 → update된 SOT를 받음
       
  1. 패키지 및 모듈관리
      • Terraform Registry : (like DockerHub)
      • PackageManager : (그대로 Gradle, npm, pip) → 라이브러리처럼 인프라 코드 사용
 
 

[ 동작 명령어 세부 분석 ]

Terraform Core

  • HashiCorp가 Go 언어로 개발한 오픈소스 소프트웨어
  • 컴퓨터에 설치된 terraform.exe 파일
  • AWS, GCP, Azure와 직접 통신 불가능
 

1. terraform init

  • 코드 유효성 검사
  • Provider Plugin Load
    • 인터넷을 통해 다운로드
    • main.tf 안에서 Provider 확인 (like provider "aws" )
    • core가 Terraform Registry(registry.terraform.io) 서버에 접속 및 버전에 맞게 설치
    • .terraform 에 plugin 설치 (매번 설치 싫다 : Global Plugin Cache → 내 PC에 플러그인 저장)

       

2. terraform plan

  • 상태 비교 및 변화 확인
    • Desired State: main.tf
    • State: terraform.tfstate
    • Actual State: 플러그인을 통해 얻은 실제 인프라 상태
    •  
  • 의존성 그래프(DAG = 방향+비 순환) 생성
    • → .tf 파일의 순서를 통합해서 읽고 수학적으로 판단한다

      예시) VPC 코드가 EC2 코드보다 늦게 읽히면 에러가 나지 않을까? NO

    • workspace (폴더 단위)의 모든 TF의 파일을 읽어서
    • 수학적으로 계산하여 올바른 순서대로
    •  

      Module

    • 모듈도 workspace 단위 → 모든 vpc_setup 폴더의 .tf 파일을 묶은 인프라 정보!
    • Terraform Registry도 가능 : source = "terraform-aws-modules/vpc/aws”
 
  • Plan 출력
  • 가상 실행 결과(Dry-run) : 초록색(+), 노란색(~), 빨간색(-) [like github]
  • 실제 변경 X
 

3. terraform apply

  1. RPC 통신 : core → background plugin 통신
  1. API 호출 : like AWS SDK library
  1. State 업데이트 : terraform.tfstate 덮어쓰기
 

참고 apply가 완료되면, 추가 되는 3개의 파일들

  • .terraform.lock.hcl
    • → package-lock.json과 비슷한 역할 : 버전 기록 (팀원과 버전 공유 및 업데이트 확인용)

  • terraform.tfstate
    • → 현재 상태 파일

      (참고로 terraform destroy도 도 상태 변경으로 인식되어서, destory이 현재 상태가 빈 파일로)

  • terraform.tfstate.backup
    • → 이전 상태 파일 : 백업용

 
 

[ Plan 유효, Infra Error ]

State Drift : tfState와 actual state 간의 불일치 Error

  • Init & Plan - Desired State: main.tf
  • Init & Plan - State: terraform.tfstate
  • Apply - Actual State: 플러그인을 통해 얻은 실제 인프라 상태

→ 실제 Actual state를 확인하지 않은 채로 Plan 작업을 진행해서 생기는 에러

 

[init & plan]

.tf.tfState 의 결과가 일치하면

다른 리소스를 수정할 때 EC2는 건드리지 않는 PLAN!

— — — — EC2 AWS Console 단에서 수정되어 있으면 — — — —

[apply]

apply단계에서 실제 API 호출 시 에러로 실패

→ refresh를 통해 현재 Actual state를 .tfState로 적용 필요!

 
 

[ AWS EC2 simulation ]

  1. IAM 계정 연결
  1. 간단한 python 서버 코드 작성
 
  1. .tf 파일 작성
    1. provider 설정
    2. default VPC 가져오기
    3. 보안 그룹 생성 (ingress 0.0.0.0 / egress 0.0.0.0)
    4. ami(aws linux os) 이미지 서칭
    5. EC2 생성
    6. 변경 내용 감지 및 신규 태그 지정
 
  1. 실제 실행
 

추천 글

BlogPro logo