본문 바로가기

DevOps

[AWS/Terraform] 테라폼으로 EC2 인스턴스 프로비저닝

테라폼(Terraform)이란?


테라폼(Terraform)은 하시코프(Hashicorp)에서 오픈소스로 개발중인 클라우드 인프라스트럭처 자동화를 지향하는 코드로서의 인프라스트럭처(Infrastructure as Code, IaC) 도구입니다.

IaC(Infrastructure as Code) 도구를 사용하면 그래픽 사용자 인터페이스가 아닌 구성 파일을 사용하여 인프라를 관리할 수 있습니다.

IaC를 사용하면 버전 지정, 재사용 및 공유할 수 있는 리소스 구성을 정의하여 안전하고 일관되며 반복 가능한 방식으로 인프라를 구축, 변경 및 관리할 수 있습니다.

  • Terraform은 여러 클라우드 플랫폼에서 인프라를 관리할 수 있습니다.
  • 사람이 읽을 수 있는 구성 언어를 사용하면 인프라 코드를 빠르게 작성할 수 있습니다.
  • Terraform의 상태를 사용하면 배포 전반에 걸쳐 리소스 변경 사항을 추적할 수 있습니다.
  • 인프라에서 안전하게 협업하기 위해 구성을 버전 제어에 커밋할 수 있습니다.

테라폼 프로바이더(Provider)

테라폼 프로바이더는 테라폼과 외부 서비스를 연결해주는 기능을 하는 모듈입니다.

AWS같은 클라우드 서비스에 코드로 인프라를 구축할 때 사용합니다. 예를 들어 테라폼으로 AWS 서비스의 컴퓨팅 자원을 생성하기 위해서는 aws 프로바이더를 먼저 셋업해야합니다.

테라폼에서 사용 가능한 프로바이더의 종류는 테라폼 레지스트리에서 확인할 수 있습니다.

  • 아마존 웹 서비스Amazon Web Service
  • 마이크로소프트 애저Microsoft Azure
  • 구글 클라우드 플랫폼Google Cloud Platform
  • VPS 서비스(디지털 오션Digital Ocean, 린노드Linode, 벌처Vultr)
  • 모니터링(데이터독Datadog, 뉴 렐릭New Relic, 그라파나Grafana)
  • 데이터베이스 서버(MySQL, PostgreSQL)

Deployment Workflow

  • Scope - 프로젝트의 인프라를 식별합니다.
  • Author - 인프라에 대한 구성을 작성합니다.
  • init - Terraform이 인프라를 관리하는 데 필요한 플러그인을 설치합니다.
  • Plan - 구성과 일치하도록 Terraform이 수행할 변경 사항을 미리 봅니다.
  • Apply - 계획된 변경을 수행합니다.

AWS에 EC2 인스턴스를 프로비저닝


사전 작업

환경변수로 AWS 프로바이더 설정

민감함 정보가 저장되지 않도록 테라폼을 실행하는 환경에 직접 환경변수로 정의합니다.

$ export AWS_ACCESS_KEY_ID="<AWS_ACCESS_KEY_ID>"
$ export AWS_SECRET_ACCESS_KEY="<AWS_SECRET_ACCESS_KEY>"

EC2 인스턴스 생성 코드 작성

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.16"
    }
  }

  required_version = ">= 1.2.0"
}

provider "aws" {
  region = "us-west-2"
}

resource "aws_instance" "app_server" {
  ami = "ami-08d70e59c07c61a3a"
  instance_type = "t2.micro"

  tags = {
    Name = "ExampleAppServerInstance"
  }
}
  • provider : 프로바이더의 이름입니다. 프로바이더는 이미 reqired_providers 블록에 포함되어 있어야 합니다. Terraform Registry에서 프로바이더를 구성하는 인수를 확인할 수 있습니다.
  • resource : 리소스 블록은 특정 프로바이더가 제공해주는 조작 가능한 대상의 최소 단위입니다.
    • aws_instance : 리소스 타입의 이름입니다.
    • app_server : 리소스에 임의로 붙이는 이름입니다. 다른 곳에서 이 리소스를 참조하기 위해서 사용합니다. aws_instance.app_server 과 같은 형식으로 참조할 수 있습니다.
    • 리소스 자체에 대한 구성 인수는 리소스 유형에 따라 달라집니다.
  • EC2 인스턴스, 시큐리티 그룹, 키페어 모두 aws 프로바이더가 제공해주는 리소스 타입입니다. 리소스 타입을 사용해 EC2의 가상 머신 리소스를 선언하고 조작할 수 있습니다.

테라폼 프로젝트 초기화

테라폼이 현재 디렉터리 아래에 선언된 프로바이더 플러그인을 설치해줍니다.

$ terraform init

테라폼 프로젝트 계획

HCL의 내용과 같이 같이 인스턴스를 생성할 예정이라는 계획을 보여줍니다.

$ terraform plan

현재 디렉터리 아래에 terraform.tfstate 파일이 생성됩니다.

테라폼 프로젝트 적용

계획(Plan)을 통해 확인한 내용을 실제로 프로바이더에 적용합니다.

$ terraform apply
Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

테라폼 프로젝트 리소스 삭제

$ terraform destroy