•
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 Enterprise 나 Cloud 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
복사