Infra

Terraform이란?

hongyb 2024. 2. 24. 01:32

about Terraform

Infrastructure As Code

기업이 새로운 제품을 출시하거나 새로운 IT 인프라를 구축해야 할 때, 기존의 전통적인 방식은 일반적으로 다음과 같다.

 

1. 비즈니스 요구 사항 및 기술 리더가 새로운 제품 또는 인프라의 설계 및 계획을 수립

2. 구매팀은 필요에 따라 서버, 스토리지 장치 및 네트워킹 장비를 구입하거나 임대

3. 인프라 작업은 온프레미스 IT 직원 또는 데이터 센터 엔지니어에 의해 수행. 하드웨어의 설치 및 구성이 포함. ex) BIOS 설정, RAID 구성

4. 어필리케이션 배포

 

이러한 과정은 상당한 시간과 비용이 소요되며, 사람이 실수를 하거나 트래픽이 몰리거나 적게 몰릴 때 효율적인 관리가 힘들다. 이것을 해결하기 위해 도입된 것이 Cloud다.

클라우드는 위에 과정을 줄이고 효율적인 배포가 가능하게 해 준다. 하지만 큰 조직에서 클라우드를 관리하는 것은 어려운 일이다. 이러한 문제를 해결하기 위해 기업은 종종 셸(Shell), 파이썬(Python), PowerShell과 같은 언어를 사용하여 Cloud를 관리하고자 하는 수요가 늘어났다.

 

이러한 수요에 맞춰 IaC라는 개념이 등장햇다. IaC는 수동으로 인프라를 설정하는 것이 아닌 코드를 사용하여 인프라를 관리하는 기술을 뜻한다. 코드로 인프라의 원하는 상태를 정의하고 자동으로 설정된다. 이를 통해 개발자는 애플리케이션 구축에 집중할 수 있다는 장점을 갖게 되었다. 

 

내가 Terraform을 배운 이유는 IAC를 도입함으로써 인프라 관리에서 생산성을 향상하기 위해서이다. 또한 AWS를 쉽게 배울 수 있다고 판단하여 이번 기회에 배우기 시작했다.

 

이제부터 Terraform을 사용하는 기초 예제를 작성하도록 하겠다.

 

Terraform 다운로드

 다운로드 페이지에서 테라폼을 다운받을 수 있다. 링크 안에서 운영체제에 맞게 설치하면 된다. 만약 윈도우를 사용하지만 Linux에서 Terraform을 사용하고 싶다면 WSL을 다운받으면 된다. 배포 서버와 동일한 환경에서 개발하는 게 좋다고 생각한다. 일반적으로 배포 서버에서 Linux를 실행하고 있기 때문에 윈도우에서 Terraform을 사용하는 것보다 WSL을 설치해서 Linux에서 Terraform을 설치하는 것을 추천한다.

 

Mac을 설치했거나 WSL을 설치한 윈도우 사용자라면 모두 유닉스 기반 시스템을 이용할 수 있고, 버전 관리자로 asdf를 추천한다. 개발을 하다보면 여러 프로젝트에서 동시에 작업할 가능성이 높다. 프로젝트가 여러 개일 때 서로 다른 버전의 소프트웨어를 사용하는 일이 많다. 버전 관리자를 사용하면 프로젝트마다 소프트웨어 버전을 구성할 수 있다. 특히 asdf의 경우 프로젝트 Root 디렉토리에 있는 .tools-versions 파일을 사용하여 간단하게 구성할 수 있다. asdf는 사용자가 해당 프로젝트에 정의한 소프트웨어 버전을 사용할 수 있다. 버전에 대한 유연성을 원한다면 asdf의 설치 지침을 따르면 된다.

 

asdf를 설치한 후에는 아래 명령어로 Terraform 플러그인을 설치할 수 있다.

asdf plugin-add terraform-ls https://github.com/asdf-community/asdf-hashicorp.git

 

Terraform 플러그인을 설치한 후에는 asdf list all terraform을 사용하여 설치할 수 있는 테라폼 버전을 나열할 수 있다. 현재 이 글을 쓰는 시점에서 최신 버전의 Terraform은 1.7.3이고, asdf install terraform 1.7.3을 사용하여 설치할 수 있습니다. 그런 다음 asdf global terraform 1.7.3을 사용하여 시스템에 대한 기본 Terraform 버전을 설정할 수 있습니다.

 

terraform -version명령어를 입력했을 때 다음처럼 나오면 된다.

Terraform v1.7.3
on linux_amd64

 

AWS 자격 증명 구성하기

Terraform을 사용하여 AWS와 작업하려면 먼저 Terraform을 통해 AWS에 로그인할 수 있는 방법이 필요합니다. AWS console에서 IAM user를 생성 후 aws cli에 등록하는 방법을 추천한다. 

 

Terraform 변경사항 만들기

Terraform 파일은 아래와 같이 다양한 Json 형태의 블록으로 이루어져 있다.

provider "aws" {
  region = "us-west-2" # AWS 지역 설정
}

