Terraform 사용법을 숙지해보자!

maketheworldwise·2022년 5월 9일
1


이 글의 목적?

Terraform을 사용해보자.

AWS CLI

AWS CLI는 AWS 서비스르 관리하는 통합 도구다. 여러 AWS 서비스를 명령줄에서 제어하고 스크립트로 자동화할 수 있다.

# 설치
$ brew install awscli

# 확인
$ which aws
$ aws --version

설치가 끝나면 인증 설정을 적용해주어야 한다. AWS 계정에서 발급한 IAM 사용자의 AWS Access Key와 Secret Access Key로 등록해준다.

# 설정
$ aws configure

# 다중 계정 설정
$ aws configure --profile <profile name>

# 정보 저장 위치
$ cd ~/.aws
$ cat config
$ cat credentials

사용 방법은 간단하다.

$ aws s3 ls
$ aws s3 ls --configure=<profile name>

Terraform

Terraform 설치도 AWS CLI 처럼 간단하다. 단, Terraform도 여러 버전이 존재하기 때문에 버전 관리 도구인 tfenv 설치하고 Terraform을 설치해준다.

# tfenv 설치
$ brew install tfenv
$ tfenv --version

# Terraform 최신 버전 설치
$ tfenv install

# Terraform 특정 버전 설치 및 사용
$ tfenv install 1.1.9
$ tfenv use 1.1.9
$ terraform --version

다음은 사용법을 숙지해보자.

각 Resource 별로 구성하는 방법은 공식 문서를 참고하면 된다.

개인적으로는 Terraform은 5가지 명령어(init, workspace, import, plan, apply와 모듈화 방법만 기억해도 이용해 큰 무리가 없다고 생각한다. 그 외에도 count, length 등을 이용하여 다양하게 코드를 구성하여 인프라 구축이 가능하지만 일단 기본적인 것부터 익숙해져보자.

Provider

Provider는 직역하면 제공자다. 쉽게 생각하자면 인프라의 타입이라고 생각하면 된다. Provider 종류에는 대표적으로 AWS, GCP, Azure가 있다.

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

# Configure the AWS Provider
provider "aws" {
    region       = "ap-northeast-2"
    # Hard-coding credentials is not recommended
    # access_key = "XXXXXXXXXXXXXX"
    # secret_key = "XXXXXXXXXXXXXX"
    shared_credentials_file = "/Users/tf_user/.aws/creds" # Credential 파일 위치
    profile                 = "customprofile" # Credential 파일 내의 저장된 profile 중 선택
}

Terraform 13.0 이상부터는 source와 버전을 명시해주면 된다. 버전을 표현하는 방법은 하단의 항목들 처럼 여러가지가 있다.

  • = 3.14.0 : 3.14.0 버전
  • =! 3.14.0 : 3.14.0 버전 제외
  • > 3.14.0 : 3.14.0 초과 버전
  • < 3.14.0 : 3.14.0 미만 버전
  • >= 3.14.0 : 3.14.0 이상 버전
  • <= 3.14.0 : 3.14.0 이하 버전
  • ~> 3.14.0 : 3.14.0 이상 3.15.0 미만 버전

.tfstate / .lock.hcl 파일

Terraform 명령어를 수행하다 보면 여러 파일들이 생성되는 것을 볼 수 있다.

tfstate 파일의 경우에는 뒤에 state 라는 단어가 붙는걸 보았을 때, terraform으로 구성된 인프라의 현재 상태 정보가 담겨있다는 것을 유추할 수 있다.

lock 파일은 경쟁 상태에서 생길 수 있는 문제를 피하도록 도움을 준다. 개인적으로 인프라를 운영한다면 크게 신경쓸 필요는 없지만, 다른 사람과 같이 작업할 경우에는 필요한 파일이다. 즉, 동시에 같은 state를 접근하는 것을 막아 의도치 않은 변경을 방지하는데 사용하는 파일이다.

이 두 개의 파일은 보안적으로 신경을 써줘야 하기 때문에 Terraform은 이러한 상태 파일과 잠금 파일을 원격 저장소에 안전하게 저장할 수 있는 방법을 제공하고 있다. 대표적으로 AWS를 이용할 경우에는 S3에 상태 파일을, AWS DynamoDB에 lock 파일을 저장하여 관리할 수 있다.

terraform {
    backend "s3" {
      bucket         = "terraform-s3-bucket"
      key            = "terraform/own-your-path/terraform.tfstate"
      region         = "ap-northeast-2"  
      encrypt        = true
      dynamodb_table = "terraform-state-lock"
    }
}

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

resource "aws_s3_bucket" "terraform_state" {
    bucket 				= "my-tfstate"
    force_destroy 		= true

    versioning {
        enabled 		= true
    }
    
	lifecycle {
		prevent_destroy	= false
	}
}

resource "aws_dynamodb_table" "terraform_state_lock" {
    name           = "terraform-lock"
    hash_key       = "LockID"
 	read_capacity  = 2
    write_capacity = 2
    
    attribute {
        name 	   = "LockID"
        type 	   = "S"
    }
}

import & 모듈화

import와 모듈화는 아마 Terraform을 이용하면서 가장 많이 사용하는 내용이라고 생각한다. import에 관련된 내용은 공식 문서에서 각 Resource 별로 안내되어있으니 크게 걱정할 필요가 없다. 모듈화도 정말 간단하게 구현이 가능하므로 해당 부분에 대한 자세한 내용은 생략하겠다.

나 같은 경우에는 기존에 콘솔로 작업한 내용을 코드로 구성할 때 import 명령어를 많이 사용한다. resource import - show - show 결과 코드를 resource에 복붙 - plan - 코드 수정 형태로 plan의 결과가 no change가 될 때가지 반복적으로 수행하여 기존 인프라를 코드로 가져왔다.

import에 대한 가이드가 특별히 필요하다면 하단의 첨부한 사이트를 참고하면 좋다.

Terraform Style Guide

Terraform을 이용할 때 가장 고민을 하는 부분은 네이밍이다. 나와 같은 고민을 하는 사람들에게는 Best Practice를 활용하면 좋다. 만약 시간이 없다면 내가 참고한 Terraform Style Guide 레포지터리를 활용하면 좋다. 간단하게 요약해보자. 😎

  1. -가 아닌 _를 이용해라
  2. -은 사람에게 노출되는 항목들의 값에 적용해라
  3. 소문자와 숫자를 사용해라
  4. Resource 타입과 이름을 중복시키거나 동일하게 구성하지 말아라
  5. count, for_each, length를 활용해라
  6. tags을 활용해라
  7. Variables는 map, description을 활용해라
  8. Outputs는 name_type_attribute로 구성하고 description을 활용해라

이 글의 레퍼런스


Terraform 공식 문서


Terraform Style Guide


import 가이드

profile
세상을 현명하게 이끌어갈 나의 성장 일기 📓

0개의 댓글