✔️ 백엔드(Backend)
- 백엔드 Terraform의 상태 스냅샷이 저장되는 위치를 결정한다.
- 주어진 Terraform 구성은 백엔드를 지정하거나 Terraform Cloud와 통합하거나 둘 다 수행하지 않고 기본적으로 로컬로 상태를 저장할 수 있다.
- Terraform은 이 영구 상태 데이터를 사용하여 관리하는 리소스를 추적하므로 어떤 실제 인프라 개체가 구성의 리소스에 해당하는지 알기 위해서는 상태가 필요하다. 따라서 주어진 인프라 리소스 모음으로 작업하는 모든 사람은 동일한 상태 데이터에 액세스할 수 있어야 한다.
- 기본적으로 Terraform은 로컬이라는 백엔드를 암시적으로 사용하여 디스크에 로컬 파일(.tfstate)로 상태를 저장한다.
- 다른 모든 백엔드는 여러 사람이 액세스할 수 있도록 하는 일종의 원격 서비스에 상태를 저장합니다.
- 상태 데이터에는 매우 민감한 정보가 포함되어 있기 때문에 원격 서비스에서 상태에 액세스하려면 일반적으로 일종의 액세스 자격 증명(Token)이 필요하다.
- 일부 백엔드는 상태 파일에 대한 일반 "원격 디스크"처럼 작동한다. 다른 것들은 작업이 수행되는 동안 상태 잠금을 지원하므로 충돌과 불일치를 방지하는 데 도움이 된다.
✔️ s3, DynamoDB를 사용한 원격 백엔드
Backend Configuration - Configuration Language | Terraform by HashiCorp
세팅 방법
Backend Type: remote | Terraform by HashiCorp
Backend Type: s3 | Terraform by HashiCorp
terraform {
backend "s3" {
bucket = "mybucket"
key = "path/to/my/key"
region = "us-east-1"
}
}
DynamoDB를 사용해 상태를 Lock 하는 방법이다.
리모트에 상태를 저장하기 위해
A, B, C가 같이 작업하는 상황에서 A, B가 동시에 작업을 apply 하면 tfstate 파일의 정보가 어긋날 수 있다.
동시에 접근하는 것을 방지하기 위해 Locking
을 걸며 동시에 "쓰지" 못하게 한다.
terraform show 명령은 사용 가능하다. (읽기 작업)
nfs도 동시에 쓰기를 하지 못하게 하기 위해 Lock을 건다.
하지만 S3 자체에는 Lock 기능이 없어서 DynamoDB를 이용해서 Lock을 한다.
상태의 update가 끝나면 Lock을 풀어 다른 사람이 쓸 수 있도록 한다.
그러나 terraform cloud의 출시 이후 이 방법은 자주 쓰이지 않는다.
✔️ Terraform Cloud Backend
terraform {
backend "remote" {
organization = "example_corp"
workspaces {
name = "my-app-prod"
}
}
}
✔️ Terraform Workflow
Terraform Cloud에는 Terraform 실행을 관리하기 위한 워크플로우가 있다.
✔️ UI/VCS-driven workflow
Terraform Cloud를 사용할 경우 기본적으로 채택하게 되는 workflow
이 workflow에서는 모든 workspace가 VCS(Github 같은)의 특정 분기와 연결된다. 작동 방식은 다음과 같다.
- Terraform에서 workspcae를 생성할 때 VSC 선택 (Webhook)
- 해당 VCS에서 새 커밋에 대한 병합이 발생하면 Terraform Cloud에서 코드 실행
✔️ CLI-driven workflow
Terraform의 표준 CLI 도구를 사용하여 Terraform Cloud Workspace에 로컬 코드를 plan하거나 apply할 수 있다.
이 방식은 Terraform CLI를 기존에 사용했다면 쉽게 적용할 수 있는 workflow이며 기존의 CI/CD 파이프라인이 존재하더라도 같이 사용할 수 있고 Sentinel 정책도 준수할 수 있다.
- 장점 : 로컬에 있는 코드를 Terraform Cloud에서 실행할 수 있다는 점
Terraform Cloud의 환경을 그대로 사용해 테스트(Plan만 사용하는)할 수 있기 때문에 로컬 환경과 운영 환경 사이의 간극을 없애주는 역할을 하게 된다.
terraform plan을 사용하면 VSC 워크플로우와 좋은 시너지를 낼 수 있게 되는데, VCS만 사용할 경우 실제 환경에서 어떻게 반영되는지 확인하려면 해당 VSC 분기에 PR(Pull Request(를 보내야했던 반면 CLI를 같이 사용하면 PR를 보내기 전에 로컬에서 확인이 가능하므로 VSC에 잘못된 코드가 올라갈 확률이 줄어든다.
✔️ API-driven workflow
Terraform Cloud API를 사용하는 방식으로 VCS 기반 workflow나 CLI 기반 workflow의 경우 저장소 또는 로컬에 있는 구성 파일들을 workspace와 연결시켜 그대로 가져다가 사용했지만 API 기반 workflow는 파일을 압축(tar.gz)해서 Terraform Cloud로 직접 업로드 시켜야 하며 파일이 업로드 되면 자동으로 apply(plan 포함)가 된다.
이 Terraform Cloud는 코드 배포 외에도 다양한 API를 지원하고 있기 때문에 Terraform Cloud에서 직접적인 연결을 지원하지 않는 서비스를 사용하고 있거나 새롭게 Terraform과의 통합하는 솔루션을 구축하려할 경우 이 API들를 사용해 Terraform Cloud와 통합시킬 수 있다.
✔️ Terraform Workflow 사용법
wordspace 이름을 지정하고 필요에 따라 설명을 붙여준다.
terraform login 실행
terraform login
~/.terraform.d/credentials.tfrc.json
이 파일이 노출되면 안된다. aws의 credential 같은 개념이다.https://app.terraform.io/app/settings/tokens?source=terraform-login
로 접속하여 토큰을 생성한다.
만든 토큰을 로그인 정보에 붙여넣는다. 그럼 credentials 파일에 저장된다.
예제 코드를 이용해 우리의 코드를 바꾼다.
예제 코드
terraform {
cloud {
organization = "shinsohui"
workspaces {
name = "terraform_test"
}
}
}
provider.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.27"
}
}
required_version = ">= 0.14.9"
cloud {
organization = "shinsohui"
workspaces {
name = "terraform_test"
}
}
}
}
provider "aws" {
profile = "default"
region = var.aws_region
}
그 전에 setting에서 Execution Mode를 Local로 변경한다. (아직 연결된 git server 없으므로)
terraform init 하기
Should Terraform migrate your existing state?
현재 상태를 migration 할 것이냐 (로컬 → 클라우드) : yes
terraform.tfstate
, terraform.tfstate.backup
파일을 삭제해도 여전히 terraform show 가능
workspace에 보면 setting이 완료가 되어서 리소스들을 볼 수 있다.
이미지, output 등등
States 탭에서는 상태들을 볼 수 있다.
terraform destroy를 하는 중에 terraform cloud 콘솔에 가면 locking 표시가 뜬다.
현재 update를 하는 상태이기 때문에 그렇다.
destroy 명령이 모두 완료되면 locking이 해제되고 상태가 업데이트 (아무것도 없음)된다.
팀 지정 및 팀용 토큰을 발급할 수도 있고 사용자를 여러명 추가할 수도 있다.
이로써 하나의 팀에 있는 사용자들은 항상 같은 상태를 바라볼 수 있다.
terraform code를 사용할 때 로컬 백엔드를 운영해도 무방하다.
하지만 여러명이 상태를 실시간으로 공유할 수는 없기 때문에 terraform cloud를 이용한다.
'DevOps > Terraform' 카테고리의 다른 글
[Terraform] for_each 구문 (0) | 2022.10.19 |
---|---|
[Terraform] 독립적인 배포 환경 만들기 (0) | 2022.05.03 |
[Terraform] 데이터 소스 (Data Source) (1) | 2022.04.25 |
[Terraform] Count (0) | 2022.04.25 |
[Terraform] 모듈 (Module) (0) | 2022.04.23 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!