resource "aws_instance" "example" {
  ami           = "ami-example" # 사용할 AMI ID
  instance_type = "t2.micro"              # 인스턴스 유형
  key_name      = "my-key-pair-example"           # 사용할 키페어 이름

  tags = {
    Name = "example-instance"             # 인스턴스에 부여할 태그
  }
}

 

aws를 사용하기 위해 provider에 대해 알아야 한다. provider란 특정한 클라우드 제공 업체나 서비스와 통합되어 해당 서비스의 리소스를 관리하는 역할을 한다. 예를 들어, AWS Provider는 AWS 클라우드의 EC2 인스턴스, S3 버킷 등을 관리할 수 있다. Terraform 구성 파일에서 정의된 리소스를 실제로 생성하고, 변경을 추적하며, 관리합니다. 이를 통해 Terraform은 인프라의 상태를 지속적으로 관리하고 필요에 따라 업데이트할 수 있다. 또한 각 Provider는 특정 서비스의 API와 상호 작용하는 인터페이스를 제공한다. 이를 통해 Terraform은 서비스에 대한 액세스 및 제어를 수행할 수 있다.

 

주요 provider

  • AWS Provider: AWS 인프라와 서비스를 관리하는 데 사용된다. EC2 인스턴스, S3 버킷, IAM 사용자 등을 관리할 수 있다.
  • Azure Provider: Microsoft Azure에서 인프라를 관리하는 데 사용된다. 가상 머신, 스토리지 계정, 웹 앱 등을 관리할 수 있다.
  • Google Cloud Provider: Google Cloud Platform에서 인프라 및 서비스를 관리하는 데 사용된다. Compute Engine 인스턴스, Cloud Storage 버킷 등을 관리할 수 있다.

 

Terraform의 resource는 Terraform이 관리하는 인프라를 뜻한다. resource 뒤에는 "aws_instance"와 같은 것이 표시되고, 관리할 리소스 유형을 뜻한다. 이 경우에는 AWS EC2 인스턴스입니다.

다음 "example" 부분은 식별을 위한 리소스의 이름이다. 원하는 대로 지정할 수 있지만 설명적인 이름을 지정하는 것이 좋다. 이 블록 안에는 리소스에 대한 모든 구성이 있다. 리소스는 수백 가지가 있습니다. 모든 리소스를 다 외울 필요는 없다. 필요한 경우 공식 레퍼런스를 참조하여 사용하면 된다.

https://registry.terraform.io/providers/hashicorp/aws/latest/docs

 

Terraform Registry

 

registry.terraform.io

 

다음처럼 보안 그룹과 그 안의 규칙을 개별적으로 정의할 수 있다. 이는 수많은 리소스를 보다 쉽게 관리하기 위한 것이다.

resource "aws_security_group" "server" {
    name        = "name"
}

resource "aws_security_group_rule" "server_office" {
    security_group_id = aws_security_group.server.id

    description = "group-rule"

    type      = "ingress"
    from_port = 0
    to_port   = 0
    protocol  = "tcp"

    cidr_blocks = ["0.0.0.0/32"]
}

 

 

보안 규칙을 설정할 때 resource와 마찬가지로 모든 내용을 암기하지 말고 공식 문서를 참고해야 한다.

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group

 

Terraform Registry

 

registry.terraform.io

 

Terraform 변경사항 만들기

변경 사항을 배포해 보자. 다행히도 Terraform은 변경을 결정하기 전에 어떤 변경이 이루어질지 알 수 있는 방법을 제공한다. 처음 terraform init을 사용하여 terraform을 초기화한다. 이후 terraform plan을 사용하면 Terraform이 실제 인프라와 코드 간의 차이점을 식별하는 것을 볼 수 있다. 이러한 차이점을 기반으로 Terraform은 무엇이 생성, 삭제 또는 변경될지 알려준다.

이제 terraform apply을 실행하면 인프라 상태가 다시 확인되고 변경 사항을 알려준 후 실제로 변경할 수 있는 기회를 제공한다. 설명된 변경 사항이 실제로 수행하려는 변경 사항인 경우 yes를 입력하라는 메시지가 표시된다. 안전을 위해 yes라고 입력하지 않으면 작업이 중단된다. 모든 것이 정상으로 보이면 yes를 입력하고 변경 사항이 적용되는지 확인하면 된다.

 

terraform plan과 terraform apply은 중복된다는 의문점이 생길 수 있다. terraform plan을 사용하면 작업의 결과로 바이너리 파일을 출력할 수 있고. 해당 바이너리 파일을 terraform apply에 제공하면 현재 상태가 여전히 계획과 일치하는지 확인 후 테라폼이 변경을 수행한다.

 

아래 블로그에 들어가면 terraform 적용과 관련된 자세한 내용을 볼 수 있다.

https://spacelift.io/blog/terraform-plan

 

Terraform Plan Command: Examples & How It Works

What does the Terraform plan command do? See examples including output, plan to file, tfvars, variables, and others. Planning options and parameters.

spacelift.io