Terraform의 기본 개념과 형식 + 명령어

D A S H B O A R D
D E V E L O P
S E C U R I T Y
 Terraform
 Terraform 특징
 Terraform 기본 사용법
Reference

 Terraform

테라폼(Terraform)은 해시코프(HashiCorp)에서 Go 언어로 만든 오픈소스 인프라스트럭처 구성 도구
클라우드 서비스, 가상 머신, 네트워크와 같은 IT 인프라 자원을 코드로 관리할 수 있게 해주는 인프라스트럭처 아키텍처 및 운영 도구로, 이를 통해 인프라를 안전하고 효율적으로 배포, 변경, 버전 관리 가능
이는 IaC(Infrastructure as Code)의 원칙을 따르며, 이를 사용함으로써 배포 프로세스의 속도와 안정성이 향상되고, 인프라 변경의 추적이 용이해짐
테라폼은 클라우드 서비스 제공업체에 구애받지 않는 멀티 클라우드 환경을 지원하므로, 다양한 환경에서 사용 가능
IaC(Infrastructure as Code) 장점
자급식 배포 (Self-service)
코드를 수동으로 배포하는 대부분 팀에서는 배포를 수행하는 데 필요한 ‘마법의 명령어’를 알고 있는 소수의 시스템 관리자만 프로덕션 환경에 접속하여 배포를 진행 → 이는 회사가 성장하는데 방해가 됨
인프라 코드를 정의하면 전체 배포 프로세스를 자동화할 수 있으며 개발자는 필요할 때마다 자체적으로 배포를 진행할 수 있음
속도와 안정성 (Speed and safety)
배포 프로세스를 자동화하면 사람이 진행하는 것보다 훨씬 빠르게 컴퓨터가 배포를 진행할 수 있음.
자동화된 프로세스는 일관되고 반복 가능하며 수동으로 진행했을 때보다 오류가 적게 발생하기 때문에 더 안전함
문서화 (Documentation)
시스템 관리자 조직만 인프라에 관한 정보를 독점하는 것이 아니라 누구나 읽을 수 있는 소스 파일로 인프라 상태를 나타낼 수 있음
즉, IaC는 문서역할을 하여 시스템 관리자가 휴가중일 대도 조직의 모든 사람이 인프라 구조를 이해하고 업무를 볼 수 있도록 함
버전 관리(Version Control)
인프라의 변경 내용이 모두 기록된 코드형 인프라 소스 파일을 저장할 수 있으므로 버전을 쉽게 관리할 수 있음
인프라 변경 내역이 남아 있기 때문에 시스템에 문제가 생겼을 때 문제가 발생한 지점을 찾기가 수월함 → 문제의 내용 확인 후 문제가 없던 이전 코드로 되돌리면 간단하게 문제해결 가능
유효성 검증(Validation)
인프라 상태가 코드로 정의되어 있으면 코드가 변경될 때마다 검증을 수행하고 일련의 자동화된 테스트를 수행할 수 있음
정적 분석을 통해 오류 발생 위험을 줄일 수 있음
재사용성(Reuse)
인프라를 재사용 가능한 모듈로 패키징할 수 있으므로 모든 제품을 매번 처음부터 배포하는 대신 문서화되고 검증된 모듈로 일관되게 배포 가능

 Terraform 특징

모든 클라우드를 지원
어느정도의 구성관리를 지원하지만 프로비저닝 도구로 분류
불변 인프라 배포로 구성 드리프트 문제 발생 X → 변경이 아닌 새로운 서버 배포의 개념
선언적 언어 → 코드가 항상 인프라의 최신 상태를 나타냄
절차적 언어의 문제
인프라의 마지막 상태 정보를 기록하지 못함 → 절차적 언어는 단계별로 최종상태를 달성하기 때문에, 단계의 순서가 바뀌게 되더라도 다른 인프라임 → 위와 같은 이유로 절차적 언어는 최종상태를 추론하려면 지금까지 일어난 모든 변화에 대해 알아야함
재사용 가능성을 제한함 → 인프라의 현재 상태를 수동으로 고려하기 대문에 재사용성이 본질적으로 제한됨

 Terraform 기본 사용법

1. AWS 계정 설정

