개발 · 자동화핵심 · 15분 읽기

IaC·Terraform과 재현 가능한 운영

인프라를 코드로 관리하려면 정의뿐 아니라 버전·대상·상태·검토·복구 절차가 필요합니다. 도구마다 책임을 나누어 운영합니다.

개념부터 찾아보기

정의·역할·동작 원리를 독립 페이지에서 확인하세요. 본문의 밑줄 용어에도 설명이 있습니다.

이 노트에서 설명할 수 있게 되는 것

  1. 구성·state·실제 API 자원을 연결해 계획이 만들어지는 과정을 설명한다.
  2. 추가·갱신·교체·삭제와 드리프트의 차이를 판정한다.
  3. Terraform·Ansible·컨테이너 도구의 책임과 복구 경계를 나눈다.

01명령 순서와 원하는 상태를 코드로 표현하는 방식

  • 스크립트는 디렉터리를 만들고 파일을 쓰고 서비스를 시작하는 순서를 직접 기술한다.
  • 선언적 구성은 원하는 자원의 속성이나 상태를 표현하고 도구가 현재 상태와 비교하여 필요한 작업을 결정한다.
  • 둘은 완전히 분리된 세계가 아니라 한 자동화 안에서 결합할 수 있다.
    • 어떤 방식이든 입력 대상·버전·권한·오류 처리·변경 결과가 정의되어야 재현할 수 있다.
  • IaC는 클라우드 전용 또는 컨테이너의 다른 이름이 아니다.
  • 온프레미스 가상화·네트워크··외부 API 자원도 도구와 가 지원하면 코드로 관리할 수 있다.
    • 같은 명령을 두 번 실행했다는 사실만으로 원하는 상태가 재현된 것은 아니며 패키지 저장소·이미지·시간에 따라 결과가 달라질 수 있어 의존성 버전과 입력도 기록한다.

02Terraform의 구성·provider·state가 연결되는 방식

  • 구성은 어떤 의 어떤 자원을 어떤 속성으로 관리할지 표현한다.
  • 는 특정 API와 상호작용하는 플러그인 역할을 한다.
  • 는 구성에 있는 와 실제 원격 객체의 식별 관계 등을 기록한다.
  • 코드 파일만 있고 기존 객체와의 연결 정보가 없으면 도구가 어느 객체를 관리해야 하는지 다르게 판단할 수 있다.
    • 는 단순한 실행 로그나 운영체제 백업이 아니다.
  • 원격 자원의 속성과 비밀값이 포함될 수 있으므로 코드 저장소와 동일하게 아무에게나 공개해서는 안 된다.
    • 백엔드의 접근 통제·버전 보관·잠금 지원을 고려한다.
  • 를 직접 편집하거나 삭제한다고 실제 인프라 자원이 정상적으로 제거·복원되는 것도 아니며 관리 관계와 실제 객체를 분리해서 이해해야 한다.

03참조가 의존 그래프와 생성 순서를 만든다

  • 구성에서 네트워크 자원의 ID를 참조하면 은 그 네트워크가 준비된 뒤 생성되어야 한다.
  • 이런 속성 참조는 의존 관계를 표현하고 도구는 독립적인 자원은 병렬로 처리할 수 있다.
  • 파일에 적힌 줄 순서만으로 모든 실제 생성 순서가 결정된다고 생각하면 안 된다.
  • 명시적 depends_on은 속성 참조로 드러나지 않는 의존성이 있을 때 제한적으로 사용한다.
  • 변경이 속성 갱신으로 가능한지 기존 객체 를 요구하는지는 자원과 규칙에 달려 있다.
  • 의 이름 변경과 기반 디스크 변경을 똑같은 가벼운 편집으로 볼 수 없다.
  • 그래프는 삭제와 순서에도 관여하므로 계획에 replace나 destroy가 나타날 때 연결된 데이터·서비스 수명을 함께 검토한다.
  • 아래 HCL은 실제 자원을 배포하지 않는 입력 규칙 예다.
hcl
variable "service_name" {
  type = string
  validation {
    condition     = can(regex("^[a-z][a-z0-9-]{2,30}$", var.service_name))
    error_message = "Use 3-31 lowercase letters, digits, or hyphens; start with a letter."
  }
}

교육용 예시. 실제 원격 접속·설정 변경·배포는 실행하지 않았다.

