개요
테라폼으로 흔히 개발 환경, 스테이징 환경, 프로덕션 환경으로 구분하여 인프라를 구성합니다. 환경을 분리하여 개발을 진행할 때, 개발 환경의 인프라가 프로덕션 환경의 인프라로 배포되는 상황을 피하고자 다음 두 가지 Best Practice를 사용하였습니다.
1.
모듈 디렉터리와 개발 환경별로 디렉터리들로 나누어 환경을 분리하며 개발
2.
terraform workspace 로 환경을 분리하며 개발
do-terraform 스크립트는 두 가지 방법을 혼용하여 인프라 환경을 분리하는 방법을 사용합니다.
do-terraform 스크립트를 사용하여 적용된 모든 커맨드는 logs 디렉터리에 logging 됩니다. github actions 과 함께 사용하기 위해 -l <BUCKET NAME> 옵션을 주어 AWS S3 Bucket 에 로그를 저장 할 수 있습니다.
1.
기본적으로 사용한 모든 커맨드는 ./logs/tf.log 에 저장
2.
apply, destroy 를 사용하여 인프라에 적용되는 커맨드는 ./logs/dev-infra.log 형식으로 저장
가능한 문제 상황
/
|- modules
|
|- live
|- database
|- backend
Bash
modules 디렉터리에 있는 테라폼 모듈을 live 디렉터리에서 모듈을 불러와서 인프라를 구성하는 상황
cd ./live/backend
terraform apply
Bash
1.
환경 분리가 명확하게 되어 있지 않음
2.
terraform workspace 로 환경 분리시 매번 workspace 를 확인하기 어려움 → dev 환경의 인프라를 prod 에 apply 하는 상황이 발생할 수 있음
해결 방안
/
|- modules
|
|- dev
|- database
|- backend
|- prod
|- database
|- backend
Bash
1.
개발 환경별로 디렉터리를 구조화하여 환경 분리를 명확하게 함
cd ./dev/backend
terraform workspace select dev
terraform apply
Bash
2.
현재 개발환경에서 인프라를 적용하기 위해 terraform workspace 와 함께 사용하여 모듈 내에서 terraform.workspace 값을 사용하여 인프라 배포
3.
디렉터리 내의 tfvars 파일을 -var-file 옵션과 함께 일괄 적용
4.
인프라에 반영되는 apply 와 destroy 커맨드를 logging 을 통해 추적
이 시나리오를 일관성 있게 적용하기 위해 do-terraform 스크립트를 작성하였습니다.
개발환경
•
Linux
•
BASH
설치 및 삭제
설치
git clone https://github.com/heechankim/do-terraform.git
cd ./do-terraform
bash ./install.sh
Bash
삭제
cd ./do-terraform
bash ./uninstall.sh
Bash
사용 방법
동작 방식
•
현재 프로젝트에서 글로벌하게 사용할 tfvars 파일을 import
•
Target Path 내에 있는 *.tfvars 파일은 커맨드 실행시 자동으로 -var-file=./*.tfvars 로 포함됨
•
Target Path, 워크스페이스, 커맨드는 필수 인자
커맨드
do-terraform [OPTIONS] TARGET_PATH WORKSPACE COMMAND
Bash
옵션 사용 예
1.
./prod/backend 내의 테라폼 코드를 plan, 프로젝트 전체에 적용되는 tfvars 파일 있음
do-terraform -g ./global/g.tfvars ./prod/backend prod plan
Bash
2.
./dev/database 내의 테라폼 코드 apply, 프로젝트 전체에 적용되는 tfvars 파일 없음, autoapprove 적용
do-terraform -y ./dev/database dev apply
Bash
3.
do-terraform 스크립트를 사용하여 적용한 모든 커맨드를 AWS S3 bucket에 logging
do-terraform -l my-logging-bucket ./dev/database dev apply
Bash
이슈
Workspace
•
현재 사용 가능한 workspace : dev, prod
•
설정 파일로 사용 가능한 workspace 를 지정하는 방식 구현 필요
Terraform Command
•
현재 사용 가능한 command : plan, apply, destroy, output, init
logging
•
인프라 구성에 반영되는 apply, destroy 커맨드는 do-terraform 스크립트를 통해 사용하는 대로 누적 logging 됨
2022-06-17T01:06:36KST [APPLY]$ ./do-terraform.sh -g global/g.tfvars -y -l autosql-infra-terraform-state dev/vpc/ dev apply
2022-06-17T01:13:43KST [APPLY]$ ./do-terraform.sh -g global/g.tfvars -y -l autosql-infra-terraform-state dev/vpc/ dev apply
2022-06-17T01:55:27KST [APPLY]$ ./do-terraform.sh -g global/g.tfvars -y -l autosql-infra-terraform-state dev/vpc/ dev apply
2022-06-17T01:55:38KST [APPLY]$ ./do-terraform.sh -g global/g.tfvars -y -l autosql-infra-terraform-state dev/frontend/ dev apply
2022-06-17T01:59:17KST [APPLY]$ ./do-terraform.sh -g global/g.tfvars -y -l autosql-infra-terraform-state dev/backend/ dev apply
Bash
•
최종 반영된 인프라의 모습을 중복 없이 logging 하는 방법 필요
2022-06-17T01:55:27KST [APPLY]$ ./do-terraform.sh -g global/g.tfvars -y -l autosql-infra-terraform-state dev/vpc/ dev apply
2022-06-17T01:55:38KST [APPLY]$ ./do-terraform.sh -g global/g.tfvars -y -l autosql-infra-terraform-state dev/frontend/ dev apply
2022-06-17T01:59:17KST [APPLY]$ ./do-terraform.sh -g global/g.tfvars -y -l autosql-infra-terraform-state dev/backend/ dev apply
Bash