Terraform은 HashiCorp에서 개발한 인프라스트럭처 코드(Infrastructure as Code, IaC) 도구입니다. Terraform을 사용하면 클라우드 인프라를 코드로 정의하고, 이를 버전 관리하고, 변경사항을 추적하며, 인프라를 생성/변경/삭제하는 등의 작업을 자동화할 수 있습니다. Terraform은 다양한 클라우드 서비스 제공자들과 호환되어 AWS, Azure, Google Cloud, 등 다양한 클라우드 환경에서 인프라를 관리할 수 있습니다.
Terraform 명령어 기초
[그림 1] Terraform 기본적인 흐름도
terraform init: Terraform 작업을 위한 초기화를 수행합니다. 프로젝트 디렉토리에서 최초로 실행해야 합니다.
terraform plan: 변경 사항을 미리 확인하기 위해 실행합니다. 인프라 변경 사항을 검토할 수 있습니다.
terraform apply: Terraform 코드에 정의된 인프라를 생성/변경합니다.
terraform destroy: Terraform 코드에 정의된 인프라를 삭제합니다.
terraform state: Terraform 상태 정보를 확인하고 관리합니다.
Terraform docs 참고 방법
가장 먼저 [그림 1]의 Terraform 코드를 작성해야 하는데, 가장 참고하기 좋은 문서는 Terraform docs입니다. 들어가면 먼저 어떤 provider를 사용하는지를 선택하는데, 본인 환경에 맞는 provider를 선택하면 됩니다. 여기서는 aws를 예제로 사용할 것이기 때문에 aws를 선택하였습니다.
Terraform AWS Documentation 페이지에는 Terraform에서 사용할 수 있는 AWS 리소스들에 대한 대부분의 정보가 정리되어 있기 때문에 잘 활용하면 좋습니다.
[그림 3] Terraform docs에서 instance 생성 예제 검색
Instance를 생성하는 리소스를 검색하여 나온 위의 Instance 생성 예제를 그대로 코드로 입력해보겠습니다.
$ mkdir terraform && cd terraform
$ vim main.tf
provider "aws" {
region = "ap-northeast-2"
}
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["099720109477"] # Canonical
}
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = "t3.micro"
tags = {
Name = "HelloWorld"
}
}
Terraform에서는.tf 확장자를 가진 독자적인 언어를 사용합니다. 이 파일에 클라우드 인프라를 정의하는 Terraform 코드를 작성해야 합니다.
Terraform은 다양한 클라우드 서비스 제공자를 지원하며, 각 제공자에 대한 인증 정보와 설정을 구성 파일에 추가해야 합니다. 여기서는 AWS Provider 설정을 추가하였고, provider 밑으로는 모두 [그림 3]의 코드를 그대로 가져왔습니다.
Terraform 명령 수행
그럼 작성된 코드를 Terraform을 통해 배포하는 과정을 보여드리겠습니다.
[그림 4] terraform init 명령 수행
먼저 terraform init 명령을 수행합니다. init은 코드를 실행하는데 필요한 플러그인이나 모듈을 설치하는 등 초기화 작업을 수행합니다.
[그림 5] AWS Profile 설정
terraform plan 명령부터는 실제 인프라의 정보를 가져오는 작업이 들어가기 때문에 AWS 리소스에 접근할 수 있는 권한을 가진 유저의 Profile이 필요합니다. 권한이 있는 유저의 액세스 키를 등록하여 Profile로 설정하겠습니다.
[그림 6] terraform plan 명령 수행
terraform plan 명령을 수행하면 인프라에 어떻게 반영될지에 대한 결과를 미리 확인할 수 있습니다. 여기서는 Ubuntu 이미지를 사용하여 t3.micro 타입의 Instance를 하나 생성하도록 예제 코드를 작성하였기 때문에 해당 코드 적용 결과를 미리 확인할 수 있습니다.
terraform plan 명령을 수행하여 나온 출력 결과를 통해 자신이 원하는 방향으로 인프라가 변경될 것인지를 확인하고, 문제가 없다고 판단이 되면 terraform apply 명령을 수행합니다.
[그림 7] terraform apply 명령 수행
terraform apply 명령을 수행하면 plan에서 보여주는 인프라 변경 내용을 미리 확인할 수 있고, 아래 Enter a value 부분에 yes를 입력하게 되면 실제 인프라에 반영되게 됩니다. 문제없이 잘 반영됐다면 AWS Console에서 인스턴스가 잘 생성되었는지 확인해봅시다.
[그림 8] AWS Console에서 생성된 Instance 확인
코드로 작성한 내용대로 인스턴스가 잘 만들어진 것을 확인할 수 있습니다.
참고로 다음 [그림 9]와 같은 에러가 발생한다면, Default로 지정되어 있는 VPC가 존재하지 않기 때문에 생겨나는 에러입니다.
[그림 9] Default VPC가 없는 경우 에러
terraform 코드에서 필수로 입력받는 값이 아닌 optional한 값들은 값을 지정하지 않는 경우 default 값을 가져가는데, VPC 또한 기본으로 지정된 것이 없다면 생성할 때 에러가 나게 됩니다. 이점 참고해주세요! ⚠️
마지막으로 terraform destroy를 명령을 통해 앞서 terraform 코드를 기반으로 실제 인프라에 적용된 내용을 삭제할 수도 있습니다.
[그림 10] terraform destroy 명령 수행
마지막으로 당부드리고 싶은 말은.. 실제 운영 환경에서 apply를 할 일이 생기신다면 plan 결과를 꼼꼼하게 살펴보고 적용하시기 바랍니다. 이런 말을 하는 이유는.... 필자 또한 의도치 않은 실수로 생산 라인 전체가 멈춘 적이 있어 트라우마로 남아 있기 때문입니다🤣🤣🤣