Ssoon
[T101-2주차] 03 테라폼 상태 관리하기 - (2) 상태파일공유 본문
CloudNet@ 팀의 가시다님이 진행하는 Terraform 101 Study 2주차 정리입니다.
Terraform backend
- 테라폼이 상태를 load 하고 store 하는 방법을 결정합니다.
- 기본 backend 는 local backend 로서 local disk 에 상태 파일을 저장합니다.
- Remote backend 를 사용하면 원격 공유 저장소에 저장할 수 있습니다.
원격 backend 을 사용하면 해결되는 문제
- Manual error
- terraform 은 plan 이나 apply 할 때마다 해당 backend 에서 상태 파일을 자동으로 load 합니다.
- apply 시 상태 파일을 backend 에 자동 저장됩니다.
- Locking
- apply 실행하면 terraform 은 자동으로 잠금을 활성화되어 다른 사람이 apply 실행 중인 경우 이미 잠금이 활성화되어 잇어 잠금이 해제될 때까지 대기해야 합니다.
- Secrets
- 대부분의 원격 backend 는 기본적으로 데이터를 보내거나 상태 파일을 저장할 때 암호화하는 기능을 지원합니다.
Amazon S3 을 원격 backend 로 사용합니다.
- S3 Bucket 생성을 생성합니다.
backend.tf
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_s3_bucket" "soon_s3bucket" {
bucket = "ssoon-t101study-tfstate"
# 리소스 삭제 시 테라폼 오류와 함께 종료됨
lifecycle {
prevent_destroy = true
}
}
# S3 버킷에서 버전 관리를 제어하기 위한 리소스를 제공합니다.
resource "aws_s3_bucket_versioning" "ssoon_s3bucket_versioning" {
bucket = aws_s3_bucket.soon_s3bucket.id
# 버킷이 파일을 업데이트 마다 새버전을 생성합니다.
versioning_configuration {
status = "Enabled"
}
}
# S3 버킷에 기록된 모든 데이터에 서버 측 암호화을 설정합니다
resource "aws_s3_bucket_server_side_encryption_configuration" "soon_s3bucket_encryption" {
bucket = aws_s3_bucket.soon_s3bucket.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}
# S3 버킷 퍼블릭 액세스 차단 구성을 관리합니다.
resource "aws_s3_bucket_public_access_block" "soon_s3bucket_public_access" {
bucket = aws_s3_bucket.soon_s3bucket.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
output "s3_bucket_arn" {
value = aws_s3_bucket.soon_s3bucket.arn
description = "The ARN of the S3 bucket"
}
- console 확인
잠금에 사용할 DynamoDB 테이블을 생성합니다.
- DynamoDB
- Amazon 의 key-value 저장소 입니다.
- 분산 잠금 시스템에 필요한 강력한 읽기 일관성 및 조건부 쓰기를 지원합니다.
LockID 기본 key 가 있는 DynamoDB 테이블을 생성합니다.
- backend.tf 에 추가합니다.
# DynamoDB 테이블 리소스를 제공합니다
resource "aws_dynamodb_table" "ssoon_dynamodbtable" {
name = "terraform-locks"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
output "dynamodb_table_name" {
value = aws_dynamodb_table.ssoon_dynamodbtable.name
description = "The name of the DynamoDB table"
}
- console 확인
terraform 코드 내에 backend 구성을 설정합니다.
terraform
backend "<BACKEND_NAME>" {
[CONFIG...]
}
}
- backend.tf 에 추가합니다.
terraform {
backend "s3" {
# 이전에 생성한 버킷 이름
bucket = "ssoon-t101study-tfstate"
key = "dev/terraform.tfstate"
region = "ap-northeast-2"
# 이전에 생성한 다이나모db 이름
dynamodb_table = "terraform-locks"
# encrypt = true
}
}
- encrypt 을 ture 로 설정하면 terraform 상태가 S3 디스크에 저장될 때 암호화됩니다.
- 앞서 만들어본 ec2.tf 에 backend 설정을 추가하여 terraform init 을 실행합니다.
https://github.com/kschoi728/T101/tree/master/02_Weeks
기존 상태를 새 백엔드에 복사하시겠습니까?
백엔드 "s3"을 성공적으로 구성했습니다!
백엔드 구성이 변경되지 않는 한 Terraform은 이 백엔드를 자동으로 사용합니다.
- console 확인
앞서 생성한 ec2.tf 의 tag을 변경하고 terraform apply 을 실행합니다.
DynanoDB 에서 상태파일에 대한 lock 상태를 확인합니다.
S3 에서 version 을 확인합니다.
상태파일을 삭제합니다.
ec2.tf 의 tag을 변경하고 terraform apply 을 실행하여도 상태파일이 원격에 있기 때문에 정상적으로 실행됩니다.
stg 폴더를 생성 후 vpc.tf / sg.tf / ec2.tf / backend.tf 을 생성 합니다.
backend.tf
terraform {
backend "s3" {
bucket = "ssoon-t101study-tfstate"
key = "stg/terraform.tfstate"
region = "ap-northeast-2"
dynamodb_table = "terraform-locks"
# encrypt = true
}
}
DynanoDB 에서 상태파일에 대한 lock 상태를 확인합니다.
S3에서 생성된 stg 을 확인합니다.
'Terraform 101 Study' 카테고리의 다른 글
[T101-3주차] 03 테라폼 상태 관리하기 - (4) 상태파일격리 - 파일 레이아웃을 이용한 격리 (0) | 2022.11.01 |
---|---|
[T101-3주차] 03 테라폼 상태 관리하기 - (4) 상태파일격리 - workspaces 을 통한 격리 (0) | 2022.10.31 |
[T101-2주차] 03 테라폼 상태 관리하기 - (1) 테러폼상태란? (0) | 2022.10.27 |
[T101-2주차] 02 왜 Terraform 인가? - (7) 로드밸런서 배포 (0) | 2022.10.26 |
[T101-2주차] VPC + 보안그룹 + EC2 배포 (0) | 2022.10.25 |
Comments