테라폼 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
# 구성 파일의 블록 정의
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