DevOps/Terraform

Day 3 - 백엔드 설정 및 리소스 작업 디렉토리 분리

southouse 2022. 8. 23. 10:58
728x90

Terraform Backend

사용하는 이유

  • 협업 시에 리소스가 겹치거나 꼬이지 않게 Locking 하는 기능을 제공
  • 로컬에 .tfstate 파일을 저장하여 관리하는 것보다 원격 저장소에 관리하는게 보안/관리적 측면에서 더 효과적임
  • 생성된 리소스 자원(실제 상태)의 정보를 받아와 사용할 수 있음

코드로 보는 예제

  • 기존 방식대로, 리소스를 개별 생성하고 output을 사용하지 않으면 생성된 리소스 자원을 하드 코딩하여 사용해야 함

기존 방식

resource "aws_instance" "example" {
  ami = data.aws_ami.amazon_linux_2.image_id
  instance_type = "t2.micro"

  availability_zone = "ap-northeast-2a"
  associate_public_ip_address = true

  subnet_id = "subnet-0ac6117143d6d85a7" # 하드 코딩되어 있는 Subnet ID
  vpc_security_group_ids = [ 
    "sg-08407e6e72976f46b"
  ]
}

Output을 사용하여 생성된 리소스 자원을 가져오는 방식

# 백엔드에 있는 VPC 현재 상태에 대한 정보(.tfstate)를 받아옴
data "terraform_remote_state" "vpc" {
    backend = "s3"

    config = {
        bucket = "southouse-tfstate"
        key = "dev/services/vpc/terraform.tfstate"
        region = "${var.region}"
    }
}

# 원격 저장소에서 가져오는 현재 생성되어 있는 Subnet ID
locals {
  vpc_id = "${data.terraform_remote_state.vpc.outputs.vpc_id}"
  private_subnets = "${data.terraform_remote_state.vpc.outputs.private_subnets}"
  public_subnets = "${data.terraform_remote_state.vpc.outputs.public_subnets}" 
}

resource "aws_instance" "example" {
  ami = data.aws_ami.amazon_linux_2.image_id
  instance_type = "t2.micro"

  availability_zone = "ap-northeast-2a"
  associate_public_ip_address = true

  subnet_id = "${local.public_subnets[0]}" 
  vpc_security_group_ids = [ 
    "sg-08407e6e72976f46b"
  ]
}

코드 내용

리소스 별로 작업 디렉토리 분리

  • 가독성을 위해 사용하는 리소스에 따라 디렉토리를 분리
  • 외부 작업 디렉토리에서 리소스를 참조하기 위해 필요한 output을 정의

local과 variable의 차이

variable

  • default로 기본 값을 설정할 수 있음
  • description으로 설명을 포함할 수 있음
  • 명령어 인자나 파일로 사용자의 입력을 받을 수 있음

local

  • 현재 실행 파일에서 사용되는 지역 변수의 개념
  • terraform 함수와 같이 사용할 수 있음

백엔드 설정

  • s3, consul 등 다양한 백엔드 타입을 지정할 수 있음
  • 설정 후 terraform init 명령이 선행되어야 함
  • 각 리소스의 .tfstate 파일이 저장될 경로를 지정
  • 원격 백엔드에 지정된 데이터를 불러올 땐 data 스코프를 사용

 

 

 

300x250