공식 문서에서는 Terraform을 다음과 같이 소개한다.
Terraform is an infrastructure as code (IaC) tool that allows you to build, change, and version infrastructure safely and efficiently. This includes low-level components such as compute instances, storage, and networking, as well as high-level components such as DNS entries, SaaS features, etc. Terraform can manage both existing service providers and custom in-house solutions.
쉽게 말해서, 테라폼이란 인프라를 안전하고 효율적으로 구축, 변경 및 버전화를 할 수 있는 코드형 인프라 도구이다 (IaC). 보통은 인프라를 GUI로 관리하곤 하는데, 코드로 관리할 수 있다는 점이 큰 장점인 것 같다. 뿐만 아니라, AWS, Azure, Docker, GCP, OCI, 그리고 Terraform Cloud 등 다양한 클라우드 플랫폼을 지원하며 버전 관리가 가능하다. 이전에 AWS CloudFormation을 사용해본 경험이 있는데, Terraform은 그것과 매우 유사하면서 더 다양한 플랫폼을 지원하는 것으로 보인다.
Infrastructure as Code
인프라를 사람이 읽을 수 있는 코드로 만들 수 있다. 이를 통해 버전 관리, 공유 및 재사용이 가능하다.
Execution Plan
수행할 작업을 설명하는 실행 계획을 생성한다. 이를 통해 수행 계획을 검토해볼 수 있다. 또한, 실제 적용 전에 승인을 요청함으로써 보다 안전하게 인프라를 관리할 수 있다.
Resource Graph
리소스 그래프를 만들고, 의존성이 없는 리소스들을 병렬로 생성 및 변경한다. 이를 통해 리소스를 최대한 빠르고 효율적으로 운영이 가능하다.
Change Automation
사람의 개입을 최소한으로 하면서 복잡한 인프라 변경을 적용 및 관리할 수 있다. configuration 파일을 업데이트 할 때, Terraform은 변경된 사항을 확인하고 종속성을 고려하여 증분 실행 계획을 생성한다. (솔직히 이 부분에 대해서는 아직 와닿지 않는다. 조금 더 공부해보고 이해가 되면 다시 자세한 설명을 적는걸로..)
https://learn.hashicorp.com/collections/terraform/aws-get-started
나는 내가 관리하고자 하는 인프라가 AWS에 구축되어 있기 때문에, AWS 리소스를 관리할 목적으로 Terraform을 공부하고 있다. 그리고 마침 공식 문서에 이 내용이 굉장히 잘 정리가 되어있다. AWS뿐만 아니라, Azure, Docker 등 다양한 플랫폼에서 어떻게 처음 시작할지 막막한 사람들을 위해 쉽고 친절하게 가이드가 잘 정리되어 있으니, 나처럼 처음 Terraform을 시작하는 사람들은 공식 문서를 보면서 간단히 따라해보는 것을 강력 추천한다. 아래는 공부하면서 기록했던 내용을 적어봤다.
Write Configuration
# sample configuration
# Terraform 셋팅 관련 설정을 위한 블록
terraform {
required_providers { # Terraform이 인프라를 provisioning 하기 위해 필요한 소스
aws = {
source = "hashicorp/aws" # optional hostname
version = "~> 3.27" # optional, but recommended. 만약 설정하지 않으면, Terraform은 가장 최신 버전을 사용함!
}
}
required_version = ">= 0.14.9"
}
# provider란 Terraform이 당신이 정의한 리소스를 생성 및 관리하기위해 사용할 플러그인
# 구체적인 provider를 정의하기 위한 블록. 이 경우에는 "aws"
provider "aws" {
profile = "default" # 이 값은 Terraform 이 너의 local에 AWS config file의 AWS credencials를 참고한다.
region = "us-west-2"
}
# 인프라의 컴포넌트들을 정의하기 위해 사용하는 블록
# resource "{RESOURCE_TYPE}" "{RESOURCE_NAME}"
resource "aws_instance" "app_server" {
ami = "ami-830c94e3"
instance_type = "t2.micro"
tags = {
Name = "ExampleAppServerInstance"
}
}
Command
terraform init # download necessary providers
Inspect state
Change Infrastructure
- : 리소스를 제거한다는 의미
+ : 리소스를 생성한다는 의미
-/+ : 리소스를 제거하고 다시 생성한다는 의미 (교체가 아님)