본문 바로가기

클라우드/테라폼(Terraform)

테라폼 Terraform 구성 파일 작성 , 배포

# Terraform 구성 파일

Terraform 으로 인프라를 정의하는데 사용하는 파일을 Terraform 구성 파일이라고 한다.

 

# 파일 확장자

Terraform 구성 파일은 .tf 또는 JSON 기반의 Terraform 구성 파일인 .tf.json을 사용한다.

 

# 텍스트 인코딩

구성파일은 UTF8 인코딩을 사용하며 Unix 스타일의 줄바꿈인 LF를 사용한다. 그러나 windows 스타일의 줄바꿈인 CRLF도 허용한다. 오픈소스ㄹ 작업 할 때 줄바꿈을 LF로 바꿔주는것을 권장한다. 대부분의 오픈소스, 컨테이너 기반은 Unix 위주여서 CRLF가 오류가나는 경우가 있다.

 

# 디렉토리

Terraform은 현재 디렉토리에 있는 모든 .tf 파일을 읽는다.

 


 

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance

 

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance

 

registry.terraform.io

 

# 구성 파일의 블록 정의

Ansible의 task와 비슷하다. 프로바이더 요구사항이나 리소스들은 하나의 블록(block)을 정의한다.

 

블록 정의 형식:

<BLOCK_TYPE> "<BLOCK_LABEL>" ... {

  <ARGUMENT>

}

 

BLOCK_TYPE : 여러 블록 형식이 있지만 일반적으로 리소스 형식을 정의한다.

BLOCK_LABEL : 블록 형식에 따라 블록 레이블이 있다.

ARGUMENT : 블록의 구성 정보를 정의한다.

 

 

 

# 리소스

프로바이더에 의해 구현된 리소스를 정의한다.

 

리소스 블록 정의 형식:

resource "<RESOURCE_TYPE>" "<NAME>" {

  <IDENTIFIER> = <EXPRESSION> #ARGUMENT

}

 

RESOURCE_TYPE : 리소스의 유형을 정의한다.

NAME : 리소스의 이름을 정의한다.

ARGUMENT : 리소스의 인자를 정의한다. 리소스의 유형에 따라 필수(Require) 인자는 반드시 설정해야 한다.

 

 


# 구성 파일 작성

 

# 디렉토리 생성

 

# 구성파일 작성 

provider 요구사항

- aws : provider 이름

- source : provider 소스 주소

- version : 버전이 3.34 이상이어야 한다

 

provider 정의

- "aws" : 어디에 배포할것인지? (AWS, GCP ...), 반드시 정의해야한다.

- profile : 인증하기위한 AWS 자격증명 프로파일 (~/.aws/credentials에 정의되어있는 default 프로파일로 access, secret key를 가지고 인증 ) -> git에 올리지 않도록 주의,

- region: 인프라 공급자의 관리 리전 (이미지가 서울 리전에 있는 이미지이기 떄문에 서울 리전으로 설정 해야한다)

 

resource 정의

- Ansible의 모듈과 같은것, 인스턴스를 만드는 모듈,vcp를 만드는모듈, 라우팅 테이블을 만드는 모듈 등

- "aws_instance"  : AWS 프로바이더의 EC2 인스턴스를 관리하는 리소스의 유형

- "my_instance" : 리소스 이름  ( 관리목적상 Terraform에서의 이름)

- ami : EC2 AMI 이미지 ID

- instance_type : EC2 인스턴스 형식

 


 

# 배포

# 초기화

terraform init을 하게되면 .terraform 디렉토리가 생성되고 프로바이더 플러그인 파일이 다운받아진다.리소스를 생성하기 위한 플러그인을 만든다. 플러그인이 있어야만 aws를 제어 할 수 있다. 

git push할 때 .terraform 디렉토리, .terraform.lock.hcl 파일이 push되지 않게 조심해야 한다.

.terraform 디렉토리, .terraform.lock.hcl 파일을 지우면 다시 init 해야한다.

 

 

# 스타일 규칙

terraform fmt 명령어는 .tf 파일을 포맷팅 해준다.

Terraform 구성파일의 문법 및 스타일엔 각 중첩 레벨에 대해 두개의 공백을 가진다, 여러 속성이 동일 레벨에 있는 경우 등호를 정렬한다, 블록을 구분 할 때 빈 줄 하나를 삽입한다 등의 규칙이 있다. 규칙을 따라서 작성을 하지 않더라도 terraform fmt 명령어를 사용하면 규칙대로 자동 설정 된다.

 

 

# 유효성 검사

 

# 변경 사항 계획

+ 생성  - 제거  ~ 변경

known after apply 배포 이후에 알 수 있다.

 

 

# 변경 사항 적용

yes 배포

 

 

# 상태 확인

terraform.tfstate 파일확인

 

 

# AWS 콘솔에서 확인

IaC도구를 이용하여 배포한것은 수정,변경,삭제도 가능하면 해당되는 IaC도구로 해야한다.

 

더보기

devops@control:~$ terraform version
Terraform v1.0.4
on linux_amd64

 

 

devops@control:~$ terraform -install-autocomplete

 

 


devops@control:~/aws-example$ vi main.tf
devops@control:~/aws-example$ cat main.tf 
terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
      version = "~> 3.34"
    }
  }
}

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

resource "aws_instance" "my_instance" {
  ami = "ami-05f375b54be4ab849"
  instance_type = "t3.micro"

  tags = {
    Name = "MyInstance"
  }
}



devops@control:~/aws-example$ terraform init

Initializing the backend...

 

devops@control:~/aws-example$ terraform fmt
main.tf
devops@control:~/aws-example$ cat main.tf 
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.34"
    }
  }
}

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

resource "aws_instance" "my_instance" {
  ami           = "ami-05f375b54be4ab849"
  instance_type = "t3.micro"

  tags = {
    Name = "MyInstance"
  }
}



devops@control:~/aws-example$ terraform validate
Success! The configuration is valid.

devops@control:~/aws-example$ terraform plan

 

devops@control:~/aws-example$ terraform apply

devops@control:~/aws-example$ terraform show