본문 바로가기
IaC

[IaC] Terraform import 개념 및 사용방법

by cloudraw 2024. 6. 3.

안녕하세요, 클라우드로입니다!

 

 이번 글에서는 테라폼 코드 작성 중, Azure, AWS와 같은 CSP 홈페이지에서 직접 배포한 리소스들을 불러와서 state로 관리할 수 있는 "terraform import"에 대해 알아보겠습니다. 

 

terraform import란? 

 먼저 테라폼 공식 문서를 확인해보면, terraform import 명령어로 이미 존재하는 인프라 리소스를 terraform.tfstate 파일로 가져올 수 있다고 명시되어 있습니다. 즉, 명령어를 통해 리소스를 state 형태로 불러와 tfstate 파일을 생성하는 것입니다. 

 

 해당 명령어를 사용하기에 앞서, 선행 작업이 필요합니다. 가장 먼저, csp에 해당하는 인증정보 구성완료입니다. terraform import 명령어는 terraform plan, apply와 같은 CLI 명령어입니다. 따라서 import를 실행하려는 폴더에 main.tf 등이 존재해야하며, csp 인증정보 등이 작성되어 있어야 합니다. 두 번째로, 불러오고자 하는 리소스 블록이 선언되어야 합니다. 앞서 설명한 것처럼, 우리는 terraform import 명령어를 통해 이미 배포되어 있는 리소스의 상태를 불러오게 되는데, 이 때 불러온 상태를 저장할 리소스 즉, 상태를 불러올 매개체를 선언한다고 생각하면 이해가 잘 되실 겁니다. 일반적으로 리소스에 대한 빈 블록으로 진행합니다. 

terraform import 사전 준비 예시

terraform import {리소스 블록의 리소스}.{리소스 블록의 key} {불러올 리소스의 id}

 

 그렇다면 실제 명령어를 살펴보겠습니다. 기본적인 형태는 위와 같습니다. 불러오고자 하는 리소스의 정보가 필요하며, 간혹 리소스마다 <불러올 리소스의 id>에 들어갈 값이 다른 경우가 있습니다. 이는 테라폼 레지스트리 홈페이지를 참고하면 확인할 수 있습니다. 추가적으로 import 명령어를 지원하지 않는 리소스도 간혹 존재합니다. 이 역시 테라폼 레지스트리 홈페이지를 참고하면 확인할 수 있습니다. 

ncloud_cdss_config_group에 대한 terraform import (https://registry.terraform.io/providers/NaverCloudPlatform/ncloud/latest/docs/resources/cdss_config_group)

 

 

 

 지금부터는 직접 ncloud 콘솔에서 배포한 vpc, subnet, login_key, 그리고 server를 불러오는 실습을 진행하겠습니다. terraform import 하기 전, 아래와 같이 리소스 마다 빈 블록을 작성하며 사전 준비를 합니다. 

각 리소스마다 리소스 블록 생성

 

준비가 되었으면, 리소스 별로 terraform import를 진행합니다. 리소스 별로 각각 import 작업을 진행해야 합니다. 리소스 id의 경우, CSP별 콘솔에서 확인할 수 있습니다.

terraform import 실행 후 성공 메세지

 

성공했다면, 위에 그림처럼 성공했다는 "Import successful" 문구를 볼 수 있습니다. 이후 해당 폴더에 terraform.tfstate 파일이 생성된 것을 확인할 수 있습니다. tfstate파일에는 ncloud 콘솔에서 직접 배포하였던 리소스에 대한 정보가 담겨져있습니다.

생성된 tfstate 파일 화면

 

 

terraform import 활용

 이렇게 외부에서 배포한 리소스의 상태를 테라폼으로 확인할 수 있게 되었습니다. 그렇다면, 불러온 리소스를 수정 후 재배포하고 싶을 때는 어떻게 하면 될까요? 일단 재배포하기 위해서는 import 할 때 사용했던 리소스 블록에 값을 불러온 값을 할당하는 작업을 해야합니다. 왜냐하면 현재 상황에서 main.tf의 리소스 블록들은 아무런 정보를 담고 있지 않은, 단순한 매개체에 불과하기 때문에, 필수값에 대한 에러가 발생하게 됩니다. 

빈 리소스 블록에서의 에러

 

 그렇다면 빈 리소스 블록의 내용을 채운 후, 재배포를 진행하면 어떤 결과를 얻을 수 있을까요? 여기서 값을 어떻게 입력하는지에 따라 2가지로 구분할 수 있습니다. 첫 번째는 tfstate와 동일한 값을 입력했을 경우, 두 번째는 tfstate와 다른 값을 입력했을 경우입니다. 

 

 먼저 값을 동일하게 입력했을 경우입니다. terraform.tfstate 파일에 있는 값을 바탕으로 리소스 블록의 내용을 작성한 후에 terraform plan 명령까지 실행해보겠습니다. 

리소스 블록 수정 후, 재배포 결과 화면

 

위의 그림과 같이, "No changes" 그리고 "Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed"가 출력된 것을 확인할 수 있습니다.

이는, 리소스를 불러와 생긴 tfstate 파일과, main.tf을 통해 배포했을 때 생성될 tfstate 파일이 동일하기 때문에 아무런 변화가 없다는 의미입니다.

 

 

이번에는 tfstate와 다른 값을 입력했을 경우를 살펴보겠습니다. tfstate에서 server의 server_image_product_code는 현재 "SW.VSVR.OS.LNX64.CNTOS.0703.B050"로 되어있는 상태입니다. 이를 "SW.VSVR.OS.LNX64.CNTOS.0708.B050"로 변경하여 main.tf를 작성하고 terraform plan을 하면 아래와 같은 결과를 얻을 수 있습니다. 

server_image_product_code 변경으로 인한 forces replacement

 

 위 그림 아래부분에 server_image_product_code의 값이 변경되어 "forces replacement", 그리고 가장 마지막 줄에서 "1 to add, 0 to change, 1 to destroy" 라고 나와있습니다. 이는 기존 서버 리소스가 삭제된 후, 변경된 값으로 새롭게 배포된다는 것을 의미합니다. 이 경우, 만약 terraform apply 까지 실제 진행하면, 기존 리소스가 삭제되게 때문에 주의해야합니다. 

 이번에는 server의 다른 값을 수정해보겠습니다. tfstate에서 is_protect_server_termination 값은 fasle로 되어있습니다. 이를 true 로 변경해서 재배포해보겠습니다. 

is_protect_server_termination 값 변경으로 인한 change

 

"0 to add, 1 to change, 0 to destroy"라고 나온 것 처럼, 이번에는 전 상황처럼 삭제 후 재배포가 아닌, 단순한 업데이트가 된다는 결과를 확인할 수 있습니다. 위의 2가지 예시처럼, 어떤 값을 수정함에 따라 기존 리소스가 삭제된 후 재배포되는 경우도 있고, 단순히 업데이트만 되는 경우도 있습니다. 값을 수정함에 따라 리소스가 삭제되는 것을 꼭 주의하시길 바랍니다. 

 

 

이상으로 terraform import의 개념과 활용법에 대해 알아보았습니다. 

감사합니다.

 


 

    

 

Cloudraw는 쉽게 클라우드 인프라를 그리고 사용할 수 있는 서비스를 제공하기 위해 노력하고 있습니다.

 

클라우드가 있는 곳 어디든 Cloudraw가 함께합니다.

 

📨 help@cloudraw.kr