새소식

IaC/Terraform

3주차(2)_File Layout 을 이용한 tfstate 파일 격리

  • -
CloudNet@ 팀의 가시다님께서 Leading 하시는 Terraform T101 Study 내용 요약

 

해당 Terraform Study 는 Terraform Up and Running 책을 기반으로 진행 중입니다.

 

 

이번에는 File Layout 을 이용한 tfstate 파일 격리 방안에 대해서 알아보자



 

1. Preview


  • 다음과 같은 File Layout 으로 리소스를 격리해보고자 한다.
├── 01_global
│   └── 01_s3
│       ├── 10_main_backend.tf
│       └── 99_outputs.tf
└── 02_stage
    ├── 01_data-stores
    │   └── 01_mysql
    │       ├── 01_variables.tf
    │       ├── 10_main_vpc.tf
    │       ├── 11_main_rds.tf
    │       └── 99_outputs.tf
    └── 02_services
        └── 01_webserver-cluster
            ├── 10_main_web.tf
            └── 11_user-data.sh

 

File Layout 을 사용하는 것의 장점
  1. 특정 리소스 별로 분리하여 관리 가능
    workspace 는 모든 리소스의 tfstate 파일이 한 백엔드에 저장되어 있지만,
    File Layout 을 사용하면 리소스 별로 tfstate 파일을 분리할 수 있다.

    이를 활용하면 자주 변경되지 않는 VPC 리소스와 자주 변경되는 EC2 리소스 등을
    별도의 tfstate 파일로 관리할 수 있게 되는 것이다.

  2. workspace 를 사용할 때보다 유연한 환경 생성 가능
    workspace 는 동일한 테라폼 코드를 변수만 다르게 하여 다른 환경에 배포하는 것에 유용하다.
    하지만, 만약 환경별로 다른 보안 체계를 적용하거나 환경별로 다른 리소스를 생성하고 싶을 때는 고민이 생길 것이다.

    물론 삼항연산자를 통해 workspace 명에 따른 리소스 배포도 가능하지만
    그렇게 된다면 코드의 복잡도가 증가하여 협업하는 데 불리할 수도 있다.

    때로는 함수를 많이 사용하여 코드를 짧게 짜는 것보다
    코드의 중복이 있더라도 타인이 빠르게 이해할 수 있는 코드가 더 좋을 수도 있다.

    File Layout 을 통해 각각의 환경 별 리소스를 배포한다면 보다 더 유연하고 가독성 높은 코드를 작성할 수 있을 것이다.

 

File Layout 을 사용하는 것의 단점
  1. 리소스 배포에 대한 번거로움이 증가
    File 을 리소스 별로 분리시켰기 때문에,
    해당 리소스를 배포하고 싶다면 손수 해당 위치에서 테라폼 명령어를 통해서 배포시켜줘야 한다는 번거로움이 존재한다.
    Terragrunt 를 이용한다면 이 과정을 자동화할 수 있긴 하다.
  2. 리소스 참조의 어려움
    같은 폴더 내에 테라폼 파일들이 위치해 있다면 리소스 간 참조가 가능하지만,
    다른 폴더 내에 파일이 위치한다면 리소스 간 참조가 어렵다.

    다행히 'terrafrom_remote_state' 라는 데이터 소스를 사용해 해결할 수 있다.
    해당 데이터 소스는 테스트 중에 사용할 예정이며, 그 때 다시 보도록 하자 !

 

workspace 와 file layout 중 어느 것이 정답이라고 할 수 없다.
본인의 환경을 고려하여 둘 중 하나를 사용하거나 둘 다 사용할 수도 있다.

 

그럼 File Layout 에 대해서 알아보도록 하자 !

 

 

이번 File Layout 에 대한 코드는 아래의 GitHub 주소에 저장되어 있다.

 

GitHub - AlarmKimKB/terraform_file_layout: File Layout

File Layout. Contribute to AlarmKimKB/terraform_file_layout development by creating an account on GitHub.

github.com

 

2. 테라폼 리소스 배포


2.1. S3 Backend 생성

위에서 받은 테라폼 코드를 실행해서 S3 Backend 를 생성하자.
Bucket 명은 고유해야하기 때문에 별도로 변경해주자

cd 01_global/01_s3
terraform init && terraform plan && terraform apply -auto-approve

 

2.2. VPC & RDS 배포