04init·plan·apply와 drift의 관찰

  • init는 작업 디렉터리의 ·모듈·백엔드 등 필요한 구성을 준비한다.
  • validate는 구성의 구조적 유효성을 검사하고 plan은 현재 조회 상태와 원하는 구성을 비교해 예정 변경을 보여 준다.
  • apply는 선택한 계획을 실제 API 작업으로 수행한다.
  • plan은 실제 시스템 변경이 아니라 비교 결과이지만 상태 조회· 동작과 외부 데이터 조회가 있을 수 있어 실행 환경 권한과 입력을 가진 과정이다.
  • 관리자가 콘솔에서 직접 값을 바꾸면 코드와 실제 자원이 어긋나는 가 생긴다.
  • 다음 계획에서 그 차이가 보일 수 있고 선언한 값으로 되돌리거나 코드를 새 의도에 맞게 변경할 수 있다. 계획 생성 후 실제 상태가 달라질 수 있으므로 저장된 plan을 적용할 때도 그 유효성과 팀의 실행 순서를 관리한다.
  • 같은 자원을 과 별도 스크립트가 경쟁하여 고치면 끝없이 서로 덮어쓸 수 있다.
bash
terraform init
terraform validate
terraform plan
# 위 단계의 의미를 학습하는 예시이며 실제 provider·계정이 준비돼야 한다.
# apply는 별도의 실제 자원 변경 단계다.

교육용 예시. 실제 원격 접속·설정 변경·배포는 실행하지 않았다.

원리 심화

05자원 주소·실제 ID·미확정 값을 분리한다

  • 구성의 는 코드 안에서 관리 객체를 식별한다. 는 이 주소를 실제 플랫폼 객체의 ID와 연결하며 단순한 명령 실행 이력 파일에 그치지 않는다.
  • 일반 plan은 를 통해 기존 객체의 현재 속성을 읽고 구성의 목표와 비교한다. 콘솔에서 바꾼 값과 마지막 기록이 다를 수 있어 조회 시점도 결과에 영향을 준다.
  • 새 자원의 ID처럼 생성 전 알 수 없는 값은 계획에서 known after apply 등으로 표시될 수 있다. 빈 문자열·null·조회 실패를 뜻하는 값과 구분한다.
  • 다른 자원의 속성을 참조하면 생성 결과가 필요한 관계가 생긴다. 파일에서 위에 썼다는 순서보다 이 그래프와 의 작업 규칙이 실행 가능 순서를 결정한다.
  • 제자리 갱신이 불가능한 속성 변경은 삭제·생성을 수반할 수 있다. create_before_destroy도 동시 존재 제약·고유 이름·자원 한도 등을 해결해 주는 만능 옵션은 아니다.
예제로 추적

06추가 1·변경 1·삭제 1이 두 자원일 수 있다

  • 특정 를 가정하지 않는 가상 계획이다. A는 속성 변경 때문에 가 필요하고 보안 규칙 B는 제자리 수정만 필요하다고 가정한다.
  • A의 는 기존 객체 삭제 한 번과 새 객체 생성 한 번으로 센다. 계획 요약의 추가 1·삭제 1이 반드시 서로 다른 두 관리 자원이라는 뜻은 아니다.
  • 규칙 B는 ID를 유지하며 수정되므로 변경 1에 해당한다. 따라서 이 예제는 관리 자원 두 개에 대해 추가 1·변경 1·삭제 1을 보여 준다.
  • 기본적인 삭제 후 생성 라면 A가 없는 구간이 생길 수 있다. 생성 후 삭제로 바꾸더라도 트래픽 전환·데이터 보존·동시 자원 조건을 별도로 만족해야 한다.
  • A가 사라질 때 함께 지워지는 디스크인지 독립 관리 디스크인지가 데이터 결과를 바꾼다. 요약 숫자만 읽지 않고 대상과 의존 자원의 상세 변경을 읽는다.
관리 자원예상 동작요약에 기여
A추가 1 + 삭제 1
규칙 B제자리 수정변경 1
합계자원 2개 영향추가 1·변경 1·삭제 1
검증·예외

07계획과 적용 사이의 차이·부분 성공 진단

  • plan을 읽은 뒤 실제 자원·변수·권한이 달라지면 적용 조건도 달라질 수 있다. 계획 생성 시점과 적용 대상, 사용한 구성· 버전을 함께 기록한다.
  • API가 한 자원을 만든 뒤 다음 자원 생성에 실패할 수 있다. 오류 종료만 보고 전체 작업이 취소됐다고 처리하면 이미 만들어진 비용·노출·의존성을 놓친다.
  • 연결이 끊긴 구간에서는 실제 생성 여부와 반영 여부를 각각 확인한다. 문제를 지우려 를 임의 삭제하면 기존 객체를 새로 만들거나 관리에서 잃을 수 있다.
  • 코드의 를 바꾸는 일과 플랫폼 객체 이름을 바꾸는 일은 다르다. 계획이 예상치 않은 삭제·생성으로 보이면 주소와 기존 객체 연결을 먼저 대조한다.
  • 같은 속성을 다른 자동화와 콘솔이 동시에 바꾸면 다음 적용이 서로의 변경을 덮을 수 있다. 누가 어떤 자원을 관리하는지와 원하는 최종 상태를 일치시킨다.

