테라폼

[테라폼] Terraform 사용 방법 알아 보기

트리스탄1234 2024. 3. 11. 05:48
728x90
반응형

 
안녕하세요 이웃님들 ^.^
좋은 아침 입니다.
 
오늘은 Terraform의 기본 문법과 구조 그리고 사용 방법에 대해서 포스팅 해보려고 합니다.
우선 위의 그림은 Terraform의 기본 흐름을 나타내고 있는데요.
 
Terraform의 단계를 명령어와 함께 설명하면 아래와 같습니다. 
  1) Terraform Init :  작성된 Code를 검토 하고 필요한 Plug in 모듈들을 다운 로드 받습니다.
  2) Terraform plan: 작성된 Code가 정상인지 검토를 하고 어떻게 변경이 되는지 표시를 해줍니다.
  3) Terraform apply: 실제로 작성된 Code를 기반으로 CSP에 Infra를 구성하는 단계 입니다. 
 
그럼 Terraform Code는 어떻게 작성이 되는지 살펴 봅시다.

 
Terraform은 위의 그림처럼 구성이 되어 있습니다. 각 부분을 Sofrware의 Block로 생각을 하면 될거 같은데요. 
모든 Block을 한 파일에 구성을 할 수도 있고, 분리를 할 수도 있습니다. 

Terraform 파일들과 SW Block을 같이 보게 되면 위의 그림과 같습니다. 각 파일의 특정은 다음과 같습니다. 
1) main.tf: 주로 생성될 자원들의 정보를 가지고 있는 파일 입니다. resource, module SW Block을 포함하고 있습니다.
  예를 보면

provider "aws" {
  region = var.my_region                 # 👈 here  ==> var.tf의 변수 명을 참조 하라는 의미
}

resource "aws_instance" "app_server" {
  ami                = var.my_ami             # 👈 here
  availability_zone  = "us-east-1a"      # 👈 here
  instance_type      = var.my_instance_type   # 👈 here

  tags = {
    Name  = "app_server_via_terraform"
    Env   = "Dev"
    Owner = "me"
  }
}

var.xxx는 vars.tf에 있는 변수를 참조 하라는 의미

2) output.tf: terraform apply가 되고 나서 결과를 출력 하거나 특정 값들을 다른 Block에서 참조 하도록 정보를 저장 합니다.

output "my_ec2_id" {
  value       = aws_instance.app_server.id
  description = "my ec2 instance's resource id"
}

terraform apply를 수행을 할때 intance id를 저장을 하라는 구문 입니다.

3) vars.tf: main.tf에서 resource나 module에 들어 가는 변수명을 선언 해주는 파일 입니다.

variable "my_region" {
    default     = null  # 👈 here
    type        = string
    description = "AWS Region"
}

variable "my_ami" {
    default = null
}

variable "my_instance_type" {
    default     = null
    description = "EC2 instance type (e.g. t3.micro)"
}

vars.tf파일은 default, type,description 으로 구성이 되는데요. 
값을 직접 넣을 수도 있고 넣지 않으면 terraform.tfvars 파일을 참조 하게 됩니다.

4) terraform.tfvars: 이 파일은vars.tf 파일에 선언된 변수의 값들을 저장을 하는 파일 입니다.
 위에서 defalut값이 모두 null이라 terraform.tfvars파일의 값이 사용이 됩니다. var.tf의 변수에 값이 있더라고 terroform.tfvars 파일안의 값이 우선 합니다. 

my_ami           = "ami-07d9b9ddc6cd8dd30"
my_instance_type = "t3.micro"
my_region = "us-east-1"

