본문 바로가기
  • lakescript
스터디 이야기/Terraform

[T101] 3-8. Terraform - moved 블록

by lakescript 2024. 6. 28.

 

더보기

이 스터디는 CloudNet@에서 진행하는 T101 스터디를 참여하면서 공부하는 내용을 기록하는 블로그 포스팅입니다.

CloudNet@에서 제공해주는 자료들과 테라폼으로 시작하는 IaC 를 바탕으로 작성되었습니다.

 

Moved 블록

테라폼의 State에 기록되는 리소스 주소의 이름이 변경되면 기존 리소스는 삭제되고 새로운 리소스가 생성됩니다. 하지만 테라폼 리소스를 선언하다 보면 이름을 변경해야 하는 상황이 발생하기도 합니다.

  • 리소스 이름을 변경
  • count로 처리하던 반복문을 for_each로 변경
  • 리소스가 모듈로 이동하여 참조되는 주소가 변경

리소스의 이름은 변경되지만 이미 테라폼으로 프로비저닝된 환경을 그대로 유지하고자 하는 경우 테라폼 1.1 버전부터 moved 블록을 사용할 수 있습니다. moved 블록 이전에는 terraform state mv 명령을 사용하여 State를 건드려야 하는 부담이 있었다면, moved 블록은 State에 접근 권한이 없는 사용자라도 변경되는 주소를 리소스에 영향 없이 반영할 수 있습니다.

 

moved 블록 테스트용 기본 코드

resource "local_file" "a" {
    content = "foo!"
    filename = "${path.module}/foo.bar"
}

output "file_content"{
    value = local_file.a.content
}

위와 같이 테스트용 코드를 작성하고 terraform apply를 실행합니다. 

local_file의 이름인 'a'를 어떠한 이유에서 'b'로 변경해야 한다고 가정해보겠습니다.

resource "local_file" "b" {
    content = "foo!"
    filename = "${path.module}/foo.bar"
}

output "file_content"{
    value = local_file.a.content
}

단순히 local_file.a를 local_file.b로 변경하고 terraform plan을 수행해보겠습니다.

위의 사진에서 보이시는 것 처럼 local_file.a를 삭제하고 local_file.b를 생성하는 계획이 실행됩니다.

 

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
}

위의 코드는 local_file.a의 프로비저닝 결과를 유지한 채 이름만 변경하기 위해 moved 블록을 활용하여 수정한 코드입니다.

 

 

plan 결과 제거되거나 새로 생성되는 리소스는 없고, 출력 결과에 local_file.a 주소가 local_file.b로 변경되었다는 메시지가 추가로 출력됩니다.

 

terraform apply를 진행하신 후 terraform.tfstate 파일과 terraform.tfstate.backup 파일을 비교해보시면 serial이 1 -> 2로 변경되었고 리소스의 local_name name이 변경됨을 확인하실 수 있습니다.

 

 

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
}

 

이렇게 리펙토링 작업 이후 꼭! Apply를 수행하고 moved블록을 삭제 해주셔야 합니다.