brunch

You can make anything
by writing

C.S.Lewis

by 강진우 May 13. 2019

Terraform의 remote_state 활용하기

Terraform

Terraform에는 remote_state라는 기능이 있습니다. 이 기능은 Terraform을 통해서 만든 인프라 구성 요소를 다른 모듈 혹은 다른 파일에서 참조할 수 있게 하는 기능입니다. 오늘은 remote_state가 무엇인지 그리고 어떻게 활용할 수 있는지 살펴보겠습니다.


state 파일


remote_state에 대해 이야기하기 전에 state 파일에 대해서 살펴보겠습니다. Terraform은 코드로 만들어진 인프라를 형상화한 후 형상화한 결과를 state 파일에 저장합니다. state 파일은 로컬에 JSON 형태로 저장할 수도 있지만 외부 저장소에 저장할 수도 있습니다. 그리고 AWSTerraform으로 형상화할 때는 대부분 S3DynamoDB를 사용합니다.

state 파일 생성 과정

간단하게 코드로 살펴보겠습니다. 아래는 AWS VPC를 생성하는 아주 간단한 TF 코드입니다. 

VPC 생성을 위한 TF 코드

이 코드를 실행시키고 나면 로컬에 terraform.tfstate라는 파일이 생성되어 있을 겁니다. terraform.tfstate 파일은 Terraform이 인프라를 형상화한 결과를 저장하는 파일입니다. 어떻게 되어 있는지 살펴보겠습니다.

terraform.tfstate 예제

보이는 것처럼 우리가 위에서 Terraform을 통해 VPC를 만든 후 생성된 VPC의 정보들을 저장하고 있습니다. Terraform에서는 이 파일을 통해서 TF 코드를 수정할 때마다 인프라의 어떤 부분이 변경되는지를 추적할 수 있게 됩니다. 하지만 이렇게 TF 파일이 로컬에만 존재한다면 다수의 엔지니어들이 작업을 할 때 현재 인프라의 형상을 공유할 수 없게 됩니다. 그래서 Terraformbackend라는 지시자를 통해 원격지에 state 파일을 저장할 수 있게 해 줍니다. 위에 VPC를 생성하는 코드에 state 파일을 저장하는 코드를 추가해 보겠습니다.

S3 backend와 관련된 코드가 추가된 상태

그리고 terraform init을 입력하면 아래와 같이 Local에 저장되어 있는 현재의 state 파일의 내용을 S3state 파일에 복사할 것인지를 묻습니다. 

backend 변경

여기까지 완료되면 Terraformstate 파일을 원격지인 S3에 저장할 수 있는 준비가 끝납니다. 여기까지만 하면 remote_state로 해당 state 파일을 사용할 수 있을까요? 그렇지 않습니다. 한 가지 작업이 더 필요합니다. 바로 output이라는 지시자입니다. output 지시자는 어떤 역할을 할까요?


output 지시자


output 지시자는 Terraform으로 만들어진 인프라의 요소들 중 특정 값을 출력하고 이를 state 파일의 output이라는 섹션에 저장합니다. 위에서 사용했던 VPC 생성 코드를 아래와 같이 고쳐 보겠습니다.

output 지시자 추가

생성된 VPCIDoutput으로 지정하게 되면 아래와 같이 terraform apply시 해당 값이 출력됩니다.

terraform apply의 결과

그리고 이 값은 state 파일의 output 섹션 안에 저장됩니다.

state 파일에 저장된 VPC ID
remote_state는 바로 state 파일의 output에 저장된 값을 가져와서 사용하는 기능입니다. 

그럼 이제 본격적으로 remote_state를 활용하는 방법을 살펴보겠습니다.


remote_state를 통해 VPC ID 가져오기


같은 파일 혹은 같은 디렉터리 내에 TF 코드가 있으면 TF 코드들은 각각의 리소스를 참조할 수 있습니다만, 아예 다른 디렉터리에서 새롭게 만들어지는 TF 코드는 다른 폴더에 있는 TF 코드의 리소스를 참조할 수 없습니다. 그래서 다른 TF 코드에서도 참조할 만한 전역적인 인프라 구성 요소는 위와 같이 output 지시자를 통해 state 파일에 저장하는 것이 향후 확장성에도 좋습니다. 아래 예제는 우리가 위에서 만든 VPC ID를 참고해서 보안 그룹을 생성하는 예제입니다.

remote_state 사용하기

형식은 보이는 것처럼 data.terraform_remote_state까지는 똑같고 data 지사지에 의해 지정된 remote_state 이름과 해당 state 파일에 기록된 output 섹션 안에 저장된 필드 이름입니다.

이와 같이 remote_state를 사용하면 다른 TF 코드에서 생성한 리소스들도 참조할 수 있습니다.

remote_state를 통해 리소스를 서로 참조하는 과정

마치며


오늘 글에서는 Terraform remote_state에 대해서 살펴봤습니다. remote_state는 대규모의 인프라를 형상화할 때 가독성과 작업 효율성을 높이는데 많은 도움이 됩니다. 다양한 인프라 구성 요소를 하나의 파일로 만들 수도 없을뿐더러, 하나의 디렉터리 안에서 만드는 것도 매우 복잡하기 때문입니다. 특히 다양한 구성 요소에서 참조하게 되는 VPC IDSubnet ID 등등을 remote_state로 참조할 수 있도록 하는 것은 Terraform을 통한 인프라 형상화 작업을 고도화하는데 많이 사용됩니다. 하지만 remote_state를 사용하기 위해서는 참조하고자 하는 리소스를 반드시 output 지시자를 통해 state 파일의 output 섹션에 기록될 수 있도록 해야 한다는 것을 잊지 마시기 바랍니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari