terraform

[Terraform] Terraform 구성 요소 (Block)

bbiyak2da 2024. 11. 29. 11:25

Terraform 구성요소 (Block)

 

Terraform의 구성요소에는 provider, resource, variable, locals, data, output, module,  … 이 있다.

 

provider

  • Terraform으로 생성할 인프라 공급자 정의 ex) Azure, AWS, Google 
  • 일반적으로 provider.tf 파일에 정의

 

[예시]

# Configure the Azure provider
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.0.2"
    }
  }

  required_version = ">= 1.1.0"
}

provider "azurerm" {
  features {}
}

 

resource

  • Terraform으로 생성할 인프라 리소스 정의
  • 일반적으로 main.tf 파일에 정의

 

[예시]

# Create virtual network
resource "azurerm_virtual_network" "my_terraform_network" {
  name                = "myVnet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}

 

variable

  • 모듈에서 사용할 변수를 정의할 때 사용
  • 일반적으로 variables.tf 파일에 정의

[예시]

#variables.tf 파일
variable "resource_group_location" {
  type        = string
  default     = "koreacentral"
  description = "Location of the resource group."
}
#main.tf 파일
resource "azurerm_resource_group" "rg" {
  location = var.resource_group_location
  name     = "rg-krc"
}

 

이렇게 먼저 variables.tf 파일에 변수를 정의해놓고, ex. resource_group_location

main.tf 파일 등에서 변수를 사용하면 된다. ex. var.resource_group_location

 

locals

  • 현재 실행 파일에서 사용되는 지역 변수를 정의할 때 사용

[예시]

provider "azurerm" {
  features {}
}

locals {
  resource_group_name = "my-resource-group"
  location            = "East US"
  vm_name             = "myVM"
  vm_size             = "Standard_DS1_v2"
}

resource "azurerm_resource_group" "example" {
  name     = local.resource_group_name
  location = local.location
}

resource "azurerm_linux_virtual_machine" "example" {
  name                = local.vm_name
  resource_group_name = azurerm_resource_group.example.name
  location            = local.location
  size                = local.vm_size
  admin_username      = "azureuser"
  admin_password      = "P@ssw0rd1234!"  # 비밀번호는 안전하게 관리해야 함.
  
  network_interface_ids = [azurerm_network_interface.example.id]

  os_disk {
    caching       = "ReadWrite"
    create_option = "FromImage"
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "18.04-LTS"
    version   = "latest"
  }
}

 

이렇게 locals 변수를 먼저 정의하고,

밑에서 local.resource_group_name 및 local.location와 같이 사용한다.

 

data

  • 이미 생성된 리소스의 정보를 가져올 때 사용
  • Terraform이 관리하지 않는 클라우드 공급자(ex. Azure) 리소스에 대한 정보를 가져와 다른 리소스의 구성에 활용

[예시]

data "azurerm_virtual_network" "example" {
  name                = "my-vnet"
  resource_group_name = "my-resource-group"
}

output "vnet_address_space" {
  value = data.azurerm_virtual_network.example.address_space
}

 

이 예제에서 data "azurerm_virtual_network" "example" 블록은 my-resource-group 리소스 그룹 내의 my-vnet 가상 네트워크의 정보를 가져오고, output 블록은 해당 VNet의 주소 공간을 출력한다.

 

output

  • Terraform 수행 결과를 출력하는데 사용
  • output으로 정의한 값은, 외부로 노출 시켜주어 다른 모듈에서도 참조할 수 있도록 한다.

[예시]

terraform output <output_name>
output "resource_group_name" {
  value = azurerm_resource_group.rg.name
}

output "public_ip_address" {
  value = azurerm_linux_virtual_machine.my_terraform_vm.public_ip_address
}

 

module

  • Terraform 구성 파일 내 재사용 가능한 블록으로, 특정 인프라 리소스를 정의하고 관리하는데 사용 (템플릿?)
  • 기존에 작성된 모듈은 다른 모듈에서 참조하여 쓸 수 있다.
    • 모듈에서 필요한 값은 variable를 통해 선언하여 설정
    • 모듈에서 생성된 값 중 외부 모듈에서 참조하고 싶은 값은 output으로 선언하여 설정

↓ 자세한 내용 ↓

https://bbiyak-cloud.tistory.com/82