5) terraform.tfstate: 이 파일은 teraform apply 후에 생성된 infra들의 상태 정보를 가지고 있습니다. 이 파일을 근거로 해서 신규로 code를 변경하거나 추가할때 infra에 변경이 필요한지 여부를 판단 하므로 잘 보관 하여야 합니다. 보통 s3 storage에 저장을 합니다. 
 
 
그럼 문법을 한번 살펴 볼까요?

 
테라폼 문법은 위의 그림과 같이 keyword type alias 그리고 블럭 안의 key와 값들로 구성이 되는데요 
 1) 중괄호를 통해 생성할 하나의 자원을 블록 단위로 정의 합니다.
 2) 중괄호 내부에는 key-value 쌍 구조로 속성 정보 설정 가능 합니다. 
 3) 주석은 #, //, /* */ 의 3가지 형태로 작성
 
예를 통해서 살펴 볼까요?

위의 코드를 해석을 해보면. 
main tf파일에 생성할 rerouce는 aws_instance(EC2)이구요 이 instance의 코드내에서의 이름은 my_server 입니다. 
그리고 중괄호 안을 보면 instance의 ami id를 정의를 하였구요, instance type는 t2.micro로 정의가 되어 있습니다. 
 이걸 다시 정리를 해보면 아래와 같습니다. 
  1)resource : 생성할 자원을 의미하는 최상위 키워드
  2)type : 생성할 자원의 유형을 정의 e.g.) aws_instance, aws_lb, aws_security_group etc
  3) alias : 생성할 리소스를 참조하기 위한 별명으로 terraform 내부적으로만 활용되는 정보

위의그림은 provider 블럭인데요 이 블럭은 어떤 CSP를 사용할지 어떤 Region에 인프라를 구성할 것 인지를 정의합니다. 
main.tf 파일안에 정의를 해도 되고, 별도의 파일로 provider.tf로 생성을 해도 됩니다. 

다음은 output 블럭인데요. 이 블럭은 terraform apply로 infra를 구축을 하고 나서 생성된 값들 중 별도의 용도로 저장을 해야 하는 값들을 정의 합니다. 인프라가 다 생성 되고 나서 terraform output이라는 명령으로 참조를 할수도 있구요. 해당 변수의 값을 다른 블럭에 전달을 할수도 있습니다. 
 
위의 그림은 생성된 instance id를 출력 해주는 구문 입니다.

 다음으로 terraform 블럭이 있는데요 이 블럭은 아래와 같습니다. 
 1) required version: 사용할 terraform 버전을 정의
 2) backend: terraform.tfstate(생성된 인프라 상태) 파일을 어디에 저장을 할것인지를 정의 합니다.
 3) required providers : terraform code로 프로비젼할 provider와 version을 설정 합니다. 

data 블럭도 있는데요. 이 블럭은 CSP에 사전 정의된 리소스 정보를 쿼리할때 사용을 합니다. 
위의 구문은 AWS의 사용 가능한 AZ정보를 쿼리 하는 구문 입니다. 

다음으로 module 블럭이 있는데요. 이 모듈은 여러가지 resouce를 하나의 module로 묶어서 필요할 때마다 한꺼번에 reouirce를 생성 및 삭제등의 작업 편리하게 해주는 블럭 입니다.

provider "aws" {
  region = var.aws_region
}

module "vpc" {
  source          = "./vpc_module"
  resource_prefix = var.resource_prefix
}

모듈 사용의 예제 코드를 보면 위와 같이 최상의 main.tf 파일에 resource라는 keuword대신 module이라는 keyword를 쓰고 source라는 변수에 모듈명 "./vpc_mpdule"라고 정의를 하면 최상의 디렉토리 밑에 vpc_module 폴더 안에 있는 파일들(main.tf, vars.tf등)을 참조 하여 필요한 자원을 생성해 주게 됩니다. 즉 main.tf에서는 모듈 위치만 지정을 해주면 되는 것이죠.. 
 
 
 

728x90
반응형

'테라폼' 카테고리의 다른 글

[테라폼] Module사용하여 코드 작성 하기  (58) 2024.03.12
[테라폼] Terraform 환경 구축 하기  (54) 2024.03.10