08Terraform·Ansible·Compose·Kubernetes의 관리 범위

  • 으로 ·네트워크·디스크 같은 API 자원을 준비한 뒤 로 게스트 계정·패키지·서비스 설정을 관리할 수 있다.
  • 컨테이너 이미지는 프로그램과 사용자 공간 의존성을 담고 는 여러 서비스·네트워크·볼륨의 로컬 구성을 정의한다.
  • 는 클러스터에서 원하는 워크로드 상태를 관찰하고 조정하는 오케스트레이션 시스템이다. K3s는 배포판이며 이 도구들이 순서대로 이전 기술을 대체하는 고정 성숙도 단계는 아니다.
  • 도 가 자원과 이미지·템플릿을 지원하면 준비할 수 있다.
    • 그러나 guest 내부의 WinRM·계정·정책 구성은 별도 초기화 또는 설정 관리 범위다.
  • 각 층의 입력과 출력 경계를 정하면 생성 성공, 원격 접속 가능, 서비스 준비 완료라는 서로 다른 완료 기준을 명확히 할 수 있다.

09코드 변경에서 검토·배포·복구까지 연결하기

  • 인프라 코드의 변경은 에서 차이를 검토하고 형식·정적 검사, 작은 테스트 환경, 계획 검토를 거친 뒤 실제 대상에 적용하는 구조로 만들 수 있다.
  • 비밀값은 코드나 CI 출력에 직접 넣지 않고 권한이 제한된 자격 증명 공급 경로를 사용한다.
  • 와 모듈 버전이 바뀌면 같은 구성도 다른 동작을 할 수 있으므로 버전 선택과 잠금 파일의 의미를 유지한다.
  • 코드를 이전 으로 되돌리는 것이 데이터까지 과거로 돌린다는 보장은 없다.
  • 삭제된 DB, 마이그레이션된 스키마, 외부 API 변경은 별도의 복구 경로가 필요하다.
  • 작업 중 일부 자원만 생성된 상태도 가능하므로 실패 뒤 현재 상태를 다시 조회하고 다음 계획을 판단한다.
  • 코드의 재현성과 데이터의 복원성, 인프라의 가용성을 서로 다른 목표로 설계해야 한다.

10구성과 실제 자원을 비교해 계획 만들기

  • 구성은 어떤 자원을 원하는지 선언하고 는 해당 플랫폼의 API와 상호작용한다.
  • 는 코드의 와 실제 자원 식별자 등을 연결하는 데 사용된다.
  • 일반적인 plan은 기존 객체의 현재 정보를 읽어 구성과 비교하고 필요한 변경을 계산한다.
    • 코드··실제 자원은 서로 다른 정보다.
  • 코드에 이름이 있다는 것과 가 특정 실제 을 관리 대상으로 알고 있다는 것을 구분해야 삭제·의 영향을 해석할 수 있다.
  • 원하는 속성 하나를 바꿔도 플랫폼과 의 제약에 따라 제자리 갱신이 아니라 기존 자원을 지우고 새로 만드는 가 필요할 수 있다.
  • 계획에서 추가·갱신··삭제와 의존 자원의 연쇄 변화를 확인한다.
  • plan 자체는 제안한 변경을 적용하지 않지만 데이터 소스 조회나 통신 등 읽기 동작은 수행할 수 있다.
  • 저장된 계획과 에도 민감한 값이 포함될 수 있으므로 일반적인 공개 문서나 빌드 결과와 같은 경로로 취급하지 않는다.
  1. 변수와 버전을 포함해 구성 내용을 해석한다.
  2. 와 기존 실제 객체의 연결 정보를 제공한다.
  3. 를 통해 관리 객체의 실제 속성을 읽는다.
  4. 추가·갱신··삭제와 의존 관계를 계산한다.
  5. 별도 적용 단계에서 API에 변경을 요청한다.
  6. 성공·부분 완료 결과에 맞춰 관리 정보를 갱신한다.

설명과 함께 보는 보조 도식

메시지 순서

Terraform이 변경 계획을 계산하는 관계

일반적인 계획·적용 흐름을 설명하며 실제 인프라를 만들거나 변경하지 않는다.

