일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- JPQL
- 즉시로딩
- dfs
- exclusive lock
- fetch
- 데코레이터
- PS
- CHECK OPTION
- 일대다
- execute
- 이진탐색
- BOJ
- 동적sql
- 낙관적락
- SQL프로그래밍
- shared lock
- 연결리스트
- 연관관계
- 스프링 폼
- 지연로딩
- 힙
- FetchType
- 다대다
- 스토어드 프로시저
- querydsl
- 백트래킹
- 다대일
- 비관적락
- eager
- 유니크제약조건
- Today
- Total
흰 스타렉스에서 내가 내리지
Terraform backend - Terraform state 를 관리 본문
# Terraform State
terraform apply 명령어을 실행하면, 리소스가 생성이 되고 terraform.tfstate 파일이 생성된다.
tfstate 파일은 Terraform 이 인프라 리소스의 현재 상태를 추적하고 관리하는 파일이다.
Terraform 이 배포한 인프라와 관련된 정보를 저장하며, Terraform 이 해당 리소스의 변경 사항을 관리할 수 있도록 한다.
즉, apply 의 결과를 저장해놓은 상태라고 보면 된다.
다만, 내가 apply 를 적용한 시점의 상태이지, 현재의 실제 인프라 상태는 아닐 수 있다.
state 는 원격 저장소인 `backend` 에도 저장될 수 있다.
# Terraform Backend 란?
Terraform 의 state file 를 어디에 저장하고, 가져올지에 대한 설정이다.
기본적으로는 로컬 스토리지에 저장을 하지만, 설정에 따라서 s3, consul, etcd 등 다양한 "Backend type" 을 사용할 수 있다.
# Terraform Backend 를 사용하는 이유?
1. Locking
보통 Terraform 코드를 혼자 작성하지 않습니다. 인프라를 변경한다는 것은 굉장히 민감한 작업이 될 수 있습니다. 원격 저장소를 사용함으로써 동시에 같은 state 를 접근하는 것을 막아 의도치 않은 변경을 방지할 수 있다.
2. Backup
로컬 스토리지에 저장한다는 건 유실할 수 있다는 가능성을 내포한다.
s3 와 같은 원격저장소를 사용함으로써 state 파일의 유실을 방지한다.
Terraform에서 가장 보편적으로 사용하는 s3 backend 를 예제로 합니다. AWS S3는 쉽게 구축할 수 있으며 versioning 을 지원하는 안전한 저장소입니다.
# Terraform Backend 실습
보통 init 이라는 디렉터리 안에 생성한다.
- S3 bucket as backend
테라폼의 상태를 저장하기 위해 S3 버킷을 생성한다. AWS S3 는 쉽게 구축할 수 있으며 versioning 을 지원하는 안전한 저장소이다.
- DynamoDB Table for Lock
동시에 같은 파일을 수정하지 못하도록 하기 위해 DynamoDB 에 작업에 대한 Lock 을 생성한다.
vim init.tf
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 = "joos-be-apne2-tfstate"
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"
}
}
terraform plan
terraform apply
s3 버킷과 dynamoDB 테이블이 잘 생성되었습니다.
이제 이 state 파일을 backend 로 관리해보자.
# 전 게시글에서 iam 관련 파일들을 생성했었다. 그 디렉토리에서
vim backend.tf
terraform {
backend "s3" {
bucket = "joos-be-apne2-tfstate" # s3 bucket 이름
key = "terraform/iam/terraform.tfstate" # s3 내에서 저장되는 경로를 의미합니다.
region = "ap-northeast-2"
encrypt = true
dynamodb_table = "terraform-lock"
}
}
키 경로는 실제 경로와 같으면 좋다.
terraform init
"기존의 state 를 새로운 backend 로 copy 할거니?"
이제 s3 버킷에 tfstate 파일이 저장되어 있을 것이고, 진짜 잘 되는지 확인해보자.
로컬에서 tfstate 파일을 삭제한다.
rm -f terraform.tfstate terraform.tfstate.backup
이제 로컬에 state 파일이 없어도, s3 버킷으로부터 tfstate 파일을 읽어오기 때문에 plan 명령에 성공한다.
원격에 있는 state 파일을 불러오고 싶으면 `terraform state pull` 명령어를 사용한다.
'DevOps' 카테고리의 다른 글
클라우드 엔지니어와 DevOps 엔지니어의 차이점은? (1) | 2024.09.16 |
---|---|
tfstate 파일이 실제 인프라와 일치하지 않을 때 - import (1) | 2024.09.06 |
Terraform의 -parallelism 옵션: 더 빠르고 효율적인 인프라 관리 방법 (0) | 2024.09.05 |
AWS IAM 이란? 그리고 Terraform 으로 IAM user, group, role, policy 생성 (1) | 2024.09.05 |
Terraform 으로 s3 리소스 생성하기 (0) | 2024.09.05 |