Nubes et Stella

Terraform #07 (Backend/State) 본문

DevOps/Terraform

Terraform #07 (Backend/State)

SeongYeong Han 2023. 10. 23. 22:21

01. Terraform Backend

라폼 백엔드는 테라폼의 상태 정보를 저장하고 관리하는데 사용되는 구성 요소입니다. 테라폼 상태 정보는 테라폼이 관리하는 인프라스트럭처의 현재 상태를 추적하고 변경사항을 적용할 때 사용된다. 백엔드는 기본적으로 "Local State" 로 저장되며, 원격 저장소에 "Remote State" 방식으로 저장할 수도 있다.

 

Remote State는 주로 "AWS S3" 에 저장하는 방식과 "Terraform Cloud (Remote Backend)" 에 저장하는 방식이 크게 사용된다.

 

**Locking 이란?

락킹은 테라폼 상태파일을 원격으로 관리할 때 여러명이 동시에 작업을 진행할 경우, 동시성 이슈가 발생할 수 있다. 예를들면 작업자1이 s3-1, 작업자2가 s3-2 상태정보를 만들어 동시에 apply 할 경우 충돌이 발생한다.

 

만약에 s3-2가 진행되는 과정에서 s3-1로 상태를 덮어 씌워버리면 s3-2는 설정이 사라진다. 락킹은 동시에 작업하더라도 한명한테만 실행권한을 주고 다른 한명한테는 실행대기를 요구하여 이슈를 방지한다.

 

 

AWS S3 Backend 구현

  • line 1~2 : terraform 블록을 생성하고 하위에 backend "s3" {} 블록을 생성 후 을 설정한다.
  • line 3~5 : "bucket" 인자를 설정하여 S3버킷명을 설정한다. "key" 인자는 버킷 하위 디렉터리 및 파일명을 설정한다. "region" 인자는 AWS 리전을 설정한다.
  1 terraform {
  2   backend "s3" {
  3     bucket = "syhan-devops-backend"
  4     key    = "s3-backend/terraform.tfstate"
  5     region = "ap-northeast-2"
  6   }
  7 }
  8
  9 provider "aws" {
 10   region = "ap-northeast-2"
 11 }
 
 - 이하 생략 -

 

  • S3 버킷은 terraform에서 만들어 주지 않기 때문에, 미리 직접 만들어 줘야 한다.

 

  • Terraform init -> Terraform apply 해보자!!

 

  • 내가 설정한 객체와 tfstate 파일이 생성된 것을 볼 수 있다.

 

 

Terraform Backend 구현

아래 링크를 통해서 Terraform Cloud에 접속하여, 계정을 생성 후 Organization를 생성한다. (workspaces는 Terraform apply 과정에서 직접 생성해 준다.)

https://app.terraform.io/

 

Terraform Cloud by HashiCorp

 

app.terraform.io

 

  • line 1~2 : 테라폼 블록을 정의하고 하위에 backend 블록을 생성 후 remote 타입을 설정한다.
  • line 3~4 : "hostname" 인자에 "app.terraform.io"를 설정한다. (terraform cloud를 사용한다는 뜻) "organization" 인자에 자신의 Terraform Organization을 설정한다. 
  • line 6~7 : workspaces 블록을 생성하고 name 인자를 사용하여 workspaces 이름을 설정한다.
  1 terraform {
  2   backend "remote" {
  3     hostname     = "app.terraform.io"
  4     organization = "syhan"
  5
  6     workspaces {
  7       name = "tf-cloud-backend"
  8     }
  9   }
 10 }
 11
 12 provider "aws" {
 13   region = "ap-northeast-2"
 14 }
 
 - 이하 생략 -
  • Terraform init -> Terraform apply 해보자!!

 

  • 정상적으로 state를 저장하기 위한 workspaces가 생성 된 것을 볼 수 있다.

 

** 2개중에 써야한다면 S3보다는 Terraform Cloud가 Terraform에 더 친화적이고 더 다양한 기능을 제공하기 때문에 Terraform Cloud를 사용하는 것을 추천한다.

 

 

02. Terraform State

Terraform state는 현재의 인프라스트럭처에 대한 상태정보를 저장하고 추적하기 위한 것이며, .tfstate 파일로 존재한다. 테라폼은 사실상 state 정보를 보고 동작하기 때문에 잘못 수정하면 큰 장애를 유발할 수 있기 때문에 조심히 관리해야 한다.

 

Terraform State는 크게 아래의 기능을 제공한다.

  • list : 현재 terraform state 정보를 모두 출력한다. ★
  • mv : terraform state 정보를 수정한다.
  • pull : remote에 있는 terraform state 정보를 로컬에 파일로 생성한다.
  • push : 현재 local에 있는 terraform state 정보를 remote에 push한다. (잘못 사용하게 되면 state 정보를 덮어씌우기 때문에 조심해야 한다.)
  • replace-provider : provider를 바꾸거나 할 때 사용된다.
  • rm : 테라폼 state 중에서 특정 리소스를 삭제한다.
  • show : 특정 리소스의 테라폼 state에 저장된 정보를 terraform 코드로 출력해준다.

 

  • #terraform state list 명령어를 사용하여 현재 state에 저장된 리소스 목록을 출력한다.

 

  • #terraform state show 명령어를 사용하여 특정 리소스의 상태값을 테라폼 코드로 불러온다.

 

  • 동일한 리소스를 생성하는 코드이더라도, 리소스 이름이 바뀌게 되면 기존 리소스를 삭제하고 새로 생성하기 때문에 장애를 불러올 수 있다.

 

  • 이런 경우에는 변경하려는 리소스 블록으로 state를 수정(mv)해주어야 한다.
  • terraform은 코드 동작시 state를 참고하기 때문에 코드가 수정된 것이 없는 것으로 판단한다.

 

 

  • 특정 리소스를 더 이상 테라폼을 관리하지 않을 때 해당 리소스 state를 삭제(rm) 한다.
  • main.tf 코드상에서 IAM 권한 관련 리소스 코드를 삭제하고, state에서도 해당 리소스를 삭제 후 apply 해본다.

 

  • main.tf 코드상에서 권한 관련 코드가 삭제되었기 때문에 원래대로라면 실제로도 권한이 삭제되어야 한다. 하지만 state값이 빠져있기 때문에 terraform은 해당 리소스에 대해서 관여하지 않기 때문에 권한이 그대로 존재한다.

 

  • #terraform state pull 명령어를 쓰게 되면 현재 remote에 저장되어 있는 state를 불러온다. 
  • #terraform state pull > *.tfstate 명령어를 사용하여 로컬에 파일로 저장한다.
  • state pull 명령어는 state정보를 가져와서 워크 스페이스를 나누거나 할 때 사용된다.


 

- END -

'DevOps > Terraform' 카테고리의 다른 글

Terraform #09 (Module)  (0) 2023.10.30
Terraform #08 (taint/Workspace)  (0) 2023.10.24
Terraform #06 (Conditional/For)  (0) 2023.10.19
Terraform #05 (count/for_each)  (1) 2023.10.18
Terraform #04 (Variable/Output/Local)  (1) 2023.10.09