본문 바로가기
INFRA/Operation

Terraform 리소스에 대한 이해 - Azure 5편

by BTC_지수 2022. 9. 15.

안녕하세요!

하씨가문의 영광입니다 

오늘은 Terraform 리소스에 대한 이해 Azure 편이 어느새 마지막편인데요!

마지막까지 한번 달려볼까요~

고고싱~!

 

VM

 

현재 Terraform Azure Documentation에 VM 배포 resources가 azurerm_linux_virtual_machine, azurerm_virtual_machine 과 azurerm_windows_virtual_machine으로 3개가 있습니다. 

 

"azurerm_virtual_machine" 리소스가 "azurerm_linux_virtual_machine" 및 "azurerm_windows_virtual_machine" 리소스로 대체되었습니다. 기존 azurerm_virtual_machine 리소스는 2.x 릴리스 내내 계속 사용할 수 있지만 호환성을 유지하기 위해 기능이 정지된 상태입니다.

대신 새로운 기능이 azurerm_linux_virtual_machine 및 azurerm_windows_virtual_machine 리소스에 추가됩니다.

 

그러므로 되도록이면 "azurerm_virtual_machine"이 아닌 "azurerm_linux_virtual_machine" 과 "azurerm_windows_virtual_machine" 사용하는게 좋습니다.

 

저는  Linux 가상 머신을 배포할 예정이기에 "azurerm_linux_virtual_machine"을 사용하도록 하겠습니다.

