개요
인프라 구성을 코드형태로 관리하는 도구
HCL 언어로 작성이 된다.
모듈화가 가능하여 재사용 또한 가능.
기본 개념
Provider
특정 서비스에 인프라를 배포 및 구축하기 위해서 해당 특정 서비스에 대해 정의를 하는 모듈이다.
AWS, GCP, Azure 등 대중적인 클라우드 서비스 등 다양한 provider가 제공되고 있다. (https://registry.terraform.io/browse/providers?ajs_aid=b80c9fd9-90bf-46ae-a46e-0bab988deb00&product_intent=terraform )
Resource
특정 provider가 제공해주는 조작 가능한 최소 단위
AWS을 예로 어떤 리전을 선택할지, 인증에 필요한 key 설정 등을 정의할 수 있다.
output
인프라 구축이후 생성된 결과에 대해 정보를 얻을 수 있다. instance_id 등을 얻을 수 있다.
EC2 생성 terraform
vpc, subnet, keypair와 같은 것들은 인프라 팀에서 생성이 되어 있다는 가정 하에 해당 정보들을 참고해서 t2.micro 인스턴스를 띄워보자.
- ec2_test.tf
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_instance" "example" {
ami = "ami-045f2d6eeb07ce8c0"
instance_type = var.instance_type
subnet_id = var.subnet_id
security_groups = [ var.security_group_id ]
key_name = var.key_name
tags = {
Name = var.instance_name
}
}
- variables.tf
variable "region" {
default = "ap-northeast-2"
}
variable "instance_type" {
default = "t2.micro"
}
variable "subnet_id" {
description = "The ID of the existing Subnet"
default = "subnet-0dbc67b8395509fe5"
}
variable "security_group_id" {
description = "The ID of the existing Security Group"
default = "sg-011cb69ce8921ef15"
}
variable "key_name" {
description = "The name of the existing Key Pair"
default = "mcs-dev-kpair" # 실제 키 페어 이름으로 교체하세요
}
variable "instance_name" {
type = string
default = "terraform-test-bk"
description = "Instance Name"
}
- output.tf
output "instance_id" {
value = aws_instance.example.id
}
output "instance_public_ip" {
value = aws_instance.example.public_ip
}
Environment 별로 다르게 세팅을 하고 싶을 경우
terraform에서 -var, -var-file 이라는 옵션이 존재. 이걸 활용해보면 좋을 것 같다는 생각이 든다. 특히 -var-file을 이용한다면 tfvars라는 파일을 각 환경에 맞게 정의를 해놓고 불러오면 될 것 같다.
## prod.tfvars
instance_name="prod-test-terraform-01"
## dev.tfvars
instance_name="dev-test-terraform-01"
입력값에 대한 validation 기능
variable 에서는 validation이라는 기능이 존재하는데, 해당 기능으로 입력 값에 대한 validation 체크를 할 수 있다.
variable "instance_name" {
type = string
default = "terraform-test-bk"
description = "Instance Name"
validation {
condition = length(var.instance_name) > 5
error_message = "Instance name should be longer than 5 characters"
}
}
이 경우는 인스턴스 명은 5글자 이상이어야 하고, 미만일 경우에는 error_message를 밷어낸다 라는 정의이다.
AWS 관리 효율을 위해서 네이밍 규칙 등의 정책이 있을 경우, 해다 validation 기능을 활용하면 좋을 것 같다.
그리고 인프라 팀에서 공통 모듈을 만들고, 그 공통 모듈을 토대로 타 개발팀에서 가져와서 사용할 경우에도 저런 정책들이 있다라는 것을 안내하고 별도의 가이드 없이도 해당 정책대로 인스턴스 등 서비스들이 생성이 되도록 할 수도 있을 것 같다.