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으로 선언하여 설정
↓ 자세한 내용 ↓