Terraform

GreenBean·2023년 2월 22일
0
post-thumbnail

Terraform

현직 DevOps 엔지니어, AWS Hero 가 이야기하는 Terraform 기본설명

Terraform 구성요소

  • Infrastructure as Code ( Iac ) , 코드로써의 인프라
    • 인프라를 이루는 서버 ∙ 미들웨어 그리고 서비스 등 인프라 구성요소들을 코드를 통해 구축하는 것
    • IaC 는 코드로써의 장점, 즉 작성용이성 ∙ 재사용성 ∙ 유지보수 등의 장점을 가짐

Terraform 이란?

  • 테라폼은 인프라를 만들고 변경하고 기록하는 IaC 를 위해 만들어진 도구로써 문법이 쉬워 비교적 다루기 쉽고 사용자가 매우 많아 참고할 수 있는 예제가 많음
    • .tf 형식의 파일 형식을 가짐
  • AWS ∙ Azure ∙ GCP 같은 퍼블릭 클라우드 뿐만이 아닌 다양한 서비스들 역시 지원

Terraform 기본 구성요소

  • provider
    • 테라폼으로 생성할 인프라의 종류를 의미
  • resource
    • 테라폼으로 실제로 생성할 인프라 자원을 의미
  • state
    • 테라폼을 통해 생성한 자원의 상태를 의미
  • output
    • 테라폼으로 만든 자원을 변수 형태로 state 에 저장하는 것을 의미
  • module
    • 공통적으로 활용할 수 있는 코드를 문자 그대로 모듈 형태로 정의하는 것을 의미
  • remote
    • 다른 경로의 state 를 참조하는 것을 말함
    • output 변수를 불러올 때 주로 사용

provider

  • 보통 provider.tf 로 파일을 생성
# AWS Provider
provider "aws" {
    region = "ap-northeast-2"
    version = "~> 3.0"
}
  • provider 안에서 다양한 인자들을 가짐
    • AWS resource 를 다루기 위한 파일들을 다운로드 하는 역할

resource

  • main.tfvpc.tf 등 원하는 형태로 파일 이름을 사용
# Create a VPC
resource "aws_vpc" "example" {
    cidr_block = "10.0.0.0/16"
    # cidr_block 이외에도 수많은 인자 존재
}
  • 테라폼으로 VPC 를 생성하는 코드
    • VPC 역시 다양한 인자와 다른 구성요소가 존재하지만 여기서는 간단한 형태만 소개

state

  • terraform.tfstate 라는 파일명을 가짐
    • 테라폼으로 작성한 코드를 실제로 실행하게 되면 생성되는 파일
    • 실제로는 코드가 굉장히 길어질 수 있음
{
    "version": 4,
    "terraform_version": "0.12.24",
    "serial": 3,
    "lineage": "3c77XXXX-2de4-7736-1447-038974a3c187",
    "outputs": {},
    "resorces": [
        {...},
        {...}
    ]
}
  • 테라폼 state 는 현재 인프라의 상태를 의미하는 것은 아님
    • 테라폼 명령어를 실행하게 되서 생성한 리소스들의 결과값일 뿐 인프라의 실제 상태는 아님
    • 즉, state 파일과 현재 인프라의 상태를 똑같이 유지하는게 키포인트
  • state 는 원격 저장소인 backend 에도 저장될 수 있음

output

resource "aws_vpc" "default" {
    cidr_block = "10.0.0.0/16"
    # cidr_block 이외에도 수많은 인자 존재
}

output "vpc_id" {
    value = aws_vpc.default.id
}

output "cidr_block" {
    value = aws_vpc.default.cidr_block
}

module

module "vpc" {
    source = "../_modules/vpc"
    cidr_block = "10.0.0.0/16"
}
  • module 은 한 번 만들어진 테라폼 코드로 같은 형태를 반복적으로 만들어낼 때 주로 사용
    • 재사용에 대한 강점 존재
    • module 을 어떻게 쓰느냐에 따라 테라폼을 잘 쓰냐 안 쓰냐를 판단하기도 함

remote

  • remote 는 원격 참조 개념으로 이해하면 좋음
data "terraform_remote_state" "vpc" {
    backend = "remote"
    config = {
        bucket = "terraform-s3-bucket"
        region = "ap-northeast-2"
        key = "terraform/vpc/terraform.tfstate"
    }
}
  • key 값에 명시한 state 에서 변수를 가져옴
    • state 파일에서 output 으로 저장된 변수를 가져오게 됨

Terraform 기본 명령어

  • init
    • 테라폼 명령어 사용을 위해 각종 설정을 진행
  • plan
    • 테라폼으로 작성한 코드가 실제로 어떻게 만들어질지에 대한 예측 결과를 보여줌
  • apply
    • 테라폼 코드로 실제 인프라를 생성하는 명령어
  • import
    • 이미 만들어진 자원을 테라폼 state 파일로 옮겨주는 명령어
  • state
    • 테라폼 state 를 다루는 명령어
    • 하위 명령어로 mv, push 와 같은 명령어 존재
  • destroy
    • 생성된 자원들을 state 파일 기준으로 모두 삭제하는 명령어

기본 명령어 Process

  • initplanapply
    • plan 명령어를 습관화 하기

Init

  • 작성한 코드에서 init 명령어를 입력
    • 테라폼의 다른 명령어들을 위한 설정을 진행
    • 내부적으로는 providerstate, module 설정 등이 있음

Plan

  • 실제로 작성한 테라폼 코드가 어떻게 만들어질지에 대한 예측 결과를 보여주는 명령어
    • 가장 많이 쓰이는 명령어
    • 기본적으로 plan 에 문제가 없어야 apply 에 문제가 없을 확률이 높음

Apply

  • 실제로 작성한 코드로 명령어를 생성하는 명령어
    • 실제 인프라에 영향을 끼치는 명령어이므로 주의깊게 실행을 해야 함
profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 댓글