[AWS][Network][(IaC)Terraform] AWS Network의 구성 요소와 생성처럼 terraform apply를 하는 경우, 리소스가 생성된 후 terraform.tfstate 파일이 생성된다. 이 파일의 내용(terraform metadata; terraform knows what infrastructure it controls)이 terraform state이다.
즉, 내가 실행한 apply의 결과를 저장해놓은 상태이다. (여기서 상태란 terraform apply를 했을 시점의 상태이지, 현재 인프라의 상태를 반영해주는 것은 아니다. )
이 state는 backend에도 저장 될 수 있다. backend가 뭐지?? 그리고 이는 어떻게 활용되고 왜 사용될까? 어떻게 쓰는걸까?
1. terraform Backend란
terraform.tfstate는 locally 하게 저장된 것이지만 Terraform Backend 는 Terraform의 state file을 어디에 저장을 하고, 가져올지에 대한 설정이다.
2. terraform Backend는 어떻게 활용되고 왜 사용될까?
큰 infrastructure 구축 작업 즉 terraform 코드를 함께 작성한다고 하자. 이런 경우 Backend를 통해 state의 원격저장소를 사용하면, 여러 사람이 동시에 같은 state를 건드려서 의도치 않은 인프라 변경을 방지할 수 있다. 예를 들어 A가 terraform apply를 하고 B가 2초 뒤 terraform apply를 하면, B의 동작은 A의 동작이 완전히 다 마무리 된 후에 진행된다. 즉 A와 B의 의도가 overriding되는 것을 막을 수 있다. (Locking)
그리고 원격저장소에 terraform state를 저장해둠으로써 state 파일의 유실을 방지할 수 있다. (Backup)
마치 github 쓰는 것과 비슷한 효과 인 듯 하게 느껴진다.
3. 어떻게 쓰는걸까?
for remote state, we can have it store it into
- S3 bucket in AWS
- Azure storage
- terraform Enterprise..
여러가지 방법이 있지만 여기선 S3 bucket in AWS에 저장하는 방법으로 진행하였다.
Store our state in AWS S3
s3 저장소를 생성하고, AWS에서 제공하는 NoSQL Key/Value 저장소인 DynamoDB에 state가 저장된 s3의 경로와 lock을 할 수 있는 파일들이 저장된다.
terraform에서는 이를 확인하고 현재 이 파일이 사용되고 있는지, 아닌지를 판단한다.
provider "aws" {
region = "ap-northeast-2" # Please use the default region ID
version = "~> 2.49.0" # Please choose any version or delete this line if you want the latest version
}
# S3 bucket for backend
resource "aws_s3_bucket" "tfstate" {
bucket = "tfstate_bucket"
versioning {
enabled = true # Prevent from deleting tfstate file
}
}
# DynamoDB for terraform state lock
resource "aws_dynamodb_table" "terraform_state_lock" {
name = "terraform-lock"
hash_key = "LockID"
billing_mode = "PAY_PER_REQUEST"
attribute {
name = "LockID"
type = "S"
}
}
2) backend 설정
# backend.tf
terraform {
backend "s3" { # terraform backend type이 s3라고 명시
bucket = "tfstate_bucket" # s3 bucket 이름
key = "terraform/own-your-path/terraform.tfstate" # s3 내에서 저장되는 경로를 의미합니다.
region = "ap-northeast-2"
encrypt = true
dynamodb_table = "terraform-lock" # DynamoDB 이름
}
}
reference
www.youtube.com/watch?v=RBW253A4SvY
'Dev > DevOps, Infra' 카테고리의 다른 글
[DevOps] AWS CodePipeline을 이용한 ECS Fargate 배포하기 (0) | 2021.05.15 |
---|---|
[(IaC)Terraform] Terraform Variables 활용하기 (0) | 2021.05.10 |
[AWS][Network][(IaC)Terraform] AWS Network의 구성 요소와 생성 (0) | 2021.05.02 |
[Docker] Docker Compose (0) | 2021.01.28 |
[Docker] 도커 환경에서 실행되는 Nodejs 애플리케이션 (0) | 2021.01.28 |