인프라 구축기
Terraform으로 aws 인프라를 지속적으로 관리하던 중 큰 문제 하나를 마주쳤다. 실수로 Terraform의 상태 파일인 terraform.ftstate를 삭제한 것이다. 이번 글에서는 해당 이슈를 해결한 과정을 담아보려고 한다.
terraform.tfstate 개념과 삭제 이슈
terraform.tfstate 개념
terraform.tfstate 파일은 Terraform이 관리하는 인프라의 현재 상태를 기록하는 핵심 파일이다. 이 파일은 인프라가 Terraform 구성과 어떻게 일치하는지, 어떤 리소스가 실제 클라우드 환경에 존재하는지 파악하는 데 필수적이다. 즉, 이 파일을 통해 어떤 리소스가 클라우드에 생성돼 있고 apply 시 생성/변경/삭제할 리소스가 무엇인지 인식한다.
삭제 이슈
정말 해서는 안 되는 행동이었지만, 삭제하게 된 과정을 설명해보려고 한다.
- github에 terraform 코드를 지속적으로 push 하며 진행 -> terraform.tfstate는 .gitignore 설정
- 회사 노트북과 개인 노트북을 번갈아 가며 사용 -> terraform.ftstate 일치 X, 파일을 삭제하는 상황 발생
- 어쩌다 보니 실수로 양 쪽 노트북에 terraform.tfstate를 모두 삭제해 버림 😢😢
문제 해결 과정
해결 방법 결정
해결 방법을 고심하다가 두 가지의 방법을 도출하게 되었다.
- 모든 aws 리소스를 제거하고, 다시 apply 후 인프라 재구축
- terraform import를 활용해 각 리소스를 하나씩 .tfstate 파일에 추가
둘 다 귀찮고, 시간이 어느 정도 걸리는 작업이다. 그러나 인프라 구성이 거의 마무리 단계였고, 재구축을 진행하며 새로운 이슈를 만날 것 같아 두 번째 방법을 선택하였다.
terraform 파일 구조 변경
- 변경 전
- 원래 ./vpc, ./instance, ./lambda, ./storage 디렉터리가 있고, 최상단의 main.tf에서 terraform을 관리
- 각 디렉터리는 하나의 모듈로써 main.tf에서 사용되었음
- 타 모듈의 변수를 사용하기 위해 output - variable 사용
- 변경 후
- 최상단의 main.tf를 제거하고, 각 디렉터리에서 terraform을 관리
- 타 모듈의 변수를 사용하기 위해 output - data 사용, variable.tf -> data.tf로 파일 명 변경
- 목적 및 이점
- main.tf에서는 module로 작성되어 있어 각 리소스를 terraform import 할 수 없음
- 리소스 별 디렉터리로 관리함으로써 독립적으로 관리 가능
- data를 사용하는 모듈에서는 "data" 선언 하나만으로 output된 변수 모두 사용 가능
# storage의 output된 변수 사용
data "terraform_remote_state" "storage" {
backend = "local"
config = {
path = "../storage/terraform.tfstate"
}
}
terraform import
- terraform import 명령어를 활용해 각 리소스를 .tfstate 파일에 추가
- 리소스에 따라 import 형식이 조금씩 차이가 있기에 공식 문서를 참고하여 작성
- .tfstate를 잘 관리해야겠다는 깨우침을 준 명령어 -> 고된 작업이었다..
terraform import aws_vpc.popboard <vpc id>
terraform import aws_subnet.public_subnet_2a_1 <subnet id>
terraform import aws_eip.nat_eip <eip id>
...
교훈
- .tfstate 파일은 삭제하지 말자, 차라리 지속적으로 백업을 해두자
- 원격 저장소 (ex. S3)를 활용해 안정적으로 .tfstate를 관리하자
Reference
'Infra > [인프라 구축기] Terraform 활용 AWS 인프라 구축' 카테고리의 다른 글
인프라 구축기 (11) - lambda IAM role 수정 (1) | 2024.10.29 |
---|---|
인프라 구축기 (10) - IAM 생성 코드 추가 (2) | 2024.10.26 |
인프라 구축기 (8) - Lambda를 활용한 AWS 인스턴스 시작, 중지 자동화 (1) | 2024.10.19 |
인프라 구축기 (7) - Airflow 및 Redshift 사용자 생성, 권한 설정 (1) | 2024.10.18 |
인프라 구축기 (6) - 로컬에서 Private EC2 Airflow Web Server 접속 (0) | 2024.10.17 |