웹 서버 생선 전, 웹 서버가 배포되고 바라보게 될 VPC 와 RDS 를 먼저 생성해야 한다.

 

rds 와 variables.tf 파일을 보면 DB username, password 가 변수처리 되어있다.

변수에 Default 값을 입력해서 처리할 수 있지만 이번에는 터미널에 변수를 입력해서 적용해보자

 

# Mac 

export TF_VAR_db_username='terraform'
export TF_VAR_db_password='terraform!'

# Windows

set TF_VAR_db_username=terraform
set TF_VAR_db_password=terraform!
cd /02_stage/01_data-stores/01_mysql
terraform init && terraform plan && terraform apply -auto-approve

 

  • VPC 및 RDS 배포를 성공하면 S3 에 tfstate 파일이 저장되어 있을 것이다.

 

File Layout 을 다시 한 번 살펴보자
 02_stage
    ├── 01_data-stores
    │   └── 01_mysql
    │       ├── 01_variables.tf
    │       ├── 10_main_vpc.tf
    │       ├── 11_main_rds.tf
    │       └── 99_outputs.tf
    └── 02_services
        └── 01_webserver-cluster
            ├── 10_main_web.tf
            └── 11_user-data.sh

 

현재 mysql 이 속한 테라폼 코드는 성공적으로 배포되어 S3 에 원격 저장되어 있다.
이제 우리는 02_services/01_webserver-cluster 에 속한 코드를 배포할 일만 남았다.

 

앞에도 설명했듯이 테라폼 코드는 기본적으로 다른 곳에 위치한 코드를 참조할 수 없다.
이 때 terraform_remote_state 데이터 소스를 사용할 것이다.



2.3. Web 배포

web 서버 테라폼 코드를 살펴보자

cd 02_stage/02_services/01_webserver-cluster

 

  • 계속 말하는 terraform_remote_state 데이터 소스가 들어가있다.
data "terraform_remote_state" "db" {
  backend = "s3"
  config = {
    bucket = "scott-terraform-study-tfstate"
    key    = "stage/data-stores/mysql/terraform.tfstate"
    region = "ap-northeast-2"
  }
}

 

바로 눈치챘겠지만, 해당 리소스는 원격 백엔드에 저장된 tfstate 파일을 참조할 수 있게 불러오는 역할을 한다.
다만, 모든 상태 정보라기 보다는 output 으로 기입한 출력 변수에 한해 아래와 같은 형식으로 리소스를 참조할 수 있다.

data.terraform_remote_state.<NAME>.outputs.<ATTRIBUTE>

 

해당 리소스를 어떻게 사용하는 지 서브넷 코드를 보면서 다시 확인하자.


resource "aws_subnet" "scott_subnet1" {
  vpc_id     = data.terraform_remote_state.db.outputs.vpcid
  cidr_block = "10.10.1.0/24"

  availability_zone = "ap-northeast-2a"

  tags = {
    Name = "terraform-subnet1"
  }
}

 

서브넷은 배포할 때 어떤 VPC 에 배포할 지 지정해줄 수 있다.
지금은 앞서 RDS 와 같이 배포한 VPC 에 서브넷을 배포하고 싶은 상황이다.
앞서 VPC 를 배포할 때, outputs.tf 파일 내용을 보면 해당 VPC ID 가 vpcid 라는 변수 안에 저장이 된 것을 확인할 수 있다.

 

때문에 vpc_id 에 data.terraform_remote_state.db.outputs.vpcid 를 사용함으로써 해당 VPC 정보를 참조할 수 있는 것이다.

 

해당 정보를 확인했다면 바로 배포하고 ALBDNS:8080 포트로 확인해보자

 

tfstate 파일은 어떻게 저장될까??

S3 를 확인해보면 각각 다른 디렉토리의 tfstate 파일로 저장이 되는 것을 확인할 수 있다.

 

실습 진행 후에는 반드시 리소스를 삭제하자!

 


 

이번에는 File Layout 을 통한 tfstate 파일 격리에 대해 알아보았다.

File Layout 을 잘 사용하기 위해서는 결국 2가지가 중요한 것 같다.

 

1. 리소스 배포 시, 이후에 어떤 값을 참조에 사용할 것인 지 결정하여 output 으로 출력

2. 해당 값을 terraform_remote_state 로 불러와서 사용

 

다음에는 테라폼 모듈에 대해서 알아보자 !! 

Contents

포스팅 주소를 복사했습니다