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_ID와 SECRET_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
→ 테라폼은 새성된 리소스를 추적하기 때문에 명령어 한번으로 모든 자원을 정리할 수 있음