terraform.tfstate 파일을 삭제하면 안되는 이유
terraform.tfstate 파일을 삭제하면 안되는 주요 이유들을 다음과 같이 설명할 수 있습니다:
## 인프라 상태 관리 손실
terraform.tfstate 파일은 Terraform이 관리하는 인프라의 현재 상태를 저장하는 핵심 파일입니다[1]. 이 파일이 삭제되면:
- Terraform이 기존에 생성한 리소스들의 상태 정보를 잃게 됩니다
- 실제 인프라와 Terraform 코드 간의 매핑 정보가 사라집니다
- 리소스들 간의 의존성 정보가 손실됩니다[1]
## 리소스 관리의 어려움
상태 파일이 삭제되면 다음과 같은 문제가 발생합니다:
- Terraform이 기존 리소스를 인식하지 못해 동일한 리소스를 중복 생성하려고 시도합니다[6]
- 리소스 수정이나 삭제가 어려워집니다
- terraform destroy 명령어로 리소스를 정리할 수 없게 됩니다[6]
## 인프라 불일치 문제
상태 파일 없이 Terraform을 실행하면:
- 실제 인프라와 코드 간의 차이를 파악할 수 없습니다[2]
- 리소스의 현재 상태를 추적할 수 없게 됩니다
- 의도하지 않은 리소스 변경이나 충돌이 발생할 수 있습니다[1]
## 권장 사항
상태 파일의 안전한 관리를 위해:
- 상태 파일을 S3, Azure Blob Storage 같은 원격 백엔드에 저장합니다[5]
- 상태 파일 잠금(State Locking) 기능을 사용하여 동시 수정을 방지합니다[5]
- 정기적으로 백업을 수행하고 버전 관리를 합니다[5]
- Git과 같은 소스 컨트롤에는 저장하지 않습니다[1]
인용:
[1] [Terraform] 인프라 리소스 관리 - state와 backend https://omoknooni.tistory.com/72
[2] State File in Terraform: What Do You Need to Know? - Anywhere Club https://aw.club/global/en/blog/state-file-in-terraform-what-you-need-to-know
[3] Recovering Lost Terraform State for Accidental Deletion or Corruption https://www.linkedin.com/pulse/recovering-lost-terraform-state-accidental-deletion-corruption-hoang
[4] State | Terraform - HashiCorp Developer https://developer.hashicorp.com/terraform/language/state
[5] What is Terraform State File? Explained With Examples https://blog.techiescamp.com/terraform-state-file/
[6] TerraWeek#Day 4-Importance of State in Terraform - Gajanan https://gajananb.hashnode.dev/terraweekday-4-importance-of-state-in-terraform
[7] Managing Terraform State - Best Practices & Examples - Spacelift https://spacelift.io/blog/terraform-state
terraform.tfstate 파일이 꼬이지 않아?
이유와 해결방법 알려줘
terraform.tfstate 파일이 꼬이는 주요 원인과 해결방법을 설명해드리겠습니다.
## 문제 발생 원인
1. **동시 작업으로 인한 충돌**
- 여러 사용자가 동시에 같은 상태 파일을 수정할 때 발생[2]
- 상태 파일의 부정합과 Race Condition 발생 가능성[2]
2. **부적절한 상태 파일 관리**
- 로컬에서만 상태 파일을 관리할 경우 발생[2]
- Git과 같은 소스 컨트롤에 직접 저장 시 문제 발생[2]
## 해결 방안
**1. 원격 백엔드 구성**
```hcl
terraform {
backend "s3" {
bucket = "terraform-state-bucket"
key = "terraform.tfstate"
region = "ap-northeast-2"
dynamodb_table = "terraform-lock"
encrypt = true
}
}
```
**2. DynamoDB를 이용한 State Locking 구현**
```hcl
resource "aws_dynamodb_table" "terraform_lock" {
name = "terraform-lock"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
```
**3. S3 버킷 버전관리 활성화**
```hcl
resource "aws_s3_bucket_versioning" "terraform_state" {
bucket = aws_s3_bucket.terraform_state.id
versioning_configuration {
status = "Enabled"
}
}
```
## 권장 사항
1. **상태 파일 중앙화**
- S3와 같은 원격 저장소 사용[2]
- 팀원 간 동일한 상태 파일 참조 가능[5]
2. **버전 관리**
- S3 버킷의 버전관리 기능 활성화[3]
- 상태 파일 변경 이력 추적 가능
3. **잠금 메커니즘 사용**
- DynamoDB를 통한 State Locking 구현[5]
- 동시 작업 방지 및 데이터 일관성 유지
4. **백업 관리**
- 상태 파일의 자동 백업 구성[5]
- 문제 발생 시 복구 가능성 확보
이러한 조치들을 통해 terraform.tfstate 파일의 무결성을 유지하고 안전하게 관리할 수 있습니다.
인용:
[1] Terraform State file의 Terraform 버전 변경하기 (AWS 기준) - velog https://velog.io/@jay-side-project/Terraform-State-file%EC%9D%98-Terraform-%EB%B2%84%EC%A0%84-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0-AWS-%EA%B8%B0%EC%A4%80
[2] [Terraform] 인프라 리소스 관리 - state와 backend https://omoknooni.tistory.com/72
[3] Terraform의 tfstate를 원격으로 관리하기 https://blog.outsider.ne.kr/1290
[4] Terraform 상태 관리하기 - velog https://velog.io/@jaehan/Terraform-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0
[5] [Terraform] 테라폼 Locking과 Backup (S3, DynamoDB) - kim.dragon https://kim-dragon.tistory.com/210
[6] 테라폼 Terraform 리소스 변경, 삭제 - 두두네 클라우드 - 티스토리 https://daaa0555.tistory.com/369
[7] 32탄-9. 4주 차-테라폼-State의 목적과 의미 - 브런치스토리 https://brunch.co.kr/@topasvga/3382
[8] 테라폼 t102 스터디 - state - 악분의 블로그 https://malwareanalysis.tistory.com/633
github actions로 terraform 리소스를 배포하고 있어.
강제 종료 시 에러가 왜 나는지 설명해주고, 조치 방안을 step by step으로 자세히 알려줘
GitHub Actions에서 Terraform 배포 중 강제 종료 시 발생하는 문제와 해결 방안을 설명해드리겠습니다.
## 문제 원인
GitHub Actions에서 Terraform 작업을 강제 종료하면 다음과 같은 문제가 발생합니다:
1. 상태 파일이 잠금 상태로 유지되어 후속 Terraform 작업이 실행되지 않습니다[3].
2. 작업이 정상적으로 종료되지 않아 상태 파일이 비어있거나 동기화되지 않을 수 있습니다[3].
3. 리소스는 생성되었지만 상태 파일에 기록되지 않아 관리가 어려워질 수 있습니다[3].
## 해결 방안
**1. 워크플로우 설정 개선**
```yaml
name: Terraform Deployment
on:
push:
branches: [ main ]
jobs:
terraform:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Terraform
uses: hashicorp/setup-terraform@v1
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Terraform Init
id: init
run: terraform init
- name: Terraform Plan
id: plan
run: terraform plan -out=tfplan
- name: Manual Approval
uses: trstringer/manual-approval@v1
with:
secret: ${{ github.TOKEN }}
approvers: username1,username2
minimum-approvals: 1
issue-title: "Terraform Deployment Approval Required"[2]
```
**2. 상태 잠금 해제 절차**
1. DynamoDB 테이블에서 잠금 확인:
```bash
aws dynamodb get-item --table-name terraform-state-lock --key '{"LockID":{"S":"terraform-state"}}'
```
2. 강제 잠금 해제:
```bash
terraform force-unlock [LOCK_ID]
```[4]
**3. 상태 파일 복구**
1. S3 버킷에서 이전 상태 파일 버전 확인[3]
2. 최신 유효한 버전으로 복원
3. Terraform 상태 새로고침:
```bash
terraform refresh
```
## 예방 조치
1. **종료 트랩 설정**
```yaml
- name: Terraform Apply
run: |
trap "terraform force-unlock -force $(terraform state pull | jq -r '.serial')" EXIT
terraform apply -auto-approve
```[3]
2. **권한 설정 확인**
- S3 버킷에 대한 DeleteObject 권한
- DynamoDB 테이블에 대한 DeleteItem 권한 추가[4]
3. **타임아웃 설정**
```yaml
jobs:
terraform:
timeout-minutes: 30
```
4. **승인 프로세스 추가**
- 프로덕션 환경 배포 전 수동 승인 단계 구현[2]
- 계획 결과 검토를 위한 이슈 생성
이러한 조치들을 통해 강제 종료로 인한 문제를 최소화하고, 발생 시 신속하게 복구할 수 있습니다.
인용:
[1] Can't have a terraform plan work from a github action (related to ... https://github.com/hashicorp/terraform-github-actions/issues/84
[2] Automating Terraform Deployments with GitHub Actions: A Step-by ... https://nordcloud.com/tech-community/automating-terraform-deployments-with-github-actions-a-step-by-step-guide/
[3] GitHub Actions. Canceled action leads to permanently locked state. https://www.reddit.com/r/Terraform/comments/11u508t/deploying_w_github_actions_canceled_action_leads/
[4] Error acquiring the state lock: ConditionalCheckFailedException https://stackoverflow.com/questions/62189825/error-acquiring-the-state-lock-conditionalcheckfailedexception
[5] Troubleshooting: GitHub Actions + Terraform + EKS + Helm https://dev.to/aws-builders/troubleshooting-github-actions-terraform-eks-helm-3khj
[6] Terraform with GitHub Actions : How to Manage & Scale - Spacelift https://spacelift.io/blog/github-actions-terraform
terraform.tfstate 파일 삭제하면 안되는 이유
2024. 10. 29. 09:40