본문 바로가기
INFRA/Operation

Terraform target이란

by BTC_Dana 2022. 12. 15.
안녕하세요! 하씨가문의 영광입니다!
벌써 12월이 되고 2022년이 끝나가네요~

다들 몸 건강 잘 챙기시길 바랍니다!!
Don't have a good day, Have a great day!

 

목차

  1. Terraform Target 이란?
  2. Terraform Target 사용법

 


Terraform Target 이란?

 

Terraform에서 Target 옵션은 특정 리소스, 모듈 또는 리소스 모음을 대상으로 지정하여 배포합니다.

예를 들어, DB와 가상머신을 테라폼 코드로 작성후 가상머신만 배포하고 싶다면 -target 옵션을 사용해 가상머신과 관련된 리소스들을 배포할 수 있습니다. 가상머신을 생성하려면 리소스 그룹, 가상 네트워크, 서브넷이 필요하겠죠?

 

https://www.hashicorp.com/blog/resource-targeting-in-terraform

 

Terraform 공식문서
https://developer.hashicorp.com/terraform/tutorials/state/resource-targeting

 


Terraform Target 사용법

 

자, 이제 어떤 역할 하는지 알았으니 사용해봅시다!

배포전 테라폼 코드를 작성합시다! 사용할 CSP는 Azure입니다

간단하게 리소스는 리소스 그룹, 가상 네트워크, 서브넷, 가상머신으로 진행하겠습니다.

 

 

< Main.tf >

resource "azurerm_resource_group" "Three_Tier_rg" {
  name     = "Three_Tier_rg"
  location = "Korea Central"
}

resource "azurerm_virtual_network" "Three_Tier_vnet" {
  name                = "Three_Tier_vnet"
  location            = azurerm_resource_group.Three_Tier_rg.location
  resource_group_name = azurerm_resource_group.Three_Tier_rg.name
  address_space       = ["10.52.6.0/24"]
  depends_on = [
    azurerm_resource_group.Three_Tier_rg
  ]
}

resource "azurerm_subnet" "Web_subnet" {
  name                 = "Web_subnet"
  resource_group_name  = azurerm_resource_group.Three_Tier_rg.name
  virtual_network_name = azurerm_virtual_network.vnet-vai-prod-koreacentral-001.name
  address_prefixes     = ["10.52.6.64/27"]
  depends_on = [
    azurerm_virtual_network.vnet-vai-prod-koreacentral-001
  ]
}

 

 

< vm.tf >

resource "azurerm_public_ip" "Web_pub" {
  name                = "Web_pub"
  resource_group_name = azurerm_resource_group.Three_Tier_rg.name
  location            = azurerm_resource_group.Three_Tier_rg.location
  allocation_method   = "Static"
}

resource "azurerm_network_interface" "Web_ni" {
  name                = "Web-nic"
  location            = azurerm_resource_group.Three_Tier_rg.location
  resource_group_name = azurerm_resource_group.Three_Tier_rg.name

  ip_configuration {
    name                          = "web_ip"
    subnet_id                     = azurerm_subnet.Web_subnet.id
    public_ip_address_id          = azurerm_public_ip.Web_pub.id
    private_ip_address_allocation = "Dynamic"
  }
}

resource "azurerm_virtual_machine" "Web_vm" {
  name                  = "Web_vm"
  location              = azurerm_resource_group.Three_Tier_rg.location
  resource_group_name   = azurerm_resource_group.Three_Tier_rg.name
  network_interface_ids = [azurerm_network_interface.Web_ni.id]
  vm_size               = "Standard_DS1_v2"

  storage_image_reference {
    publisher = "OpenLogic"
    offer     = "CentOS"
    sku       = "7.5"
    version   = "latest"
  }

  storage_os_disk {
    name              = "Web_disk"
    caching           = "ReadWrite"
    create_option     = "FromImage"
    managed_disk_type = "Standard_LRS"
  }

  os_profile {
    computer_name  = "web"
    admin_username = "dana"
    admin_password = "~1q2w3e4r5t6y"
  }

  os_profile_linux_config {
    disable_password_authentication = false
  }
}

 

 

< terraform plan -target=resource.name >

여기서 저는 terraform을 전부 타이핑하는게 휴먼에러가 날 수 있어서 alias를 통해 tf로 줄였습니다!

 

tf plan -target=azurerm_virtual_machine.Web_vm

 

가상머신에게 타겟을 줬는데 현재 6개의 리소스가 준비되어 있는 것을 확인할 수 있네요!

 

 

< terraform apply --auto-approve -target=resource.name >

plan을 했으니 이제 실제 인프라에 적용시켜보도록 해봐요!

 

tf apply --auto-approve -target=azurerm_virtual_machine.Web_vm

 

6개의 리소스가 배포되었네요? 어떤 리소스가 배포되었는지 Azure 포털을 통해 확인을 해봐요!

 

 

짜잔!! Azure 포털을 확인해보니 가상머신을 말고도 리소스그룹, 가상 네트워크, NIC, DISK가 배포되었어요!

 

 

 

 

< tf destroy --auto-approve -target=resource.name >

제거할 때도 마찬가지로 특정 리소스만 지우고 싶다면 destroy를 해봐요!

 

tf destroy --auto-approve -target=azurerm_virtual_machine.Web_vm

 

여기서! 잠깐!

가상머신을 타겟을 두고 지우면 어떻게 될까요?

plan 및 apply를 할때는 관련 리소스들이 생성되었는데 destroy를 할때는 관련된 리소스도 지워질까요?

(생각후 아래 사진을 봐요!)


 

어라? 1개만 제거가 되었네요? 어떤게 제거가 되었을까요?

 

현재 테라폼 상태를 보고 싶을 땐 state list를 통해서 확인도 가능해요!

살펴보니 가상머신만 사라진 것을 확인할 수 있어요!

 

 

포털을 통해서 확인도 해봐요! 항상 비교할 때는 크로스 체크!

포털에서도 가상머신만 지워진것을 확인할 수 있네요.

 

 

 

끝으로,
이처럼 -target를 사용하면 현재 엔지니어가 배포하고자 하는 리소스만 배포할 수 있어
편리하면서 안전한거 같아요 :)
여기서 plan과 apply는 동일하게 관련된 리소스들을 생성하는 결과를 가져오지만 destroy는 관련된 리소스들이 아닌 단독으로 지워진다는 점 유념하면 좋을 거 같아요!
오늘도 읽어주셔서 감사합니다 :)

 

댓글