Terraform
현직 DevOps 엔지니어, AWS Hero 가 이야기하는 Terraform 기본설명
Terraform 구성요소
- Infrastructure as Code (
Iac
) , 코드로써의 인프라
- 인프라를 이루는 서버 ∙ 미들웨어 그리고 서비스 등 인프라 구성요소들을 코드를 통해 구축하는 것
IaC
는 코드로써의 장점, 즉 작성용이성 ∙ 재사용성 ∙ 유지보수 등의 장점을 가짐
Terraform 이란?
- 테라폼은 인프라를 만들고 변경하고 기록하는
IaC
를 위해 만들어진 도구로써 문법이 쉬워 비교적 다루기 쉽고 사용자가 매우 많아 참고할 수 있는 예제가 많음
- AWS ∙ Azure ∙ GCP 같은 퍼블릭 클라우드 뿐만이 아닌 다양한 서비스들 역시 지원
Terraform 기본 구성요소
output
- 테라폼으로 만든 자원을 변수 형태로
state
에 저장하는 것을 의미
module
- 공통적으로 활용할 수 있는 코드를 문자 그대로 모듈 형태로 정의하는 것을 의미
remote
- 다른 경로의
state
를 참조하는 것을 말함
output
변수를 불러올 때 주로 사용
provider
provider "aws" {
region = "ap-northeast-2"
version = "~> 3.0"
}
provider
안에서 다양한 인자들을 가짐
- AWS
resource
를 다루기 위한 파일들을 다운로드 하는 역할
resource
main.tf
∙ vpc.tf
등 원하는 형태로 파일 이름을 사용
resource "aws_vpc" "example" {
cidr_block = "10.0.0.0/16"
}
- 테라폼으로 VPC 를 생성하는 코드
- VPC 역시 다양한 인자와 다른 구성요소가 존재하지만 여기서는 간단한 형태만 소개
state
terraform.tfstate
라는 파일명을 가짐
- 테라폼으로 작성한 코드를 실제로 실행하게 되면 생성되는 파일
- 실제로는 코드가 굉장히 길어질 수 있음
{
"version": 4,
"terraform_version": "0.12.24",
"serial": 3,
"lineage": "3c77XXXX-2de4-7736-1447-038974a3c187",
"outputs": {},
"resorces": [
{...},
{...}
]
}
- 테라폼
state
는 현재 인프라의 상태를 의미하는 것은 아님
- 테라폼 명령어를 실행하게 되서 생성한 리소스들의 결과값일 뿐 인프라의 실제 상태는 아님
- 즉,
state
파일과 현재 인프라의 상태를 똑같이 유지하는게 키포인트
state
는 원격 저장소인 backend
에도 저장될 수 있음
output
resource "aws_vpc" "default" {
cidr_block = "10.0.0.0/16"
}
output "vpc_id" {
value = aws_vpc.default.id
}
output "cidr_block" {
value = aws_vpc.default.cidr_block
}
module
module "vpc" {
source = "../_modules/vpc"
cidr_block = "10.0.0.0/16"
}
module
은 한 번 만들어진 테라폼 코드로 같은 형태를 반복적으로 만들어낼 때 주로 사용
- 재사용에 대한 강점 존재
module
을 어떻게 쓰느냐에 따라 테라폼을 잘 쓰냐 안 쓰냐를 판단하기도 함
remote
remote
는 원격 참조 개념으로 이해하면 좋음
data "terraform_remote_state" "vpc" {
backend = "remote"
config = {
bucket = "terraform-s3-bucket"
region = "ap-northeast-2"
key = "terraform/vpc/terraform.tfstate"
}
}
key
값에 명시한 state
에서 변수를 가져옴
state
파일에서 output
으로 저장된 변수를 가져오게 됨
Terraform 기본 명령어
plan
- 테라폼으로 작성한 코드가 실제로 어떻게 만들어질지에 대한 예측 결과를 보여줌
import
- 이미 만들어진 자원을 테라폼
state
파일로 옮겨주는 명령어
state
- 테라폼
state
를 다루는 명령어
- 하위 명령어로
mv
, push
와 같은 명령어 존재
destroy
- 생성된 자원들을
state
파일 기준으로 모두 삭제하는 명령어
기본 명령어 Process
Init
- 작성한 코드에서
init
명령어를 입력
- 테라폼의 다른 명령어들을 위한 설정을 진행
- 내부적으로는
provider
와 state
, module
설정 등이 있음
Plan
- 실제로 작성한 테라폼 코드가 어떻게 만들어질지에 대한 예측 결과를 보여주는 명령어
- 가장 많이 쓰이는 명령어
- 기본적으로
plan
에 문제가 없어야 apply
에 문제가 없을 확률이 높음
Apply
- 실제로 작성한 코드로 명령어를 생성하는 명령어
- 실제 인프라에 영향을 끼치는 명령어이므로 주의깊게 실행을 해야 함