[Terraform] Basic

pingping·2021년 2월 7일
0
  • 개인 공부 및 정리용입니다.

Terraform Basic

Overview

  • Terreform은 인프라 전체를 안전하게 배포, 변경, 버전 관리 등을 해주는 대표적인 IaC 도구이며 그와 비슷한 도구로는 AWS 서비스 중 하나인 CloudFormation 등이 있다.
  • 멱등성 보장
# terraform을 초기화 해주고 상태 파일 생성 등 현재 상태관리를 폴더 단위로 해준다.
terraform init

# 테라폼이 클라우드 환경에 배포되기 전 미리 한번 작동시켜서 정상적으로 배포가 가능한지 체크한다.
terraform plan

# 실제 배포를 수행한다.
terraform apply

Extension

  • HashiCorp Terraform
  • Terraform
  • Terraform autocompletion

개념

  • Provider

    테라폼과 외부 서비스를 연결해주는 기능을 하는 모듈

    리소스들이 배포될 환경을 정의한 것

    Terraform Provider

  • Backends

    상태 정보를 tfstate 파일을 통해 관리를 하는데 배포하고 실행된 상태를 저장하는 곳

    local backends가 default임

    AWS S3 등 외부 저장공간에서 버전관리와 상태정보를 관리하기를 권장

  • Resources

    프로바이더가 제공해주는 조작 가능한 대상의 최소 단위

    ex) aws_security_group, aws_lb, aws_instance

  • module

    공통적으로 활용할 수 있는 인프라 코드를 한 곳으로 모아서 정의하는 부분

    Module을 사용하면 변수만 바꿔서 동일한 리소스를 손쉽게 사용할 수 있다는 장점이 있다.

  • Input Variables

    변수들을 설정해서 담을 수 있다. 해당 변수들을 사전에 정의해 둘수도 있고, apply를 하면서 파일 단위로 참조할 수도 있다.

  • Data Sources

    Data 파일들을 정의하여 Terraform 설정에서 참조할 수 있다. Block을 비워두면 해당 데이터 내의 모든 값들을 참조할 수 있다.

  • Output Values

    Output Values를 선언하면 apply 후 output으로 알려준다.

// provider을 정의한다.
provider "aws" {
    access_key = MY_ACCESS_KEY
    secret_key = MY_SECRET_KEY
    region = "ap-northeast-2"
}

// S3를 backend로 정의한다.
terraform {
    backend "s3" {
        bucket          = MY_S3_BUCKET_NAME
        dynamodb_table  = MY_DYNAMODB_TABLE
        region          = "ap-northeast-2"
        key             = "test-terraform/terraform.tfstate"
        encrypt         = true
    }
}

// Resource
resource "aws_vpc" "demo" {
    cidr_block  = "10.0.0.0/16"

    tags = map(
        "Name", "terraform-eks-demo-node"
        "kubernetes.io/cluster/$(var.cluster-name)", "shared"
    )
}

// Variables를 설정해서 담을 수 있다.
variable "cluster-name" {
    default = "terraform-eks-demo"
    type    = string
}

// Using these data sources allows the configutation to be
// generic for any region
data "aws_region" "current" {}

// Output Values : apply 후 output으로 알려준다.
output "instance_ip_addr" {
    value       = aws_instance.server.private_ip
    description = "The private IP address of the main server instance."
}

아키텍처

init

  • Terraform 구성 파일이 포함된 작업 디렉터리를 초기화한다.
  • backend 초기화, terraform state file용 스토리지
  • module 설치, Local 경로로 terraform registry로부터 다운로드된다.
  • 여러번 실행하는 것은 안전하다.

validate

  • 형식 및 정확성에 대해 문법적으로 유효성을 검사한다.
  • Terraform file들의 문법에 대한 유효성 검사하는데 사용된다.

plan

  • 실행 계획을 세운다.
  • 각 정점을 통과하고 병렬 처리를 사용하여 각 공급자를 요청한다.
  • 마지막 상태와 현재 상태의 차이를 계산하고 이 차이를 plan 작업의 출력으로 터미널에서 사용자에게 표시한다.
  • *.tf 디렉터리의 모든 파일을 스캔하고 계획을 만든다.
  • 각 리소스에 대해 새로고침을 수행하고 Provider API를 호출할 때 속도 제한 문제가 발생할 수 있다.

apply

  • 원하는 상태에 도달하기 위해 변경 사항을 적용한다.
  • 리소스가 성공적으로 수행되었지만 프로비저닝 중에 실패하는 경우
    • Terraform은 오류를 발생시키고 리소스를 "tainted"라고 표시한다.
    • 오염된 리소스는 물리적으로 생성되었지만 프로비저닝이 실패했기 때문에 사용하기에 안전한 것으로 간주할 수 없다.

refresh

  • Terraform이 알고있는 상태를 실제 인프라와 조정하는 데 사용된다.
  • 인프라를 수정하지 않지만 상태 파일을 수정한다.

destroy

  • 인프라와 모든 자원을 파괴한다.
  • 상태와 인프라를 모두 수정한다.

import

  • Terraform에서 관리하지 않는 기존 외부 리소스를 Terraform 상태로 가져와서 해당 리소스를 관리할 수 있도록 한다.

taint

  • Terraform이 관리하는 리소스를 오염된 것으로 표시하여 다음에 적용할 때 삭제하고 다시 만들도록 한다.
  • 인프라를 수정하지는 않지만 상태 파일을 수정하는데 이는 리소스를 오염 된 것으로 표시하기 위해서이다. 다음 적용에서 인프라 및 상태가 변경된다.

모듈

  • Code 재사용 가능
  • 호환성 유지를 위한 버전 관리를 지원
  • 원격으로 코드 저장
  • 쉬운 테스팅이 가능
  • 하나의 설정 블록 아래에서 모든 개별 리소스로 캡슐화 가능
  • 로컬 및 원격 모듈 지원
    • 로컬 모듈은 source경로 또는 ../ 경로와 함께 Terraform Configuration에 저장된다.
    • 원격 모듈은 별도의 저장소에 외부적으로 저장되며 버전 관리를 지원한다.
  • 다음 Backend들을 지원한다.
    • Local Paths
    • Terraform Registry
    • GitHub
    • BitBucket
    • HTTP URLs
    • S3 Buckets
    • GCS Buckets
profile
Cloud Infra Engineer & interested in python, IaC, k8s

0개의 댓글