본문 바로가기
DevOps/Terraform

AWS 콘솔에서 만든 CloudFront 배포를 Terraform으로 가져와 관리하는 방법 (terraform import)

by Rainbound-IT 2025. 8. 7.
반응형

목차

     

    AWS에서 CloudFront 배포(Distribution)를 콘솔로 만들었지만, 나중에 코드 기반 관리(IaC)를 위해 Terraform으로 전환하고 싶을 때 어떻게 해야 할까요?

    이번 글에서는 Terraform의 import 기능을 통해 콘솔로 만든 CloudFront 리소스를 Terraform으로 상태 일치시켜 관리하는 전체 과정을 실습 기반으로 정리합니다.


    🎯 목표

    • 콘솔에서 만든 CloudFront 배포를 삭제하지 않고 Terraform으로 가져옴
    • Terraform 상태(state)와 코드(.tf)를 일치시켜 안전하게 관리
    • Terraformer 사용 시 주의점까지 포함

    ✅ 전체 작업 흐름 요약


     

    단계 설명
    1 최소한의 .tf 리소스 블록 작성
    2 terraform import로 상태(state) 연결
    3 terraform state show로 실제 리소스 속성 추출
    4 .tf 코드에 필요한 필수 속성만 수동 반영 (더미 값 포함)
    5 읽기 전용 속성 제거
    6 terraform plan으로 일치 여부 확인 후 관리 시작
     

     Step 1. 최소한의 리소스 선언 (더미 값 필요)

    CloudFront 리소스는 필수 속성이 많아 빈 리소스 블록만으로는 terraform validate 에 실패합니다.

    따라서, 아래처럼 실제 값 또는 더미 값(dummy) 으로 구성된 리소스 블록을 선언해야 합니다:

    resource "aws_cloudfront_distribution" "cf1" {
      enabled             = true
      is_ipv6_enabled     = true
      comment             = "import dummy"
      default_root_object = "index.html"
    
      origin {
        domain_name = "dummy-origin.com"
        origin_id   = "dummy-origin-id"
      }
    
      default_cache_behavior {
        target_origin_id       = "dummy-origin-id"
        viewer_protocol_policy = "redirect-to-https"
        allowed_methods        = ["GET", "HEAD"]
        cached_methods         = ["GET", "HEAD"]
    
        forwarded_values {
          query_string = false
          cookies {
            forward = "none"
          }
        }
      }
    
      restrictions {
        geo_restriction {
          restriction_type = "none"
        }
      }
    
      viewer_certificate {
        cloudfront_default_certificate = true
      }
    }

    이 값들은 import 후 terraform state show 결과를 바탕으로 실제 값으로 교체하면 됩니다.


     Step 2. 상태 import

    terraform init
    terraform import aws_cloudfront_distribution.cf1 E2LBMBNBDI16ZI
    • E2LBMBNBDI16ZI: AWS 콘솔에서 확인한 배포 ID
    • 리소스 이름 cf1과 .tf 코드의 리소스 이름이 반드시 일치해야 합니다

     Step 3. 상태에서 속성 추출

    terraform state show aws_cloudfront_distribution.cf1 > cf1_state.txt

    이 파일에서 CloudFront 설정값을 확인하고 .tf 코드에 반영합니다.
    단, 읽기 전용 속성은 절대 .tf에 넣으면 안 됩니다.


    🚫 넣으면 안 되는 읽기 전용 속성들

    아래 속성들을 .tf 코드에 넣으면 terraform apply 시 다음과 같은 에러가 발생합니다:

    Error: Value for unconfigurable attribute ...

    설명

     

    속성 설명
    arn CloudFront 리소스 ARN
    id 배포 ID
    status 배포 상태 (Deployed, InProgress 등)
    etag 리소스 상태 해시값
    domain_name CloudFront 도메인 (*.cloudfront.net)
    hosted_zone_id Route53 연동을 위한 내부 Zone ID
    caller_reference 내부 유니크 식별자
     

    이 값들은 terraform state show 결과에만 존재해야 하고, .tf 코드에서는 제거해야 합니다.


    🧪 Step 4. .tf 코드에 실제 값 반영

    state show에서 가져온 실제 속성으로 .tf 코드를 채워넣고, terraform plan 으로 확인합니다.

    bash
    복사편집
    terraform plan
    • 결과가 No changes. → 상태와 코드가 일치한 것
    • 이후부터는 완전히 Terraform으로 리소스를 관리할 수 있게 됩니다

    ⚠️ Terraformer로 CloudFront 가져오면 안 되는 이유

    Terraformer는 기존 리소스를 자동으로 .tf 코드와 .tfstate로 추출해 주는 편리한 도구지만, CloudFront에는 적합하지 않습니다. 이유는 다음과 같습니다:


     

    문제점 설명
    필수 속성 누락 Terraformer가 생성한 .tf에 필수 속성들이 빠지거나 더미로 들어감
    읽기 전용 속성 포함 id, arn 등이 그대로 들어가 terraform plan 시 오류 발생
    의존성, 캐시 정책 누락 origin, default_cache_behavior 등 구조적으로 중요한 블록이 비정상적
    상태 병합 어려움 기존 프로젝트와 상태 통합 시 수동 수정 필요
    코드 품질 낮음 naming, 변수화, 모듈 구조 등 팀 표준에 안 맞는 코드 생성
     

    따라서 CloudFront의 경우, Terraformer보다 terraform import + 수동 정리가 훨씬 안전하고 권장됩니다.


     마무리 요약


     

    항목 내용
    CloudFront .tf 코드 작성 필수 속성은 더미 값이라도 채워야 함
    읽기 전용 속성 제거 arn, id, status, caller_reference 등 제거 필수
    상태와 코드 일치 확인 terraform plan 결과가 No changes.이면 완료
    Terraformer 사용 여부 CloudFront에 대해서는 비추천
     

     마무리

    CloudFront는 구조가 복잡하고 설정이 많기 때문에, terraform import 이후에도 수동으로 상태를 분석해 정확히 .tf 코드에 반영하는 작업이 필요합니다.
    그러나 이 초기 과정만 잘 해두면, 이후에는 CloudFront를 안전하고 재현 가능하게 코드로 관리할 수 있습니다.

     

     

    반응형

    댓글