본문 바로가기

♻ Terraform(테라폼)/Terraform 기본 구성

테라폼이란 무엇이고 왜 사용 하는가?

테라폼 이란 무엇인가?

인프라를 코드로 관리할 때 얻을 수 있는 이점은 다양하지만 간략하게 설명하면 코드로 자동화를 구축하여 환경의 변경 및 배포와 같은 반복되는 작업에 소요되는 시간 줄일 수 있고 인적 오류를 줄이는 등 관리 작업의 효율 높일 수 있다.

그리고 테라폼은 리소스 간 참조에 따른 생성순서나 의존관계를 알아서 파악해준다.

 

테라폼으로 코드를 작성하면 여러가지 중구난방으로 코드를 작성하게 된다.

아래 예를 보면... 여러가지 리소스를 쭉 나열식으로 작성하는 경우도 있고, module로 임포트 하여 작성하는 경우도 있다.

나도 작성하다가 생성순서를 순서대로 적어야 하는거 아닌가 생각 하였는데, 

순서를 바꿔서 작성해도 리소스는 정상적으로 생성이 되는것을 확인 했다.

그말은 테라폼에서 생성 순서를 알아서 정하여 리소스가 정상적으로 구성이 되게끔 알아서 생성을 해준다는 의미가 되겠다.

그래서 리소스간 참조에 따른 생성순서나 의존관계를 테라폼에서 알아서 정하고 생성을 자동적으로 해준다.

참 편하다.

 

아래 코드를 예시로 보면 만약 내가 직접 GUI로 AWS 콘솔에서 리소스를 생성한다면 보안그룹을 먼저 생성할지, VPC를 먼저 생성할지 EC2를 먼저생성할지 고민을 할거 같다. 하지만 테라폼에서는 일단 리소스 자원이 없으면 Default로 생성을 하고 해당 리소스가 정상적으로 돌아가도록 구성을 알아서 해준다. 만약 생성시에 명시된 리소스가 있으면, 그 리소스 값을 참조하여 구성을 진행한다.

# 리전 설정
provider "aws" {
  region = "ap-northeast-2"
}

# 보안그룹 설정
resource "aws_security_group" "instance" {
  name = "terraform-example-instance"
  ## 인바운드 설정
  ingress {
    from_port   = 8080
    to_port     = 8080
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ## 아웃바운드 설정
  egress {
    from_port        = 0
    to_port          = 0
    protocol         = "-1"
    cidr_blocks      = ["0.0.0.0/0"]
    ipv6_cidr_blocks = ["::/0"]
  }
}

# 인스턴스 생성
resource "aws_instance" "example" {
  ami                    = "ami-0ed11f3863410c386"
  instance_type          = "t2.micro"
  vpc_security_group_ids = [aws_security_group.instance.id]

  user_data = <<-EOF
		#!/bin/bash
		echo "Hello, World" > index.html
		nohup busybox httpd -f -p 8080 &
		EOF
  ## 테라폼 인스턴스 이름 및 태그 설정
  tags = {
    Name = "terraform-example"
  }
}