Terraform 세미나 #1
in DevOps
소프트웨어 마에스트로 14기로 활동하면서 전담 멘토님께서 주관하시는 Terraform 세미나을 수강하게 되었고, 해당 세미나를 통해 학습한 키워드를 재학습하여 내 지식으로 만들고자 게시글을 작성하게 되었다.
인프라 관리 도구
IaC
Network, IAM, Server, DB Provisioning
- HashiCorp Terraform
- Provider Agnostic
- 그러면 하나의 코드로 AWS도 만들고, GCP도 만들 수 있냐 ⇒ X
- 라이브러리가 각 프로바이더별로 제공된다.
- Terraform Registry
- 프로바이더를 공유
- 모듈을 공유
- 정책을 공유 (유료 버전 → 무시)
- RUn Tasks (유료 버전 → 무시)
- CDK for Terraform
- AWS CDK
- AWS API
- Pulumi
- AWS CloudFormation
- AWS API
- Ansible
Image Builder
VMware Image, AWS EC2 AMI, Docker Container Image, Virtual Box Image
- HashiCorp Packer
- AWS Image Builder
CM Tools (Configuration Management)
- Ansible
- Puppet
- Chef
- SaltStack
테라폼 (Terraform)
[Documentation | Terraform | HashiCorp Developer](https://developer.hashicorp.com/terraform/docs) |
- 목표
- VPC 네트워크를 코드로 다뤄보기
- VPC 개수가 3-5개 정도 제한
핵심 개념 (Core Concepts)
주요 명령어
terraform init
terraform plan
terraform apply
terraform destroy
프로바이더 (Provider)
- 서비스 제공자 → AWS / GCP / Azure / Google Workspace / GitHub / DataDog / Grafana / Kafka / Kubernetes
모듈 (Module)
-
워크스페이스 (Workspace)
- 테라폼 상태를 관리하는 단위
테라폼 상태 (Terraform State)
- 테라폼 코드가 관리중인 리소스들의 상태를 저장
- 로컬 테라폼 상태 파일이
terraform.tfstate
테라폼 상태 저장소 ( Terraform State Backend / Terraform State Storage)
- 로컬 저장소
- 리모트 저장소 (Lock 지원 여부)
- AWS S3 + DynamoDB
- Terraform Cloud
- Terafform Enterprise
- Consul
- Kubernetes ETCD
리소스 (Resource)
- 인프라를 구성하고자 하는 자원을 정의 (VPC, S3 Bucket, EC2 Instance, ASG 등)
- 실제로는 API 엔드포인트 단위인 경우가 많음
- 참조 시에
resource_type.resource_name
혹은resource_type.resource_name.attribute
데이터 소스 (Data Source)
- 원격에서 데이터를 로드해서 활용하기 위해 사용
data {}
블록으로 정의data.data_source_type.name
혹은data.data_source_type.name.attribute
로 참조
로컬 변수 (Local Variables)
- 지역 변수를 정의하여 재활용 가능
locals {}
블록으로 정의local.local_var_name
입력 변수 (Input Variables)
- 워크스페이스의 입력 값을 정의
- CLI 옵션:
terraform apply -var key=val
- 환경 변수:
export TF_VAR_key=val
- 파일
.tfvars
확장자terraform apply -var-file=a.tfvars
.auto.tfvars
확장자 혹은terraform.tfvars
는 자동 적용
variable {}
블록으로 정의- 참조 시에
var.var_name
출력 변수 (Output Variables)
- 워크스페이스의 출력 값을 정의
output {}
블록으로 정의
디렉터리 구성
- 확장자는
.tf
- 일반적인 구성 (소규모)
**main.tf**
**variables.tf**
**outputs.tf**
terraform.tf
혹은providers.tf
versions.tf
AWS 신기능 업데이트 순서
- AWS API > AWS CLI > AWS Web Console