[Terraform] 소개, 사용법

개요
terraform은 대표적인 오픈소스 인프라 자동화 도구다.
플랫폼에 독립적으로 다양한 인프라 구축 및 설정을 모듈화해서 편리하게 처리할 수 있다.
본 포스트에서는 AWS를 위주로 다룰 것이다.
설치
설치방법은 여기에 있다.
https://www.terraform.io/downloads
시키는대로 해서 이렇게 실행되면 잘 설치된 것이다.

그리고 폴더 하나 파고, init 명령으로 초기화한다음에

tf 파일을 하나 만들어준다.
저기다가 스크립트를 작성할 것이다.
인프라 구성하기 (AWS)
aws를 제어하려면 terraform 이외에도 선결조건이 있다.
aws-cli가 설치되어있고, 또 ACCESS-KEY와 SECRET-KEY가 세팅되어 있어야 한다는 것이다.
키값은 환경변수로 놔도 되고, aws configure로 넣어놔도 된다.
그다음에는 다음과 같은 형태로 스크립트를 작성해주면 된다.
terraform {
required_providers {
# 일종의 라이브러리 로드
aws = {
source = "hashicorp/aws"
version = "~> 4.16"
}
}
required_version = ">= 1.2.0"
}
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_instance" "app_server" {
ami = "ami-0e9bfdb247cc8de84" # ami 이미지
instance_type = "t2.nano" # 인스턴스 타입
tags = {
Name = "TestInstance" # 인스턴스명
}
}
terraform은 프로바이더라는 것으로 모듈화를 하고 재사용을 추구한다.
여기서는 aws 제어를 위해 aws 프로바이더를 땡겨썼는데, 이런건 다 테라폼 레지스트리에서 확인할 수 있다.
그리고 resource 구문을 통해 ec2 인스턴스 리소스를 정의했다.
ami와 인스턴스 타입, 이름 정도를 지정했다. 이외에도 옵션값은 많고, ec2 이외에도 대부분의 요소들을 제어할 수 있다.
자세한건 문서를 참조하길 바란다.
https://registry.terraform.io/providers/hashicorp/aws/latest/docs
아주 친절하고 보기좋게 잘 써놓은 편이다.
카프카 커넥트들 문서 보다가 이걸 보니 정화되는 기분이다.
여기서 ami는 아래 저거고

인스턴스 타입은 이거 그대로 골라서 박으면 된다.

작성 후에 validate로 검증만 통과하면, 잘 만들었다는 것이다.
이제 실행해보면 된다.
인프라 생성
작성한 테라폼 리소스를 생성하려면 apply 명령을 사용하면 된다.

그럼 열심히 로그 찍어주면서 최종 동의 받고, 작업을 처리해줄 것이다.
짜잔
show 명령을 사용하면 해당 리소스에 대한 상태확인도 계속 할 수 있다.

인프라 변경
인프라의 지속적인 변경도 가능하다.
만약 인스턴스 사이즈를 바꾸고 싶다면
스크립트만 바꾸고
apply를 다시 먹여주면 된다.
그럼 어떻게 바뀌는지 알려주면서 최종동의 받고
처리를 해준다.
다만, 수정이 불가능한 부분을 수정하려 하면

삭제 후 재생성으로 처리를 하게 된다.
삭제한다고 친절하게 알려주니까 잘 보길 바란다.
지우고

다시 만든다.

인프라 삭제
인프라 삭제는 destroy 명령을 쓰면 된다.
간단하다.


입력 변수 처리하기
근데 위에서 사용했던 스크립트 코드에는 문제가 좀 있다.
값이 다 하드코딩되어있어 재사용이 불편하다는 것이다.
예를 들면, 인스턴스의 이름 같은 것은 그때그때 다르게 넣을 일이 매우 많을 것이다.
이런건 변수로 빼는게 좋다.
먼저 변수 설정용 tf 파일을 작성해서, 다음과 같이 변수를 정의한다.
설명, 타입, 기본값 정도만 넣어주면 된다.
기본값이 없으면 필수로 전달을 해줘야 한다.
그리고 기존 스크립트에는 var.변수명의 형태로 삽입이 가능하다.

그럼 실행할때 다음과 같이 옵션을 주거나,

default가 없는 필수값 상태라면

명령행에서 입력하라고 기다려준다.

출력값 처리
인프라 요소가 생성된 뒤의 출력값을 받아다 처리하는 것도 가능하다.
이를면, 인스턴스를 생성하고 나면 사후의 처리를 위해 IP를 확인해야 할 일이 잦을 것이다.
output용 스크립트 파일을 생성 후, 다음과 같이 작성한다.
설명과 값을 넣어주면 된다.
저기서 값을 넣은 것은
이 리소스의 public_ip 값을 받겠다는 뜻이다.
이대로 apply를 먹이고 output 명령을 사용하면 해당 출력값들을 찍어볼 수 있다.

복합 리소스 구성
위의 예시에서는 EC2 인스턴스 딸랑 하나만 다루고 말았지만, 실사용시에 저렇게 쓸일은 거의 없을 것이다.
당연히 리소스를 여러개 유기적으로 구성할텐데, 하던대로 리소스만 여러개 더 작성하면 될 뿐이다.
이런 식으로 말이다.
아래 스크립트는 EC2 인스턴스에 대상 그룹을 통해 로드밸런서를 연결하는 예시다.
유의할 점은 output에서 리소스의 반환값을 꺼내썼듯이, 그걸 또 받아다가 다른 리소스의 옵션으로 줄 수 있다는 것이다.
게다가, 리소스의 작성 순서는 실제 실행 순서와 아무 관계가 없다.
리소스의 실행 순서는 리소스의 반환값을 연결한 것을 추적해서 테라폼이 자동으로 정해준다.
그래서 꽤 사용하기가 편리하다.
참조
https://www.terraform.io/
https://midasitwebop.tistory.com/69