큰형님테라폼 나왔죠? 낭만있죠? 완성입니다.
오늘도 제목 어그로로 시작하는 블로그 글
저번 글들을 읽지 않으신분들 위해 제 자신을 소개 시켜드리자면 차이나 아닙니다
저는 귀차니즘이 심한 개발자입니다. 제 블로그 소개에는 소프트웨어 개발과 밀당하는 개발자라고 써놓았지만 사실은 귀차니즘과 밀당하는 개발자입니다. 이젠 그냥 인정 하겠습니다
하지만 아주 유명한 말이 있죠
게으름이 세상을 바꾼다
사실 누가 말한건지는 모르겠지만 그냥 있다고 합시다. 귀찮아요
저는 제가 게으른걸 알고 있기 때문에 (사실 게으르기 보단 그냥 귀찮은건데. 그게 그건가?) 그걸 극복하기 위해 많을 일을 합니다.
바로 자동화 입니다.
제가 게으르니 그냥 남이/무언가가 대신 해주면 되지 않나요? 이건 극복이 아니라 도와주는거 아닌가
그래서 이번 주제는... 제가 배포 할때 귀찮아서 사용했던 테라폼에 대해서 얘기를 해볼까 합니다.
갑자기 테라폼 얘기한다고 하다가 클라우드 얘기를 해서 죄송합니다.
하지만 테라폼과 클라우드는 때어낼수 없는 관계입니다. (둘다 맥주 이름같긴 합니다)
클라우드가 뭔지는 다른 블로그 글들 읽어 보시는걸 추천 합니다. 또또 귀차니즘이..
하지만 대충 요약을 해드리면.
빌려쓰는 컴퓨터 입니다 피씨방도 클라우드가 될수 있습니다
민이의 클라우드 업체 운영하기
물론 클라우드 업체에서 컴퓨터를 빌리는게 피씨방보다 더 많은 장점이 있습니다만 생각을 해보면 특별히 다를게 없습니다.
그래서 테라폼은 뭘까요?
테라폼은 HashiCorp에서 만든 Provisioning Tool입니다. 이게 뭐고
그냥 클라우드 자동화 툴 이라고 생각하시면 됩니다.
테라폼으로 할수있는 일은 아주 많습니다.
예를 들어서:
이거 어디서 많이 본 과정 아닌가요? 어디서 많이 먹어본 맛
네 바로 저희가 보통 클라우드에 서비스 배포 할때 필요한 모든것 입니다!
즉 테라폼으로 저희가 매번 aws나 gcp에 일일이 클릭으로 설정 하고 수정 하는 작업을 자동화 시켜준다는 점이죠!
이번 글에서는
귀찮지만코드가 조금 존재할 예정이니 코드 울렁증이 있으면 여기까지 읽으시면 됩니다.좋아요 눌러주시고 나가주세요
테라폼은 자체 언어와 파일 확장자로 설정을 합니다. .tf
로 끝나는 파일에 TCL (Terraform Configuration Language)를 사용해 설정을 하면 되는거죠! 영어로 쓰니 조금 있어보이죠?
자세한 문법은 여기를 참고 하시면 됩니다 테라폼 문법
아래 예시를 보여드리겠습니다.
# 클라우드 업체 설정
provider "aws" {
region = "us-east-1"
access_key = "your_access_key"
secret_key = "your_secret_key"
}
# VPC 설정
resource "aws_vpc" "example_vpc" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "example_vpc"
}
}
# 네트워크 서브넷 설정
resource "aws_subnet" "example_subnet" {
vpc_id = aws_vpc.example_vpc.id
cidr_block = "10.0.1.0/24"
availability_zone = "us-east-1a"
tags = {
Name = "example_subnet"
}
}
# 인터넷 게이트웨이 설정
resource "aws_internet_gateway" "example_igw" {
vpc_id = aws_vpc.example_vpc.id
tags = {
Name = "example_igw"
}
}
# 부수적인 네트워크 설정
resource "aws_route_table" "example_route_table" {
vpc_id = aws_vpc.example_vpc.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.example_igw.id
}
tags = {
Name = "example_route_table"
}
}
# 서브넷 연결
resource "aws_route_table_association" "example_route_table_assoc" {
subnet_id = aws_subnet.example_subnet.id
route_table_id = aws_route_table.example_route_table.id
}
# 방화벽 설정 (포트)
resource "aws_security_group" "example_sg" {
vpc_id = aws_vpc.example_vpc.id
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "example_sg"
}
}
# 인스턴스 생성
resource "aws_instance" "example_instance" {
ami = "ami-0c55b159cbfafe1f0" # Amazon Linux 2 AMI (example)
instance_type = "t2.micro"
subnet_id = aws_subnet.example_subnet.id
security_groups = [aws_security_group.example_sg.name]
tags = {
Name = "example_instance"
}
}
# 고정 아이피 활당
resource "aws_eip" "example_eip" {
instance = aws_instance.example_instance.id
tags = {
Name = "example_eip"
}
}
물론 이 외에도 더 많은 설정이 필요하고 상황에 따라서는 많이 다릅니다. 그리고 클라우드 업체마다 사용하는 함수들이 조금 다를수 있습니다.
저는 프로젝트에서 GCP를 사용하기 때문에 위 코드와 조금 다르고 설정도 좀 다릅니다.
하지만 중요한 점은 위 같은 코드를 main.tf
라는 파일에 적어주시고
테라폼을 설치 하시고
맥은 Brew로 쉽게 가능합니다
순서대로
terraform init
-> terraform plan
-> terraform apply
해주시면 인스턴스 생성과 위에 적어둔 네트워크 설정들이 끝납니다.
네 끝입니다.
보통 한시간에서 많게는 몇시간 걸리는 작업이 코드만 준비 되어있으면 2~3분안에 끝난겁니다.
물론 이런 질문이 있으실수 있죠.
하지만 저는 인스턴스 한번 올리고 끝나는데. 저건 과정도 복잡하고 코드(테라폼 설정 언어)도 짜야되고... 그냥 클릭으로 몇번 하는게 더 이득 아닌가요?
네 맞습니다.
근데 진짜 돌려 까는게 아니라 맞는 얘기 입니다.
테라폼은 결국 "반복되는 작업"을 자동화 시켜주는 겁니다. 1년에 한번 정도 인스턴스 띄우시고 작업 하시면 별로 크게 상관이 없습니다. 근데 개발자가 그정도밖에 안한다고요...?
하지만 자주 인스턴스를 올리고, 클라우드 계정을 바꾸고 프리티어를 쓰기위한 몸부림 하시거나 팀원들에게 클라우드 설정을 공유 하는 상황에서는 테라폼이 월등이 좋습니다.
쿠버네티스 프로젝트를 위해서 인스턴스를 10개를 띄우고 그걸 또 설정 해주는데 그 작업을 만약에 한달에 한번은 해야된다면?
테라폼을 쓰는 겁니다.
심지어 인스턴스나 네트워크 수정도 쉽습니다. 그냥 수정하시고 terraform apply
해주시면 말 그대로 "딸깍" 입니다.
기회가 되시거나 인스턴스를 자주 관리 하시는분들은 한번 사용해보시는걸 어떨가요?
생각보다 배우는거는 쉽습니다.
여기까지 테라폼 얘기 였습니다. 읽어주셔서 감사합니다!