Terraform이 인프라 상태를 추적하는 방법과 Terraform 프로젝트의 파일 레이아웃, 격리 및 잠금에 미치는 영향을 살펴보겠습니다.
Terraform의 상태 추적
- Terraform은 인프라의 현재 상태를 파일(일반적으로 terraform.tfstate 파일)에 저장합니다.
- 이 파일에는 프로비저닝한 리소스 정보가 담겨 있으며, Terraform이 인프라의 변경 사항을 추적하고 관리하는 데 사용됩니다.
terraform을 팀에서 사용한다면 상태 파일을 관리할 수 있는 공유 저장소가 필요합니다.
가장 좋은 방법은 Terraform의 기본 기능인 원격 백엔드 지원을 사용하는 것입니다.
Terraform의 상태 파일을 공유 저장소에 저장할 때, 버전 제어 시스템(Git 등)을 사용하는 것은 다음과 같은 문제를 일으킬 수 있습니다.
- 수동 오류: 상태 파일을 최신으로 유지하는 것을 잊을 경우, 오래된 상태로 인해 인프라가 의도치 않게 변경될 수 있습니다.
- 잠금 부족: 버전 제어 시스템은 동시에 여러 사용자가 상태 파일을 수정하는 것을 방지하는 잠금 기능을 제공하지 않습니다.
- 비밀 데이터 노출: 상태 파일에 민감한 정보(예: 데이터베이스 비밀번호)가 일반 텍스트로 저장되므로 보안 위험이 있습니다.
AWS에서 제공하는 원격 백엔드
S3: 상태 파일을 안전하게 저장하며, 암호화 및 버전 관리를 지원합니다.
DynamoDB: 상태 파일에 대한 잠금 기능을 제공하여 동시 작업을 방지합니다.
s3 버킷 생성
prevent_destroy = true 매개변수를 이용해 실수로 삭제 되는 것을 방지할 수 있습니다.
//s3.tf
resource "aws_s3_bucket" "terraform_state" {
bucket = "terraform-state-joon"
lifecycle {
prevent_destroy = true
}
}
aws_s3_bucket_versioning를 이용해서 언제든지 파일의 이전 버전을 확인하고 이전 버전으로 되돌릴 수 있습니다.
resource "aws_s3_bucket_versioning" "enabled" {
bucket = aws_s3_bucket.terraform_state.id
versioning_configuration {
status = "Enabled"
}
}
aws_s3_bucket_server_side_encryption_configuration 리소스를 사용하여 이 S3 버킷에 기록된 모든 데이터에 대해 기본적으로 서버 측 암호화를 활성화합니다.
resource "aws_s3_bucket_server_side_encryption_configuration" "default" {
bucket = aws_s3_bucket.terraform_state.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}
aws_s3_bucket_public_access_block 리소스를 사용하여 S3 버킷에 대한 모든 퍼블릭 액세스를 차단합니다.
resource "aws_s3_bucket_public_access_block" "public_access" {
bucket = aws_s3_bucket.terraform_state.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
DynamoDB 테이블을 생성
resource "aws_dynamodb_table" "terraform_locks" {
name = "terraform-locks"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
terraform init , apply를 통해 dynamoDB와 S3를 생성해줍니다.
S3 버킷과 DynamoDB 테이블이 생성되지만 Terraform 상태는 여전히 로컬에 저장됩니다. S3 버킷에 상태를 저장하도록 Terraform을 구성하려면 코드에 백엔드 구성을 추가해야 합니다.
terraform {
backend "s3" {
bucket = "terraform-state-joon"
key = "global/s3/terraform.tfstate"
region = "ap-northeast-2"
dynamodb_table = "terraform-locks"
encrypt = true
}
}
state가 s3에 잘 저장된 것을 확인할 수 있습니다.
작업 공간 설정
Terraform 상태를 별도의 이름이 지정된 여러 작업공간에 저장할 수 있습니다.
//새로운 작업 공간 생성
$ terraform workspace new test
//작업 공간 확인
$ terraform workspace list
//작업 공간 선택
$ terraform workspace select test
key는 workspaces-test/terraform.tfstate로 작업 공간 별로 다르게 설정해줍니다.
terraform {
backend "s3" {
# Replace this with your bucket name!
bucket = "terraform-state"
key = "workspaces-test/terraform.tfstate"
region = "us-east-2"
# Replace this with your DynamoDB table name!
dynamodb_table = "terraform-locks"
encrypt = true
}
}
'Infra' 카테고리의 다른 글
terraform으로 aws 인프라 구축하기 (2) (Auto Scaling) (0) | 2024.12.04 |
---|---|
terraform으로 aws 인프라 구축하기 (1) (0) | 2024.12.04 |
EKS 클러스터 구축 (0) | 2024.12.04 |
UTM 이용해서 쿠버네티스 환경 구성하기 (0) | 2024.12.04 |
AWS IAM 계정 공유 와 AWS 서비스에 IAM 역할 적용 (0) | 2024.12.04 |