1. 테라폼의 상태 파일
테라폼의 구성 파일(configuration)과 달리 상태 파일(terraform.tfstate)은 버전 제어 시스템(github)에 저장하지 않는 것이 권장됩니다. 왜냐하면 상태 파일은 인프라에 대한 모든 정보를 저장하고 있기 때문에 민감한 세부 정보를 타인이 확인할 수 있어서 그렇습니다.
그래서 테라폼 상태 파일은 안전한 공유 저장소(S3, hashicorp cloud, google cloud storage, terraform cloud)에 저장하는 것이 권장됩니다.
S3는 백엔드 옵션으로 상태 잠금을 지원합니다. 그래서 여러 사용자가 동시에 terraform 상태 파일을 변경하는 것을 방지할 수 있습니다.
여러 사용자가 동시에 같은 상태 파일에 접근해서 변경을 시도하는 경우, 충돌이 발생할 수 있고, 상태 파일이 손상되거나, 예기치 않은 인프라 변경이 발생할 수 있기에 상태 잠금(state-locking)이 필요합니다.
2. 테라폼 블록을 이용한 S3로의 추가 설정 정의
아래와 같은 코드를 실행하면 리소스가 생성되고 예상대로 테라폼은 로컬 상태 파일(terraform.tfstate)을 만들게 됩니다.
# main.tf
resource "local_file" "pet" {
filename = "/root/pets.txt"
content = "We love pets!"
}
상태 파일을 로컬이 아닌 s3에 저장하기 위해서 아래와 같이 테라폼 블록을 정의해 다시 한 번 terraform init, apply를 실행해 줍니다.
# terraform.tf
terraform {
backend "s3" {
bucket = "kodekloud-terraform-state-bucket01"
key = "finance/terraform.tfstate"
region = "us-west-1"
dynamodb_table = "state-locking"
}
}
# 내부 값은 상황에 맞게 변경!
*일반적으로 테라폼 블록은 main.tf와 다른 파일로 만들어 같은 구성 디렉토리에 위치시키는 것이 일반적입니다.
테라폼 블록에서 backend 업무를 수행할 것을 명시하고, 백엔드의 유형은 "s3"로 지정합니다. bucket은 버킷의 이름이고, key는 상태 파일이 저장되어야 할 위치를 의미합니다. region은 지역이고, dynamodb_table은 상태 잠금을 의미합니다.
terraform init을 실행하면 yes를 입력하라는 창이 출력되는데 새로운 s3 백엔드에 복사할 수 있도록 허용해 달라는 뜻입니다.
그 뒤에 구성 디렉토리에 있는 로컬 상태 파일은 삭제해도 좋습니다
rm -rf terraform.tfstate
3. 테라폼 상태 파일 관리 명령어
1. 상태 파일 관리 리소스 목록 출력
# 상태 파일에서 관리 중인 리소스의 목록 출력
terraform state list
이 명령어를 입력하면 다음과 같이 출력될 수 있습니다.
local_file.classics
local_file.hall_of_fame
local_file.new_shows
local_file.top10
2. 상태 파일에서 특정 리소스 삭제
terraform state rm local_file.hall_of_fame
명령어를 이렇게 입력하면 local_file.hall_of_fame이 삭제됩니다. 하지만 리소스가 상태 파일에서 제거된 것이지(테라폼은 더 이상 이 리소스를 추적하지 않습니다) 실제 인프라에서 삭제한 것은 아니기 때문에 실제 인프라에선 작동하게 됩니다.
3. 상태 파일 이름 변경
terraform state mv <원래이름> <바꿀이름>
main.tf 파일의 리소스 이름을직접 vim으로 수정하는 대신 terraform state mv 명령어를 사용해야 합니다. 왜냐하면 main.tf에서 리소스 이름을 직접 변경하면 terraform 상태와 실제 코드 사이에서 불일치가 일어나게 됩니다.
단순히 코드에서 이름을 변경하면 terraform은 기존 리소스를 삭제하고 새로운 리소스를 생성하려 할 수 있습니다.
이렇게 구성된 리소스 파일이 있는데
# main.tf
resource "aws_dynamodb_table" "state-locking" {
name = "state-locking"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
terraform state mv aws_dynamodb_table.state-locking aws_dynamodb_table.state-locking-db
위 처럼 명령어를 적는다고 하면, 실제 인프라에서 구동되고 있는 dynamodb의 이름이 바뀌는 것이 아니라 리소스의 이름만 바뀌게 됩니다.
resource "aws_dynamodb_table" "state-locking-db" {
name = "state-locking"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
실제 인프라에서는 위에 있는 코드처럼 됩니다. 그후 이름을 vim main.tf를 이용해 state-locking을 state-locking-db로 변경해주면, 테라폼 상태와 실제 인프라를 동기화된 상태로 유지하면서 안전하게 리소스 이름을 변경할 수 있습니다.
'[Cloud] > [Terraform]' 카테고리의 다른 글
[Terraform] 프로비저너와 사용자 데이터 (0) | 2024.08.09 |
---|---|
[Terraform] 테라폼으로 AWS DynamoDB 생성, 업로드(GSI) (0) | 2024.08.08 |
[Terraform] 테라폼 라이프 사이클(create_before_destroy, prevent_destroy) (1) | 2024.08.06 |
[Terraform] 리소스 참조(암묵적 참조, 명시적 참조) (0) | 2024.08.05 |
[Terraform] 테라폼 변수 타입 종류 (0) | 2024.08.05 |