이 스터디는 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블록을 삭제 해주셔야 합니다.
'스터디 이야기 > Terraform' 카테고리의 다른 글
[T101] 4-2. Terraform - State (0) | 2024.07.04 |
---|---|
[T101] 4-1. Terraform - Provider (0) | 2024.07.02 |
[T101] 3-7. Terraform - null_resource와 terraform_data (0) | 2024.06.28 |
[T101] 3-6. Terraform - 프로비저너 (0) | 2024.06.28 |