본문으로 건너뛰기

Terraform 개념 잡기

Jeff
· 약 6분

클라우드 시대가 되면서 인프라 엔지니어는 서버실에서 벗어나게 되었습니다. AWS 콘솔에서 클릭 몇 번으로 서버를 배포하고, 명령어 한 줄로 다양한 인프라를 구축할 수 있게 되었습니다. 더 나아가 인프라를 더 빠르고, 안전하게 관리하는 방법이 등장합니다.

IaC란?

코드형 인프라(Infrastructure as Code, IaC)는 수동 프로세스가 아닌 코드를 통해 인프라를 관리하고 프로비저닝하는 것입니다. 우리가 원하는 네트워크, 서버, 스토리지 등을 모두 코드로 저장하고 관리합니다. 이렇게 하면 코드를 공유하고, 테스트하고, 재사용할 수 있기 때문에 더 생산성 있게 인프라를 관리할 수 있습니다.

테라폼은 무엇인가요?

테라폼은 IaC 중에 가장 유명한 도구입니다. AWS, GCP, Azure 같은 클라우드뿐만 아니라 사내 솔루션까지 모두 관리할 수 있는 장점이 있습니다. 또한 원하는 최종 결과를 정의하는 선언형(declarative) 방식을 사용하기 때문에 결과를 예측하기 쉽고 코드를 재사용하더라도 같은 결과를 보장할 수 있습니다.

terraform plan을 하면 AWS에서 어떻게 생성될지에 대한 구체적인 계획을 세우고, terraform apply를 통해 실제 적용합니다. 그리고 테라폼을 통해 생성된 리소스에 대한 정보를 tfstate라는 JSON 파일로 관리합니다.

photo | 인포그랩 GitLab | 인포그랩 GitLab

테라폼을 어떻게 사용하나요?

테라폼은 여러 키워드들을 통해 유저의 입력을 받아, 리소스를 생성하고, 실행한 결과를 CLI 상에 출력하는 기능을 제공합니다. 여기서는 몇 가지 기본 키워드를 알아봅시다.

Provider

프로바이더는 리소스 유형을 구현하는 플러그인입니다. AWS, GCP 같이 사용하는 클라우드 플랫폼 및 서비스에 대한 프로바이더를 찾아 구성에 추가한 다음 해당 리소스를 사용하여 인프라를 프로비저닝할 수 있습니다.

provider "aws" {
region = "ap-northeast-2"
}

Module

모듈은 관련 리소스 그룹을 단일 리소스인 것처럼 관리할 수 있는 재사용 가능한 작은 Terraform 구성입니다. 다른 사람이 만든 모듈도 자유롭게 활용할 수 있어 적은 코드로 많은 리소스를 효율적으로 관리할 수 있습니다. 구성을 다르게 해서 같은 모듈을 여러 번 호출할 수도 있습니다.

module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "~> 3.0"

name = local.name
cidr = "10.99.0.0/18"
...
}

Resource

리소스는 가상 네트워크, 컴퓨팅 인스턴스 또는 DNS 레코드와 같은 상위 수준 구성 요소와 같은 하나 이상의 인프라 개체를 설명하는 키워드입니다.

resource "aws_instance" "sample" {
ami = "ami-0a93a08544874b3b7" # amzn2-ami-hvm-2.0.20200207.1-x86_64-gp2
instance_type = "t3.micro"
key_name = aws_key_pair.admin.key_name
vpc_security_group_ids = [
aws_security_group.ssh.id,
]
}

Variable

입력 변수(input variables)는 모듈의 소스 코드를 변경하지 않고 리소스의 속성을 지정할 수 있습니다. 프로그래밍 언어의 함수 매개 변수(Arguments)와 유사합니다. 입력 변수를 통해 모듈을 더 유연하게 공유하고 재사용할 수 있습니다.

variable "availability_zone_names" {
type = list(string)
default = ["ap-northeast-2a"]
}

Output

출력 값(output values)은 명령줄에서 사용할 수 있는 인프라에 대한 정보를 만들고, 사용할 다른 Terraform 구성에 대한 정보를 노출할 수 있습니다. 프로그래밍 언어의 반환 값(Return values)과 유사합니다.

output "instance_ip_addr" {
value = aws_instance.server.private_ip
description = "The private IP address of the main server instance."
}

인포그랩에서는?

지금까지 IaC와 Terraform 의 개념에 대해 알아보았습니다. 테라폼을 잘 사용하면 인프라를 더 효율적으로 관리하는 데 도움이 될 것입니다.

인포그랩은 GitLab 및 DevOps에 대한 맞춤 기술 지원을 제공합니다. GitLab(Omnibus/Cloud Native Hybrid) 구축 관련한 지원이 필요하시면 문의하기 로 연락해 주십시오.