★★cloudNet@ 팀의 가시다 님이 진행하는 Terraform 101 Study 4기 내용과
한빛미디어 테라폼으로 시작하는 IaC 책을 참고하여 정리하였습니다.
Terraform Backend : AWS S3 + DynamoDB

▶ [악분님] 실습 따라하기

1. 리모트 공용 저장소 AWS S3 생성

main.tf

 

variable.tf

 

terraform.tfvars
배포 후 s3 확인

 

2. 테라폼 자원 배포 시 '리모트 백엔드 저장소' 설정 사용

terraform init 시 s3 연결 성공 확인

 

terraform apply 시 error 발생

: VPC 개수는 리전 단위로 최대 5개로 제한되므로 error 발생.

terraform apply 후
aws 콘솔에서 확인

 

3. [사전준비2] Locking을 위한 DynamoDB 활용을 위해 DynamoDB 생성

  • 테라폼에서 DynamoDB 잠금을 사용하기 위해서는 LockID 라는 기본 키가 있는 테이블을 생성해야됨

main.tf
배포 후 확인

4. 2번 테라폼 자원 배포에 백엔드 설정 수정 및 적용

provider.tf

 

terraform init
S3 버킷 버전 정보 확인

▶ 테라폼 백엔드 단점

 

워크스페이스

▶ 상태 파일 격리 소개 State File isolation

  • 테라폼 상태를 격리하지 않았을 때 발생하는 일
  • 환경을 격리하는 방법

1. 작업 공간을 통한 격리 Isolation via workspaces
: 동일한 구성에서 빠르고 격리된 테스트 환경에 유용

2. 파일 레이아웃을 이용한 격리 Isolation via file layout
: 보다 강력하게 분리해야 하는 운영 환경에 적합
: 테라폼 프로젝트의 파일 레이아웃 설명
- 각 테라폼 구성 파일을 분리된 폴더에 넣기(예. stage, prod)
- 각 환경에 서로 다른 백엔드 구성(예. S3 버킷 백엔드의 AWS 계정을 분리)

 

* 최상위 폴더

  • Stage : 테스트 환경과 같은 사전 프로덕션 워크로드 workload 환경
  • prod : 사용자용 맵 같은 프로덕션 워크로드 환경
  • mgmt : 베스천 호스트 Bastion Host, 젠킨스 Jenkins와 같은 데브옵스 도구 환경
  • global : S3, IAM과 같이 모든 환경에서 사용되는 리소스를 배치

* 각 환경별 구성 요소

  • vpc : 해당 환경을 위한 네트워크 토폴로지
  • services : 해당 환경에서 서비스되는 애플리케이션, 각 앱은 자체 폴더에 위치하여 다른 앱과 분리
  • data-storage : 해당 환경 별 데이터 저장소. 각 데이터 저장소 역시 자체 폴더에 위치하여 다른 데이터 저장소와 분리

* 명명 규칙 naming conventions (예시)

  • variables.tf : 입력 변수
  • outputs.tf : 출력 변수
  • main-xx.tf : 리소스 -> 개별 테라폼 파일 규모가 커지면 특정 기능을 기준으로 별도 파일로 분리 혹은 모듈 단위로 나눔
  • dependencies.tf : 데이터 소스
  • providers.tf : 공급자

 

  • 테라폼 구성 파일은 동일하지만 작업자는 서로 다른 State를 갖는 실제 대상을 프로비저닝할 수 있다
  • 워크스페이스는 기본 default로 정의.
    로컬 작업 환경의 워크스페이스 관리를 위한 CLI 명령어로 workspacerk dlTek
terraform workspace list
* default

main.tf

 

: mywork 워크스페이스 신규 생성 시 terraform.tfstate.d 서브에 있는 mywork1 의 terraform.tfstate 파일 사용

terraform workspace list
리소스 삭제

 

[장점]

  • 하나의 루트 모듈에서 다른 환경을 위한 리소스를 동일한 테라폼 구성으로 프로비저닝하고 관리
  • 기존 프로비저닝된 환경에 영향을 주지 않고 변경 사항 실험 가능
  • 깃의 브렌치 전략처럼 동일한 구성에서 서로 다른 리소스 결과 관리

[단점]

  • State가 동일한 저장소(로컬 또는 백엔드)에 저장되어 State 접근 권한 관리가 불가능
  • 모든 환경이 동일한 리소스를 요구하지 않을 수 있으므로 테라폼 구성에 분기 처리가 다수 발생 가능
  • 프로비저닝 대상에 대한 인증 요소를 완벽히 분리하기 어려움
    > 가장 큰 단점은 완벽한 격리가 불가능
    > 해겨하기 위해 루트 모듈을 별도로 구성하는 디렉터리 기반의 레이아웃을 사용할 수 있다 or
    Terraform cloud 환경의 워크스페이스를 활용

 


* 악분님 실습 참고

https://developer.hashicorp.com/terraform/language/settings/backends/s3

 

Backend Type: s3 | Terraform | HashiCorp Developer

Terraform can store state remotely in S3 and lock that state with DynamoDB.

developer.hashicorp.com

 


 

도전

 

[도전과제1] AWS의 2개의 리전에서 리소스를 배포하는 테라폼 코드를 작성해보세요!

[도전과제2] 각자 현업 업무에 관련된 프로바이더를 사용하여 리소스를 배포해보세요!

[도전과제3] AWS Terraform 관련 Workshop & Best Practices 을 직접 실습 후 정리해보세요.

  • Introduction to Terraform on AWS - Link
  • EKS Blueprints for Terraform workshop studio - Link
  • Amazon EKS Blueprints for Terraform - Link Github - 링크
  • Managing Cloud Resources with Terraform - Link
  • EKS Terraform Workshop - Link / Youtube - Link
  • AWS TERRAFORM WORKSHOP : v0.15.1, ‘20, - 링크
  • [AWS Partnet Solutions] Terraform modules - 링크