Search

Terraform (2)

Date
2024/07/25
Category
Devops
Tag
IaC
terraform.tfstate 파일은 항상 현재의 인프라를 일치되는 것이 아니다
예로, 콘솔로 수정할 경우 인프라와 tfstate 파일은 불일치된다
하나의 워크스페이스는 하나의 백엔드를 가지지만 하나의 백엔드가 하나의 워크스페이스를 가지는 것은 아니다
1 workspace → 1 backend
1 backend → multi workspaces
terraform remote backend는 s3, consul과 다르게 terraform cloud온프렘에서 실행할 수 있다.
테라폼을 통한 인프라 배포 워크플로우
Write Configuration → terraform init → terraform plan → terraform apply
모든 테라폼 configuration에 provider가 필요하지는 않다
contents가 비어있는 경우, provider를 생략 가능하다
특정 리소스를 재생성 및 재실행 시키는 커맨드
terraform taint ${resource} → 더 이상 taint는 지원되지 않음
terraform apply -replace=${resource}
remote-exec : 테라폼으로 생성된 리소스에 대한 프로세스를 실행하는 provider
Provider는 개인에 의해 작성 가능하다
Provider는 user community를 통해 유지될 수 있으며, 일부 provider는 HashiCorp에서 유지 관리한다
주요 클라우드 벤더사와 비클라우드 벤더는 테라폼 provider를 write, maintain, collaborate 가능하다
terraform init : 테라폼을 configuration 디렉토리에서 처음 실행할 때 하는 명령
구성 파일이 들어있는 작업 디렉토리를 초기화하는 명령어이다.
terraform output을 생성하지 않았을 때 대비책
public IP를 배포했는데 output을 생성하지 않아 public IP를 확인해야 하는 경우
terraform state list 로 리소스 이름 검색 → terraform state show public IP를 포함한 속성 찾기
IaC의 핵심 원칙
버전 관리 인프라 (Versioned Infrastructure)
멱등성 (Idempotence): 동일한 연산을 여러번 수행해도 결과가 바뀌지 않는 것
자체 설명 인프라 (Self-describing infrastructure)
Golden Image란 OS 영역을 포함해 필수 패키지, 보안 설정 등이 적용된 일종의 정형화된 이미지
사전 정의된 템플릿 이미지를 사용해 편의성일관성의 장점을 가진다
“description” argument는 변수 또는 출력에 대한 사람이 이해할만한 설명을 제공하는 데 사용된다
description argument는 state file에 저장되지 않는다
terraform resource example
resource "aws_vpc" "main" { name = "test" }
Go
복사
aws → provider
aws_vpc → resource type
main → resource name
인프라를 수동으로 destroy하는 경우 terraform에 변경 사항을 반영하는 법
terraform refresh → 더 이상 지원되지 않는 명령어
terraform plan -refresh-only or terraform apply -refresh-only
terraform refresh 는 configuration file을 업데이트하지 않는다 (처리되지 않는다)
public terraform module registry가 publicsh된 module에 대해 자동 노출하는 것
Required input variables
Optional inputs variables and default values
Outputs
module이 local value를 사용할 경우, terraform output으로 value를 노출시킬 수 있다
output value는 함수의 return value와 같다
secret data는 version control repository에 저장하지 않는다
vault를 사용하여 관리
환경 변수로 설정하여 관리
.tfvars 파일을 사용하되, .gitignore 등을 사용하여 버전 관리에서 제거
slice는 string 함수가 아닌 collection 함수이다
join, split, chomp 는 string function이다
프로비저닝된 기존 리소스를 테라폼을 사용하여 관리하는 방법
기존 리소스에 대한 terraform configuration 작성
기존 리소스에 대하여 terraform import를 통해 상태 파일에 로드
terraform init 은 현재 디렉토리에 sample main.tf 파일을 생성하지 않는다(초기화하지 않는다)
terraform workflow에서 새로운 인프라를 프로비저닝하는데 필수적인 두 단계
terraform init
terraform apply
terraform 은 go로 작성되었지만 Go runtime이 필요하지는 않다.
자동 잠금 해제에 실패할 경우에 force-unlock을 사용할 수 있다
force-unlock을 사용할 경우 terraform state가 일관되게 유지되지 않을 수 있기 때문에 사용에 주의해야 한다
Terraform은 Git 저장소, 로컬 파일 시스템 경로 또는 공개/비공개 모듈 레지스트리와 같은 다양한 소스에서 모듈을 가져올 수 있다
Secure variable storage Terraform EnterpriseCloud workspaces 에서만 사용 가능하다
Terraform CLI에서는 사용 불가
terraform validate는 terraform file의 syntax를 확인한다
terraform으로 구성한 모든 인프라를 제거하려 할 때, 삭제될 모든 인프라를 확인하기 위한 방법
terraform plan -destroy
terraform destroy - 삭제 승인 전, 삭제될 모든 인프라가 출력됨
terraform provisioner는 resource configuration block 내에서 중첩되어야 한다
독립적인 프로비저너를 사용할 수 없다
terraform은 플랫폼에 구애받지 않는다
운영 체제의 서버 버전이 필요하지 않음
default “local” terraform backend 는 State file을 저장한다
상태 파일에는 Terraform에서 관리하는 리소스에 대한 정보(현재 상태 및 리소스 간의 종속성 등)가 포함된다
terraform plan 또는 terraform apply와 같은 Terraform 명령을 실행할 때 Terraform은 상태 파일을 읽어 리소스의 현재 상태와 원하는 상태에 도달하기 위해 변경해야 하는 사항을 확인합니다.
Terraform HCL(HashiCorp Configuration Language) 코드를 표준 Terraform 스타일 규칙에 따라 포맷하려면 terraform fmt를 사용한다
Terraform Cloud/Enterprise에서의 private module registry는 조직 멤버에게 기능을 제한하게 하는 기능이 있다.
terraform init이 수행하는 것
configuration에 존재하는 모든 provider를 소싱하고, 로컬에서 다운로드하여 사용할 수 있도록 보장
백엔드에 연결
모든 module을 소싱하고 로컬에 configuration을 복사
속성 id를 가지는 객체 리스트 var.list가 있을 때, id list를 받기 위한 명령어
var.list[*].id
[ for o in var.list: o.id ]
terraform 변수 선언 시 필수 항목
변수 이름
variable "variable_name" {}
Go
복사
변수 선언 시 선택 항목
default, type, description, …
variable "variable_name" { type = string description = "Example description" default = "default_value" }
Go
복사
public Terraform 모듈 레지스트리에 저장된 모듈을 참조하기 위해 모듈 블록을 사용하는 경우, 버전 지정이 가능하다 (예상치 않은 버전 변경을 막기 위해 버전을 명시적으로 제한하는 것이 좋음)
module "consul" { source = "hashicorp/corp/aws" version = "1.0.0" }
Go
복사