인프라 일기 0편 : IAC 메커니즘(Terrafrom)
인프라 일기 0편 : IAC 메커니즘(Terrafrom)
[ Terraform vs Pulumi ]
IAC : Infrastructe As a Code
→ 인프라 환경 설정을 코드로
일단 현재 팀에서 기본적으로 사용하던 (Setting은 내가 안함 = 사용만 할 줄 안다 ㅎㅎ)
Pulumi와 비교해보면
일단 현재 팀에서 기본적으로 사용하고 있다 (Setting은 내가 안함 = 사용만 할 줄 안다 ㅎㅎ)
- 언어
- Declarative(전체 설계도) : Terrafrom은 HCL이라는 자체 도메인 언어를 사용하면서 (like .tf)
- 반복을 한다기 보다, 매번 다르게 적용이나 / 동일한 설정을 반복하는 것에 가까움
- OOP(개별) : Pulumi는 Java, Go, Python, TypeScript 등등 기본적인 백엔드 언어 사용
- 각 객체를 만들고 해당 객체를 다시 불러서 수정 또는 다시 사용하는 OOP 개념
→ 조건문, 반복문 등을 사용할 때, for_each나 count 등 생소한 문법을 사용하며
→ if / for in range 등을 사용하면서
- 상태 관리 파일
- 로컬 저장 : Terraform은 .tfState라는 파일로 해당 정보를 저장
- SAAS 관리 : Pulumi는 자체 관리형 서비스인 Pulumi Service에 상태를 저장
- 일단 SOT 요청 → 받은 apply system 만 작업 → SOT update
- 나머지는 대기 → 이후에 앞선 작업이 끝나면 → update된 SOT를 받음
IAC 프로그램은 무조건 상태 관리가 필수!
→ 현재의 상태와 코드의 상태를 보고 변화한 부분을 적용하기 때문에 SOT 역할이 필요하다!
→ 여러 명이 동시 작업할 경우 DB Locking 등의 충돌 제어 필수
→ 동시에 apply 하더라도, SOT를 외부 서비스가 가지고 있으므로 (자동 충돌 제어)
- 패키지 및 모듈관리
- Terraform Registry : (like DockerHub)
- PackageManager : (그대로 Gradle, npm, pip) → 라이브러리처럼 인프라 코드 사용
[ 동작 명령어 세부 분석 ]
Terraform Core
- HashiCorp가 Go 언어로 개발한 오픈소스 소프트웨어
- 컴퓨터에 설치된
terraform.exe파일
- AWS, GCP, Azure와 직접 통신 불가능
1. terraform init
- 코드 유효성 검사
- Provider Plugin Load
- 인터넷을 통해 다운로드
main.tf안에서 Provider 확인 (likeprovider "aws")- core가 Terraform Registry(
registry.terraform.io) 서버에 접속 및 버전에 맞게 설치
→ .terraform 에 plugin 설치 (매번 설치 싫다 : Global Plugin Cache → 내 PC에 플러그인 저장)
2. terraform plan
- 상태 비교 및 변화 확인
- Desired State:
main.tf - State:
terraform.tfstate - Actual State: 플러그인을 통해 얻은 실제 인프라 상태
- 의존성 그래프(DAG = 방향+비 순환) 생성
- workspace (폴더 단위)의 모든 TF의 파일을 읽어서
- 수학적으로 계산하여 올바른 순서대로
- 모듈도 workspace 단위 → 모든 vpc_setup 폴더의 .tf 파일을 묶은 인프라 정보!
- Terraform Registry도 가능 : source = "terraform-aws-modules/vpc/aws”
→ .tf 파일의 순서를 통합해서 읽고 수학적으로 판단한다
예시) VPC 코드가 EC2 코드보다 늦게 읽히면 에러가 나지 않을까? NO
Module
- Plan 출력
- 가상 실행 결과(Dry-run) : 초록색(+), 노란색(~), 빨간색(-) [like github]
- 실제 변경 X
3. terraform apply
- RPC 통신 : core → background plugin 통신
- API 호출 : like AWS SDK library
- State 업데이트 :
terraform.tfstate덮어쓰기
참고 apply가 완료되면, 추가 되는 3개의 파일들
.terraform.lock.hcl
→ package-lock.json과 비슷한 역할 : 버전 기록 (팀원과 버전 공유 및 업데이트 확인용)
terraform.tfstate
→ 현재 상태 파일
(참고로 terraform destroy도 도 상태 변경으로 인식되어서, destory이 현재 상태가 빈 파일로)
terraform.tfstate.backup
→ 이전 상태 파일 : 백업용
[ Plan 유효, Infra Error ]
State Drift : tfState와 actual state 간의 불일치 Error
- Init & Plan - Desired State:
main.tf
- Init & Plan - State:
terraform.tfstate
- Apply - Actual State: 플러그인을 통해 얻은 실제 인프라 상태
→ 실제 Actual state를 확인하지 않은 채로 Plan 작업을 진행해서 생기는 에러
[init & plan]
.tf 와 .tfState 의 결과가 일치하면
다른 리소스를 수정할 때 EC2는 건드리지 않는 PLAN!
— — — — EC2 AWS Console 단에서 수정되어 있으면 — — — —
[apply]
apply단계에서 실제 API 호출 시 에러로 실패
→ refresh를 통해 현재 Actual state를 .tfState로 적용 필요!
[ AWS EC2 simulation ]
- IAM 계정 연결
- 간단한 python 서버 코드 작성
- .tf 파일 작성
- provider 설정
- default VPC 가져오기
- 보안 그룹 생성 (ingress 0.0.0.0 / egress 0.0.0.0)
- ami(aws linux os) 이미지 서칭
- EC2 생성
- 변경 내용 감지 및 신규 태그 지정
- 실제 실행