Terraform

[ Terraform101 Study - 3w ] moved 블록

su''@ 2024. 6. 30. 04:42
Terrafrom T101 4기 실습 스터디 게시글입니다.
"테라폼으로 시작하는 IaC" 도서를 참고하여 정리했습니다. 
moved 블록 - 링크 실습
  • 테라폼의 State에 기록되는 리소스 주소의 이름이 변경되면 기존 리소스는 삭제되고 새로운 리소스가 생성됨을 앞서 설명에서 확인했다.
  • 하지만 테라폼 리소스를 선언하다 보면 이름을 변경해야 하는 상황이 발생하기도 하는데, 예를 들면 다음과 같다.
    • 리소스 이름을 변경
    • count로 처리하던 반복문을 for_each로 변경
    • 리소스가 모듈로 이동하여 참조되는 주소가 변경
  • 리소스의 이름은 변경되지만 이미 테라폼으로 프로비저닝된 환경을 그대로 유지하고자 하는 경우 테라폼 1.1 버전부터 moved 블록을 사용할 수 있다.
  • ‘moved’라는 단어가 의미하는 것처럼 테라폼 State에서 옮겨진 대상의 이전 주소와 새 주소를 알리는 역할을 수행한다.
  • moved 블록 이전에는 State를 직접 편집하는 terraform state mv 명령을 사용하여 State를 건드려야 하는 부담이 있었다면, moved 블록은 State에 접근 권한이 없는 사용자라도 변경되는 주소를 리소스 영향 없이 반영할 수 있다.
  • 실습을 위해서 3.14 디렉터리를 신규 생성 후 열기 → main.tf 파일 생성
    mkdir 3.14 && cd 3.14
    touch main.tf

    resource "local_file" "a" {
      content  = "foo!"
      filename = "${path.module}/foo.bar"
    }
    
    output "file_content" {
      value = local_file.a.content
    }
  • 실행
    #
    terraform init && terraform plan && terraform apply -auto-approve
    cat foo.bar ; echo
    
    #
    terraform state list
    echo "local_file.a" | terraform console
    echo "local_file.a.id" | terraform console
    "4bf3e335199107182c6f7638efaad377acc7f452"
    
    # VSCODE에서 terraform.tfstate 파일 확인
  • main.tf 파일 내용 변경 : 아래 local_file 의 이름을 a → b로 변경 가정
    resource "local_file" "b" {
      content  = "foo!"
      filename = "${path.module}/foo.bar"
    }
    
    output "file_content" {
      value = local_file.b.content
    }
  • plan 확인 : 기존 리소스를 제거하고 새로운 리소스를 생성하려 계획
    #
    terraform plan
    ...
    Plan: 1 to add, 0 to change, 1 to destroy.
  • main.tf 파일 내용 변경 : local_file.a 의 프로비저닝 결과를 유지한 채 이름을 변경하기 위해 moved 블록을 활용
    resource "local_file" "b" {
      content  = "foo!"
      filename = "${path.module}/foo.bar"
    }
    
    moved {
      from = local_file.a
      to   = local_file.b
    }
    
    output "file_content" {
      value = local_file.b.content
    }
  • 실행 : 제거나 생성 없음!
    #
    terraform plan
    ...
    Terraform will perform the following actions:
    
      # local_file.a has moved to local_file.b
        resource "local_file" "b" {
            id                   = "4bf3e335199107182c6f7638efaad377acc7f452"
            # (10 unchanged attributes hidden)
        }
    
    Plan: 0 to add, 0 to change, 0 to destroy.
    
    #
    terraform apply -auto-approve
    terraform state list
    echo "local_file.b" | terraform console
    echo "local_file.b.id" | terraform console
    "4bf3e335199107182c6f7638efaad377acc7f452"

    • VSCODE에서 상태파일과 상태백업파일 비교
    • 이미지 첨부
  • main.tf 파일 내용 변경 : moved 블록을 삭제해서 리팩터링 완료 하자
    resource "local_file" "b" {
      content  = "foo!"
      filename = "${path.module}/foo.bar"
    }
    
    # moved {
    #   from = local_file.a
    #   to   = local_file.b
    # }
    
    output "file_content" {
      value = local_file.b.content
    }

[도전과제5]  moved 블록을 사용한 테라폼 코드 리팩터링을 수행 - 실습