Terraform 시작하기
- 개발 환경(인프라)를 코드로 관리할 수 있게 해주는 오픈 소스
- 인프라 즉 EC2같은 인스턴스, 로드벨런스, 접근 관한등의 설정을 말한다.
그러면 인프라를 세팅하는 과정을 생각해보자.
- 어느 클라우드 서비스를 사용할지 선택하고
- 해당 클라우드 서비스의 config를 이용하여
- 필요한 서비스 (ec2, s3) 등을 설정한다.
간단하게 생각하면 이렇게 되는데 테라폼은 어떻게 이 과정을 거치는 지 알아보자.
먼저 테라폼의 핵심적인 플로우는 다음과 같다.
- write - 사용할 resource들을 정의한다.
- plan - 테라폼이 인프라 구성체를 생성하고, 수정하고 삭제하는 실행 계획을 생성한다.
- apply - 테라폼이 리소스의 종속성을 지키면서 동작한다.
알아보기 앞서서 테라폼의 파일 확장자명은 .tf 되시겠다.
명칭 알아보기
테라폼의 코드를 보면 알겠지만 블럭으로 이루어져있다.
블럭타입("provider, data, resource ...") "유형" "이름" {...}
블럭타입("Module","variable" ...) "이름" {...}
// 이렇게 두 가지로 볼 수 있겠다.
Provider.tf
이 Provider.tf는 어느 클라우드 서비스에 접근할지에 대한 정보(config 등)를 가지고 있는다.
provider "아마존 ?네이버 ? 텐센트? 오라클?" {
rigion = "클라우스 서비스 지역",
// aws면 access_key나 secret_key같은 정보가 들어간다.
}
Resourse
테라폼에서 resourse라고 부르는 것은 테라폼으로 생성하고 관리할 자원을 의미 하며, 보통 main.tf 등의 파일에서 사용한다. 이를 resource block이라고 한다.
resource "aws_instance" "this" {
ami = "사용할 ami"
instance_type = "인스턴스 타입"
key_name = "키페어 명"
ebs_block_device {
device_name = "디스크 볼륨 이름"
volume_size = "디스크 볼륨 사이즈"
}
vpc_security_group_ids = [
"vpc-그룹"
]
user_data = "유저 데이터"
}
위 코드는 테라폼으로 aws의 ec2 인스턴스를 세팅하는 코드이다. 이런 식으로 사용하게 된다.
Variables.tf (변수 선언)
테라폼으로 인프라를 세팅할 때, 고정된 값들을 사용하면 편하겠지만, 변수를 사용하는게 그렇지 않은가. 하나를 수정하려고 하니 다 찾아서 고쳐야하는 수고를 덜게하는 효과도 있는 것 처럼 테라폼도 변수를 지원한다.
# variables.tf
variable "instance_name" {
description = "이 변수에 대한 설명이다."
type = "변수의 타입이다."
default = "변수의 값"
}
이렇게 variables.tf파일에 선언한 변수는
# main.tf
module ec2 {
instance_name = var.instance_name
}
이렇게 가져와서 사용할 수 있다.
Outputs.tf
테라폼이 일하고 나서 뱉어내는 결과값을 지정한다. 인스턴스를 만들었으면 퍼블릭 ip라도 알아야 접근하지 않겠는가.
# outputs.ts
output "result" {
value = "(aws_instance 같은 리소스 명).app_server.public_ip"
}
Module
테라폼을 쓰게되면, ec2하나 s3하나 이렇게 인프라를 세팅하진 않을 것 같다.
ec2 올렸으니 올라간 인스턴스가 파일을 업로드 할 때 사용할 버킷을 만들고 인스턴스의 라우팅은 route53을 이용하고… 이런식으로 인프라는 유기적으로 구성되기 마련이다.
그렇기에 테라폼의 Module을 이용하면 그 구성들을 함께 관리할 수 있게 된다.
data "aws_vpc" "default_vpc" {
default = true
}
module security_group {
vpc_id = data.aws_vpc.default_vpc.id
}
module ec2 {
sg_id = module.security_group.sg_id
}
구성하기
파일 구조
기본적인 파일구조를 짜보자
.
├── main.tf
├── modules
│ └── 모듈
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
├── outputs.tf
└── variables.tf
이렇게 폴더를 구성하고
terraform plan -var="변수명=값"
해당 명령어로 테라폼의 계획을 설정하고 체크한다. 문제가 없으면
terraform apply -var="변수명=값"
해당 명령어로 실행한다.