안녕하세요! 하씨가문의 영광입니다!
벌써 12월이 되고 2022년이 끝나가네요~
다들 몸 건강 잘 챙기시길 바랍니다!!
Don't have a good day, Have a great day!
▶ 목차
Terraform Target 이란?
Terraform에서 Target 옵션은 특정 리소스, 모듈 또는 리소스 모음을 대상으로 지정하여 배포합니다.
예를 들어, DB와 가상머신을 테라폼 코드로 작성후 가상머신만 배포하고 싶다면 -target 옵션을 사용해 가상머신과 관련된 리소스들을 배포할 수 있습니다. 가상머신을 생성하려면 리소스 그룹, 가상 네트워크, 서브넷이 필요하겠죠?
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는 관련된 리소스들이 아닌 단독으로 지워진다는 점 유념하면 좋을 거 같아요!
오늘도 읽어주셔서 감사합니다 :)
'INFRA > Operation' 카테고리의 다른 글
terraform backend 설정 - s3 (0) | 2022.12.21 |
---|---|
wsl2로 terraform VScode 환경 구축하기 (1) (0) | 2022.12.16 |
Nginx upstream에 대해 알아보자 (Nginx + Tomcat) (0) | 2022.12.02 |
terraform import 알아보기 #2 (0) | 2022.12.01 |
terraform import 알아보기 #1 (0) | 2022.11.30 |
댓글