루트사용자의 aws credentials를 이용해도 괜찮지만, IAM 계정 생성 후 사용하는 것을 추천한다.
IAM 계정을 생성하면 ACCESS_KEY_IDSECRET_ACESS_KEY로 구성된 Credentials이 나오는데 이를 저장해둔다.(다시 확인할 수 없음)

2. Terraform 설치 및 자격증명 설정

아래 Terraform 링크에서 운영체제별 설치 방법으로 설치한다.
윈도우는 사용하기 편하도록 운영체제의 PATH 환경변수로 추가하는 것도 잊지 않도록 한다.
Terraform이 AWS의 계정을 사용하기 위해서는 1단계에서 받은 IAM의 Credentials나 루트 사용자의 Credentials를 추가해주어야 한다.
방법 1 : export 명령어 → 현재 사용중인 셸에서만 유용
$ export AWS_ACCESS_KEY_ID=위에서 받은 ACCESS_KEY_ID $ export AWS_SECRET_ACCESS_KEY=위에서 받은 SECRET_ACESS_KEY
Shell
복사
방법 2 : AWS CLI의 aws configure을 통해 등록
$ aws configure AWS Access Key ID [None]: 위에서 받은 ACCESS_KEY_ID AWS Secret Access Key [None]: 위에서 받은 SECRET_ACESS_KEY Default region name [None]: ap-northeast-2 # 자산이 사용하고자 하는 AWS Region Default output format [None]: json # 기본 출력 형식으로 default는 JSON
Shell
복사
방법 3 : $HOME/.aws/credentials 에 직접 등록
$ vi $HOME/.aws/credentials [default] # 원한다면 자신이 원하는 값으로 등록해도 됨 aws_access_key_id = 위에서 받은 ACCESS_KEY_ID aws_secret_access_key = 위에서 받은 SECRET_ACESS_KEY
Shell
복사

3. Terraform 기본 형식

Terafform 코드는 확장자가 .tf인 HCL(HashiCorp Configuration Language)로 작성
main.tf : 테라폼 사용시 가장 기본이 되는 파일
// main.tf 생성 후 작성 // CSP 지정 provider = "asw" { region = "ap-northeast-2" }
JSON
복사
resource : DB, LB, SERVER 등 리소스를 생성할 때 사용
resource "<PROVIDER>_<TYPE>" "<NAME>" { [CONFIG ...] } // Example : Instance resource "aws_instance" "example" { ami = "ami-0c55b159cbfafe1fo" instance_type "t2.micro" user_data = <<- EOF #!/bin/bash echo "Hello Terraform" > index.html EOF tags = { Name = "terraform-example" } }
JSON
복사
variable : 테라폼에서 사용할 변수 정의
variable "<NAME>" { [CONFIG ...] } // Example variable "number_example" { description = "An example of a number variable in terraform" type = number // number, list, map, object default = 42 }
JSON
복사
output : 테라폼 실행 출력 결과 지정
output "<NAME>" { value = <VALUE> [CONFIG ...] } // Example output "puiblic IP" { value = aws.instance.example.public_ip description = "instance public ip" sensitive = false }
JSON
복사
data : CSP에서 제공하는 데이터 소스를 변수로 사용하기 위함
data "<PROVIDER>_<TYPE>" "<NAME>" { [CONFIG ...] } // Example data "aws_subnet_ids" "default" { vpc_id = data.aws_vpc.default.id }
JSON
복사

4. Terraform 명령어

terraform init → 테라폼 바이너리에는 테라폼의 기본 기능들을 내장하고 있지만, 모든 CSP에 대한 코드를 포함하고 있지 않음 → 따라서 init 명령어를 통해 테라폼 코드를 스캔하고 CSP를 확인한 후 필요한 코드를 다운받게 함 → 새 태라폼 코드를 실행할 때마다 해주어야하며, 여러번 실행하는 것이 안전!! → 멱등성 제공
terraform plan → 실제 실행하기 전에 테라폼이 수행할 작업들을 확인할 수 있음
terraform apply → 실제 테라폼 코드 실행
terraform destroy → 테라폼은 새성된 리소스를 추적하기 때문에 명령어 한번으로 모든 자원을 정리할 수 있음