Windows 10 환경에서 Terraform을 이용한 AWS 자원 배포 - 6. Terraform 상태 파일 격리
Terraform의 상태 파일 격리
Terraform은 상태 파일을 기준으로 실제 Resource를 관리하고 배포하는데,
만약 하나의 상태 파일을 가지고 모든 Resource를 관리할 경우 하나의 변경으로 인해 모든 Resource가 영향을 받게 된다.
이와 같이 서로 영향을 주지 않아야 하는 다수의 환경이 존재할 경우 상태 파일 격리가 필요하다.
그림과 같이 상태 파일을 격리할 경우
개발 환경의 상태 파일이 변경되어도 운영 환경에 지장이 없도록 관리할 수 있다.
Terraform에서 상태 파일을 격리하는 방법은 크게 2가지로 나뉜다.
- 작업 공간을 통한 격리 (Isolation via workspaces)
- Terraform에서 제공하는 workspace를 사용하는 방법이며,
명령어만으로 상태 파일을 격리해 사용할 수 있으므로 테스트 환경에서 주로 유용하다.
- Terraform에서 제공하는 workspace를 사용하는 방법이며,
- 파일 레이아웃을 이용한 격리 (Isolation via file layout)
- 실제 디렉토리/폴더를 분리해 격리하는 방법이며, 보다 강력하게 격리해 서로 미치는 영향을 줄이므로 운영 환경에 적합하다.
- 작업 공간을 통한 격리 Isolation via workspaces
- 동일한 구성에서 빠르고 격리된 테스트 환경에 유용
- 파일 레이아웃을 이용한 격리 Isolation via file layout
- 보다 강력하게 분리해야 하는 운영 환경에 적합
1. Terraform Workspace를 사용하는 방법
Terraform에서 제공하는 명령어를 사용하면 된다.
// 현재 사용 중인 workspace 출력
terraform workspace show
// mywork1이라는 workspace를 생성
terraform workspace new mywork1
// 생성된 workspace 목록을 출력
terraform workspace list
// mywork1이라는 workspace로 전환
terraform workspace select mywork1
사용법은 어렵지 않으며 사용 시 몇 가지 아쉬운 점이 확인된다.
- 별도 명령어를 입력하지 않으면 현재 작업 중인 workspace를 알 수 없어 Human Error가 발생할 확률이 존재한다.
(workspace를 출력해주는 쉘 스크립트나 plugin도 존재한다고 한다.) - workspace별로 다른 인증을 사용하지 않아 권한 통제 등 보안 설정이 불가능하다.
(예를 들어, A앱 개발 환경과 똑같은 환경을 만들기 위해 B앱 개발 workspace를 만들었을 때
A와 B앱의 사용자가 달라 권한을 분리해야 할 경우 대응할 수 없다.)
2. Terraform 파일 레이아웃을 이용한 격리
실제 환경의 목적과 각 파일의 용도에 따라 폴더를 분리해서 생성/관리한다.
아래는 스터디 실습을 위해 생성한 폴더 및 파일의 예시다.
c:\terraform_study\git_repository\ersia_t101>tree /F week3
Folder PATH listing
C:\TERRAFORM_STUDY\GIT_REPOSITORY\ERSIA_T101\WEEK3
├───global
│ └───s3
│ │ .terraform.lock.hcl
│ │ main.tf
│ │ outputs.tf
│ │ terraform.tfstate
│ └───terraform.tfstate.backup
│
└───stage
├───data-stores
│ └───mysql
│ │ .terraform.lock.hcl
│ │ main-vpcsg.tf
│ │ main.tf
│ │ outputs.tf
│ └───variables.tf
│
└───services
└───webserver-cluster
│ .terraform.lock.hcl
│ main.tf
└───user-data.txt
최상위 폴더
- stage : 테스트 환경과 같은 운영 적용 전 workload 환경
- global : S3, IAM과 같이 모든 환경에서 사용되는 리소스를 배치
각 환경별 구성 요소
- services : 해당 환경에서 서비스되는 애플리케이션, 각 앱은 자체 폴더에 위치하여 다른 앱과 분리
- data-storage : 해당 환경 별 데이터 저장소. 각 데이터 저장소 역시 자체 폴더에 위치하여 다른 데이터 저장소와 분리
각 terraform 파일을 생성 시 vpc나 network 등 용도에 맞게 naming 해주면 된다.
이와 같이 구성할 경우 각 폴더 별로 모듈화 할 수 있기도 하고, 코드를 탐색하고 구성 파악을 하기에 유리하다.
또한, 실제 폴더가 분리되어있기 때문에 한쪽에서 잘못된 작업이 있을 경우 문제가 전체 시스템으로 퍼지지 않는다.
하지만 위와 같이 각 폴더 별로 terraform init이 수행되기 때문에 terraform apply를 각 폴더로 이동해서 수행해야 하는 번거로움이 있다.
참고자료
- 테라폼 공식 홈페이지 : https://developer.hashicorp.com/terraform/intro
- 테라폼 상태 파일 격리 개념 : https://blog.gruntwork.io/how-to-manage-terraform-state-28f5697e68fa
- 테라폼 상태파일을 격리하지 않았을 경우 예시 : https://charity.wtf/2016/03/30/terraform-vpc-and-why-you-want-a-tfstate-file-per-env/
- 이미지 아이콘 출처 : https://www.pngwing.com/ko/free-png-zwybn