Terraform으로 EC2 생성해보기

Terraform으로 EC2 생성해보기

Created
Mar 25, 2024 06:51 AM
Tags
terraform

Terraform

테라폼은 IaC(Infrastructure as Code) 툴이다. GUI가 아닌 설정 파일을 이용해 인프라를 생성하고 관리할 수 있게 돕는다.
 
기존에는 AWS 콘솔에 로그인해 버튼을 몇번 클릭하면서 EC2 인스턴스를 생성할 수도 있었다. 하지만 IaC 툴인 테라폼을 이용하면 .tf 파일을 만들고 거기에 설정정보를 “코딩”한 뒤, 명령어로 설정한 내용을 바탕으로 EC2를 생성하게 할 수도 있는 것이다.
 
IaC의 장점은,
  1. 버전 관리를 할 수 있다(코드 형태이므로 git 같은 버전 관리 툴 활용 가능).
  1. 한번 짜 놓은 tf 파일을 재사용해서 동일한 인스턴스를 쉽고 빠르게 추가 생성할 수 있다.
  1. 설정정보를 쉽게 다른 사람과 공유할 수 있다.
 
IaC를 활용하는 장점은 정말 무궁무진하다. 오늘은 Terraform을 이용해 EC2를 생성해보는 작업을 해보자.
 

테라폼 설치

테라폼 공식사이트에서 brew를 이용해 설치하는 방법을 알려주고 있긴 한데, 테라폼도 버전이 있고 버전별로 제공하는 기능이 상이하다. 테라폼의 버전을 보다 쉽게 관리할 수 있게 tfenv를 사용해보자.
 
 
맥북 사용자라 가정하고 tfenv를 설치하는 방법을 정리한다.
(리눅스 사용자라면 설명이 필요없을 것이므로 생략; RTFM)
 
brew를 이용해 1.7.5 버전을 설치해보자
$ brew update $ brew instsall tfenv $ tfenv install 1.7.5 $ tfenv use 1.7.5 $ terraform version Terraform v1.7.5 on darwin_arm64
별도로 terraform을 설치할 필요가 없이 우리가 지정한 버전으로 설치까지 해준다.

EC2 생성

설정 파일 작성

# terraform 관련 세팅 terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.42.0" # 최신버전 이용 } } required_version = ">= 1.7.5, < 2.0.0" # 1.7.5버전을 이용하므로. } # CSP 관련 세팅 provider "aws" { region = "us-west-2" } # resource 관련 세팅 resource "aws_instance" "app_server" { ami = "ami-830c94e3" instance_type = "t2.micro" tags = { Name = "ExampleAppServerInstance" } }
 

Terraform 블록

테라폼에 대한 설정 정보를 담고 있다.
 

Provider 블록

여기에 기록된 설정대로 Terraform은 리소스 생성에 사용할 플러그인을 선택한다.
 

Resource 블록

리소스에 대한 정의를 담고 있다. 여기서 머신 사이즈, VPC ID와 같은 값을 설정하고 정의한다.
 

디렉토리 초기화

설정을 작성했거나, git checkout을 통해 다른 버전으로 변경했다면 terraform init 명령어를 통해 디렉토리를 초기화해줘야 한다.
 
위 명령어를 실행하면 terraform은 설정파일을 읽고 필요한 provider 플러그인을 .terraform이라는 숨겨진 디렉토리에 다운로드 한다.
 
더불어 .terraform.lock.hcl 파일이 생성되는데, 설치된 프로바이더 버전 등을 관리해주는 파일이다.
 

포멧팅과 validation

아래 명령어로 문서를 가독성있게 포멧팅할 수 있다.
$ terraform fmt
 
설정내용에 대한 validation check도 가능하다. 잘못된 설정이 있는지 사전 체크 가능하다.
$ terraform validate
 

인프라 생성

validation 통과를 확인했다면, 인프라를 생성해보자.
$ terraform apply
 
 

개선

지금까지가 Terraform 공식문서에 의한 EC2 생성 튜토리얼 내용이다. EC2 생성까지 무리없이 되었다면, 우리의 구조를 개선해보자.
 

리소스별로 디렉토리 분리

현재는 모든 리소스가 하나의 main.tf에서 정의되고 관리된다.
실제 서비스들을 배포하다 보면 ec2도 여러개일 것이고, s3 등 매우 다양한 자원들을 생성하고 관리할 것이다. 하나의 main.tf에서 모든 리소스를 관리하는 것은 비효율적이고 가독성이 떨어질 가능성이 크다.
 
리소스 종류에 따라 디렉토리를 분리해 보자.
. ├── ec2 │ ├── ec2.tf │ └── providers.tf ├── s3 │ ├── providers.tf │ ├── s3.tf └── README.md
 
먼저 ec2, s3 처럼 resource 형식에 따라 디렉토리를 구분했다.
다음으로 resource를 정의하는 파일과 provider와 관련된 파일을 분리했다.
 
ec2를 예로 들어 파일을 살펴보면 아래와 같이 분리했다.
ec2.tf
resource "aws_instance" "app_server" { ami = "ami-830c94e3" instance_type = "t2.micro" tags = { Name = "ExampleAppServerInstance" } }
 
providers.tf
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.42.0" } } required_version = ">= 1.7.5, < 2.0.0" } provider "aws" { region = "us-west-2" }
 

S3를 백엔드로 이용

현재는 tfstate 파일이 로컬에 생성되는데, 이 파일을 s3에 저장하도록 설정을 변경해보자.
 
먼저 아래처럼 디렉토리를 만들어준다
└── s3 ├── providers.tf └── s3.tf
 
이제 s3.tf 파일을 만들어 준다.
resource "aws_s3_bucket" "backend" { bucket = "kube-s3-backend" tags = { Name = "backend" description = "state backend for this repo" } }
 
 
다음으로 providers.tf 파일을 아래처럼 생성해준다.
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.42.0" } } required_version = ">= 1.7.5, < 2.0.0" } provider "aws" { region = "us-west-2" }
 
terraform init terraform apply로 s3 리소스를 생성해준다.
 
이제 2개 스텝을 수행해야 한다.
  1. s3를 백엔드로 사용하도록 s3 디렉토리 마이그레이션
  1. ec2를 백엔드로 사용하도록 ec2 디렉토리 마이그레이션
 
생성한 s3를 ec2에서 백엔드로 사용하게 하는 것 뿐만 아니라, s3 자신도 s3를 백엔드로 사용하도록 설정하는 것이다.
 
먼저 s3쪽의 providers.tf 코드에 backend를 추가해 준다.
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.42.0" } } backend "s3" { bucket = "kube-s3-backend" key = "infra/s3/terraform.tfstate" region = "us-west-2" } required_version = ">= 1.7.5, < 2.0.0" } provider "aws" { region = "us-west-2" }
 
다음으로 ec2 디렉토리 내의 providers.tf 코드도 아래처럼 수정해준다.
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.42.0" } } backend "s3" { bucket = "kube-s3-backend" key = "infra/ec2/terraform.tfstate" region = "us-west-2" } required_version = ">= 1.7.5, < 2.0.0" } provider "aws" { region = "us-west-2" }
 
 
 
 

사용한 리소스 제거

오늘 실습은 여기까지다. AWS 비용을 불필요하게 지출하지 않기 위해, 생성한 리소스들은 삭제해준다.
 
리소스를 제거하는 방법은 간단하다. 각 디렉토리에서 terraform destroy 명령어를 실행하면 된다.
 
$ terraform destroy