resource "azurerm_linux_virtual_machine" "example" {
  name                = "example-machine"
  resource_group_name = azurerm_resource_group.example.name
  location            = azurerm_resource_group.example.location
  size                = "Standard_F2"
  admin_username      = "adminuser"
  network_interface_ids = [
    azurerm_network_interface.example.id,
  ]

  admin_ssh_key {
    username   = "adminuser"
    public_key = file("~/.ssh/id_rsa.pub")
  }

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

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

vm 같은경우는 블록이 많기에 어느 블록에 어떤 인수를 사용되는지 잘 분간해서 사용하는게 좋을거 같습니다.

 

resource "azurerm_linux_virtual_machine" "example" { } 블록에는 어떤것이 사용되는지 한번 알아보도록 하겠습니다.

 

<필수>

  • name : Linux 가상 머신의 이름입니다. 이를 변경하면 새 리소스가 생성됩니다.
  • resource_group_name : Linux 가상 머신이 있어야 하는 리소스 그룹의 이름입니다. 이를 변경하면 새 리소스가 생성됩니다.
  • location : Linux 가상 머신이 있어야 하는 Azure 위치입니다. 이를 변경하면 새 리소스가 생성됩니다.
  • size : 이 가상 머신에 사용해야 하는 SKU(예 : Standard_F2)
  • admin_username : 가상 머신에 사용되는 로컬 관리자의 사용자 이름입니다. 이를 변경하면 새 리소스가 생성됩니다.
  • network_interface_ids : 이 가상 머신에 연결해야 하는 네트워크 인터페이스 ID 목록입니다. 이 목록의 첫 번째 네트워크 인터페이스 ID는 가상 머신의 기본 네트워크 인터페이스가 됩니다. 
  • os_disk : os disk { } 아래 정의된 블록입니다.

<선택사항>

  • license_type : 이 가상 머신에 대한 BYOL 유형을 지정합니다. 가능한 값은 RHEL_BYOS 및 SLES_BYOS 입니다.
  • additional_capabilities : addtitional_capabilities { } 아래에 정의된 블록입니다.
  • admin_password : 이 가상 머신의 로컬 관리자에 대해 사용해야 하는 암호입니다. 이를 변경하면 새 리소스가 생성됩니다.

admin_password 가 지정되면 disable_password_authentication 은 false로 지정되어야만 합니다. 

admin_password 또는 admin_ssh_key 중 하나를 지정해야 합니다.

 

  • admin_ssh_key : admin_ssh_key { } 아래에 정의된 블록 입니다.
  • allow_extension_operations : 이 가상 머신에서 확장 작업을 허용하는지에 대한 인수입니다.
  • availability_set_id : 가상 머신이 위치할 가용성 집합의 ID를 지정합니다. 이를 변경하면 새 리소스가 생성됩니다.
  • boot_diagnostics : boot_diagnostics { } 아래에 정의된 블록입니다.
  • capacity_reservation_group_id : 가상 머신이 할당되어야 하는 용량 예약 그룹의 ID를 지정합니다.

capacity_reservation_group_id 는 availability_set_id 또는 proximity_placement_group_id 와 함께 사용할 수 없습니다.

 

  • custom_data : 이 가상 머신에 사용해야 하는 Base64로 인코딩된 사용자 지정 데이터입니다. 이를 변경하면 새 리소스가 생성됩니다.
  • disable_password_authentication : 이 가상 머신에서 암호 인증을 비활성화해야 하는지 여부에 대한 인수입니다. 기본값은 true 이고, 이를 변경할시, 새 리소스가 생성됩니다.
  • edge_zone : 이 Linux  가상 머신이 있어야 하는 Azure 지역 내의 edge 영역을 지정합니다. 이를 변경하면 새 Linux 가상 머신이 생성됩니다.
  • encryption_at_host_enabled : 호스에서 암호화를 활성화하여 이 가상 머신에 연결된 모든 디스크(임시 디스크 포함)를 암호화해야 하는지 여부에 대한 인수입니다.
  • identity : identity { } 아래에 정의된 블록입니다.
  • platform_fault_domain : 이 Linux 가상 머신을 생성해야 하는 플랫폼 장애 도메인을 지정합니다. 기본값은 "-1", 이는 사용 가능한 장애 도메인에서 균형을 가장 잘 유지하는 장애 도메인에 자동으로 할당됨을 의미합니다. 이를 변경하면 새 Linux 가상 머신이 생성됩니다.
  • priority : 이 가상 머신의 우선 순위를 지정합니다. 가능한 값은 Regular 및 Spot 입니다. 기본값은 Regular 입니다. 이를 변경하면 새 리소스가 생성됩니다.
  • provision_vm_agent : 이 가상 머신에 Azure VM agent를 프로비저닝해야 하는지 여부에 대한 인수입니다. 기본값은 true로, 이를 변경할시, 새 리소스가 생성됩니다.

provision_vm_agent가 false로 설정되어있다면 allow_extension_operations 또한 false로 지정되어야 합니다.

 

  • secure_boot_enabled : 가상 머신에서 보안 루팅을 활성화해야 하는지 여부를 지정합니다. 이를 변경하면 새 리소스가 생성됩니다.
  • source_image_id : 이 가상 머신을 생성 하는 이미지의 ID 입니다. 이를 변경하면 새 리소스가 생성됩니다. 

       가능한 ID 유형으로는 아래와 같이 있습니다.

  • Iamge ID (s)
  • Shared Image ID (s)
  • Shared Image Version ID (s)
  • Community Gallery Image ID (s)
  • Community Gallery Image Version ID (s)
  • Shared Gallery Image ID (s)
  • Shared Gallery Image Version ID (s)
  • source_image_reference : source image_referenece { } 아래에 정의된 블록입니다. 이를 변경하면 새 리소스가 생성됩니다.

source_image_id 또는 source_image_reference 중 하나를 설정해야 합니다.

  • tags : 이 가상 머신에 할당해야 하는 태그 매핑입니다.
  • virtual_machine_scale_set_id : 이 가상 머신이 생성되어야 하는 오케스트레이션된 가상 머신 확장 집합을 지정합니다.

오케스트레이션된 가상 머신 확장 집합은 리소스를 사용하여 azurerm_orchestrated_virtual_machine_scale_set 프로비저닝할 수 있습니다.

  • zone : 이 Linux 가상 머신이 있어야 하는 가용 영역을 지정합니다. 이를 변경하면 새 Linux 가상 머신이 생성됩니다.

 


지금까지 "azurerm_linux_virtual_machine" 볼록내에 쓰이는 필수&선택사항에 대한 인수 또는 블록들을 알아보았습니다.

이제부터는 주로 쓰이는 블록내에서 쓰이는 인수들에 대해서 알아보도록 하겠습니다.

 

admin_ssh key { } 블록 인수

<필수>

  • public_key : 인증에 사용해야 하는 공개 키(2048 bit 이상 및 ssh_rsa 형식)입니다. 이를 변경하면 새 리소스가 생성됩니다.
  • username : 이 공개 SSH 키를 구성해야 하는 사용자 이름입니다.

Azure VM 에이전트는 경로(/home/{username}/.ssh/authorized_keys" )에서 SSH 키 생성만 허용합니다. 따라서 이 공개 키는 인증된 키 파일에 기록됩니다.

 

os_disk { } 블록 인수

<필수>

  • caching : 내부 OS 디스크에 사용해야 하는 캐싱 유형입니다. 가능한 값은 None, ReadOnly 및 ReadWrite 입니다.
  • storage_account_type : 이 내부 OS 디스크를 백업해야 하는 저장소 계정의 유형입니다. 가능한 값은 Standard_LRS, StandardSSD_LRS, Premium_LRS, StandardSSD_ZRS, Premium_ZRS 입니다. 이를 변경하면 새 리소스가 생성됩니다.

<선택사항>

  • disk_size_gb : 내부 OS 디스크의 크기(GB)입니다. 이 가상 머신이 제공되는 이미지에 사용된 크기와 다르게 하려는 경우 사용되는 인수입니다. 
  • name : 내부 OS 디스크에 사용할 이름입니다. 이를 변경하면 새 리소스가 생성됩니다.
  • write_accelerator_enabled : 이 OS 디스크에 대해 쓰기 가속기를 활성화할지 여부에 대한 인수입니다. 기본값은 false 입니다.

이를 위해, storage_account_type 는 Premium_LRS 로 세팅되어야하고 caching은 None으로 세팅되어야합니다.

 

source_image_reference { } 블록 인수

<선택사항>

  • publisher : 이 가상 머신을 생성하는 데 사용되는 이미지의 게시자를 지정합니다.
  • offer : 이 가상 머신을 생성하는 데 사용되는 이미지의 제공을 지정합니다.
  • sku : 이 가상 머신을 생성하는 데 사용되는 이미지의 SKU를 지정합니다.
  • version : 이 가상 머신을 생성하는 데 사용되는 이미지의 버전을 지정합니다.

 

여기까지 해서 Azure Linux VM을 배포하는데에 주로 사용되는 인수들에 대해 알아보았습니다. 이제는 VM 배포할때 쓰이는 "사용자 지정"에 쓰이는 리소스를 알아보겠습니다.

 

 

Azure VM Extension

이번에 소개할 "azurerm_virtual_machine_extension" 리소스는 배포 후 구성을 제공하고 자동화된 작업(코드)를 실행하기 위해 가상 머신 확장을 사용합니다.

 

사용자 지정 스크립트 확장을 사용하려면 Azure 가상 컴퓨터 게스트 에이전트가 가상 컴퓨터에서 실행 중이어야 합니다.

resource "azurerm_virtual_machine_extension" "example" {
  name                 = "hostname"
  virtual_machine_id   = azurerm_virtual_machine.example.id
  publisher            = "Microsoft.Azure.Extensions"
  type                 = "CustomScript"
  type_handler_version = "2.0"

  settings = <<SETTINGS
    {
        "commandToExecute": "hostname && uptime"
    }
SETTINGS


  tags = {
    environment = "Production"
  }
}

 

"azurerm_virtual_machine_extension" 블록에 사용되는 인수는 다음과 같습니다.

 

<필수>

  • name : 가상 머신 확장 peering의 이름입니다. 이를 변경하면 새 리소스가 생성됩니다.
  • virtual_machine_id : 가상 머신의 ID 입니다. 이를 변경하면 새 리소스가 생성됩니다.
  • publisher : 확장의 게시자, 사용 가능한 게시자는 Azure CLI를 사용하여 찾을 수 있습니다. 이를 변경하면 새 리소스가 생성됩니다.
  • type : 확장 유형, 게시자가 사용할 수 있는 유형은 Azure CLI를 사용하여 찾을 수 있습니다.
  • type_handler_version : 사용할 확장 버전을 지정합니다. 사용 가능한 버전은 Azure CLI를 사용하여 찾을 수 있습니다.

 

<선택사항>

  • automatic_upgrade_enabled : 게시자가 이 VM 확장의 새 버전을 출시할 때마다 확장이 자동으로 업데이트되어야 하는지 여부에 대한 인수입니다. 기본값은 false 입니다.
  • settings : 확장에 전달된 설정은 문자열에서 JSON 개체로 지정됩니다.

특정 VM 확장에서는 settings 블록의 키가 대소문자를 구분해야 합니다. 

  • protected_settings : 확장에 전달된 protected_settings는 설정과 같이 문자열에서 JSON 객체로 지정됩니다.

protected_settings 또한 특정 VM 확장에서는 블록의 키가 대소문자를 구분해야 합니다.

  • tags : 리소스에 할당할 태그 매핑입니다.

지금까지 Terraform Azure에 대한 내용을 다루어보았는데요!

IaC 도구인 Terraform이 얼마나 많은 기능을 제공하는지 다시한번 느낄 수 있었습니다.

다음에는 Terraform AWS에 대한 기능을 다루어볼텐데요 다음편도 많이 기대해주세요~~

 그럼 뿅!

댓글