구성 코드TerraformStateProvider·API1. 원하는 자원 정의2. 관리 객체 연결3. 현재 상태 조회4. 변경 계획5. 검토된 변경 적용6. 결과 상태 기록
전체 단계를 한 번에 읽기
  1. 01

    원하는 자원 정의

    변수와 버전을 포함해 구성 내용을 해석한다.

    입력
    코드와 대상 환경
  2. 02

    관리 객체 연결

    자원 주소와 기존 실제 객체의 연결 정보를 제공한다.

    역할
    단순한 임시 로그가 아님
  3. 03

    현재 상태 조회

    Provider를 통해 관리 객체의 실제 속성을 읽는다.

    목적
    구성과 실제 상태 비교
  4. 04

    변경 계획

    추가·갱신·교체·삭제와 의존 관계를 계산한다.

    검토
    데이터 있는 자원의 교체
  5. 05

    검토된 변경 적용

    별도 적용 단계에서 API에 변경을 요청한다.

    조건
    승인된 범위와 실행 환경
  6. 06

    결과 상태 기록

    성공·부분 완료 결과에 맞춰 관리 정보를 갱신한다.

    후속
    오류와 실제 상태 재확인
학습 모식도. 실제 역할 사이의 논리적 순서를 표시했으며 상세 프로토콜·오류 분기는 축약한다.

11드리프트와 부분 실패 뒤의 관찰

  • 운영 콘솔에서 긴급하게 바꾼 실제 값이 코드와 다르면 다음 계획에 차이로 나타날 수 있다.
    • 그 차이가 의도된 긴급 조치인지 실수인지 판단하지 않고 무조건 적용하면 필요한 조치가 사라질 수 있다.
  • 코드에 반영할 변경과 되돌릴 변경을 결정하고 같은 자원을 다른 도구가 동시에 관리하는지도 확인한다.
  • 으로 을 준비하고 로 내부 서비스를 설정하는 경우 두 도구가 책임질 경계를 문서화하면 충돌을 줄일 수 있다.
  • 일부 자원 생성 후 나머지가 실패할 수 있으므로 오류 메시지만 보고 전체 작업이 원상복구됐다고 가정하지 않는다.
  • 실제 자원과 를 확인한 뒤 재계획하고 상태 파일을 임의 편집·삭제해 문제를 숨기지 않는다.
  • 협업에서는 backend의 접근 권한과 지원되는 잠금 기능, 동시 실행 정책을 준비한다.
  • 인프라 코드도 다른 코드처럼 검토·버전 관리가 필요하지만 배포 대상 계정과 변수, 비밀 공급·백업·복구 절차까지 있어야 같은 결과를 안정적으로 재현할 수 있다.
  • 은 잘못 정의된 상태를 반복 적용해도 올바른 서비스가 된다는 보증이 아니다.
    • 원하는 상태의 정의와 실제 배포 결과를 함께 검토한다.
구성·관찰 대상확인하는 값구분할 문제
구성원하는 자원·변수·버전환경별 의도 차이
코드와 실제 객체의 연결유실·동시 변경·민감값
실제 API현재 속성과 존재 여부수동 변경·부분 생성
Plan갱신··삭제·의존성의도보다 넓은 변경
READ · OBSERVE · CONNECT

함께 보는 학습 자료

아래 공식 자료를 본문의 개념·예제와 함께 읽어 보세요. 자료별로 확인할 위치와 관찰할 내용을 적었습니다.

실습 가이드

Compose 의존 서비스의 시작과 준비 상태

Example의 web→db 의존 관계를 먼저 표시하고 Control startup의 세 condition을 비교한다. 준비 검사 성공과 단순 시작이 다른 조건임을 YAML에서 읽을 수 있다.

읽으면서 확인할 것
  • service_started와 service_healthy의 구별
  • 의 interval·retries·start_period 적용 위치
  • depends_on의 restart와 명시적인 Compose 재시작의 관계
공식 가이드

Terraform state가 유지하는 실제 자원 연결

Purpose of 의 Mapping to the Real World와 Metadata를 차례로 읽는다. 구성 주소와 원격 객체 ID를 대응시키고, 구성에서 자원을 지운 뒤에도 제거 순서의 근거를 에 남기는 이유를 확인한다.

읽으면서 확인할 것
  • 구성 속 와 실제 객체의 대응
  • 와 실제 시스템의 차이가 계획에 반영되는 경계
  • 팀 공유 시 원격 저장·동시 수정 통제의 필요성
학습 확인

이해했는지 확인하기

  • 도구별로 관리하는 자원과 설정의 책임을 나눈다.
  • 계획의 삭제·교체와 state 접근 권한을 확인한다.
  • 드리프트와 실패 후 복구 절차를 검토한다.

함께 확인할 공식 자료