빠른 시작: Terraform을 사용하여 Azure Virtual Network Manager에서 메시 네트워크 토폴로지 만들기
모든 가상 네트워크 연결을 프로비전하기 위해 Terraform을 사용하여 Azure Virtual Network Manager를 시작합니다.
이 빠른 시작에서는 세 개의 가상 네트워크를 배포하고 Azure Virtual Network Manager를 사용하여 메시 네트워크 토폴로지를 만듭니다. 그런 다음, 연결 구성이 적용되었는지 확인합니다. 구독 범위 또는 관리 그룹 범위가 있는 배포에서 선택할 수 있습니다. 네트워크 관리자 범위에 대해 자세히 알아봅니다.
Terraform은 클라우드 인프라의 정의, 프리뷰 및 배포를 사용합니다. Terraform을 사용하는 경우 HCL 구문를 사용하여 구성 파일을 만듭니다. HCL 구문을 사용하면 클라우드 공급자(예: Azure) 그리고 클라우드 인프라를 구성하는 요소를 지정할 수 있습니다. 구성 파일을 만든 후 배포되기 전에 인프라 변경을 미리 볼 수 있는 실행 계획를 만듭니다. 변경 내용을 확인 한 후에는 실행 계획을 적용하여 인프라를 배포합니다.
이 문서에서는 다음 방법을 설명합니다.
- random_pet을 사용하여 Azure 리소스 그룹 이름에 대한 임의 값 만들기.
- azurerm_resource_group을 사용하여 Azure 리소스 그룹 만들기.
- azurerm_virtual_network를 사용하여 가상 네트워크 배열을 만듭니다.
- azurerm_subnet을 사용하여 서브넷 배열을 만듭니다.
- azurerm_virtual_network_manager를 사용하여 가상 네트워크 관리자를 만듭니다.
- azurerm_network_manager_network_group을 사용하여 네트워크 관리자 네트워크 그룹을 만듭니다.
- azurerm_network_manager_static_member를 사용하여 네트워크 관리자 정적 멤버를 만듭니다.
- azurerm_network_manager_connectivity_configuration을 사용하여 네트워크 관리자 연결 구성을 만듭니다.
- azurerm_network_manager_deployment를 사용하여 네트워크 관리자 배포를 만듭니다.
필수 조건
- Terraform 설치 및 구성
- 동적 네트워크 그룹을 수정하려면 Azure RBAC 역할 할당을 통해서만 액세스 권한을 부여해야 합니다. 클래식 관리자/레거시 권한 부여는 지원되지 않습니다.
Terraform 코드 구현
이 코드 샘플은 구독 범위에서 Azure Virtual Network Manager를 구현합니다.
참고 항목
이 문서의 샘플 코드는 Azure Terraform GitHub 리포지토리에 있습니다. Terraform의 현재 및 이전 버전의 테스트 결과가 포함된 로그 파일을 볼 수 있습니다.
Terraform을 사용하여 Azure 리소스를 관리하는 방법을 보여 주는 추가 문서 및 샘플 코드를 참조하세요.
샘플 Terraform 코드를 테스트 및 실행할 디렉터리를 만들고 현재 디렉터리로 만듭니다.
providers.tf
라는 파일을 만들고 다음 코드를 삽입합니다.terraform { required_version = ">=1.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = ">= 3.56.0" } random = { source = "hashicorp/random" version = "~>3.0" } } } provider "azurerm" { features {} }
main.tf
라는 파일을 만들고 다음 코드를 삽입합니다.# Create the Resource Group resource "random_pet" "rg_name" { prefix = var.resource_group_name_prefix } resource "azurerm_resource_group" "rg" { location = var.resource_group_location name = random_pet.rg_name.id } # Create three virtual networks resource "random_string" "prefix" { length = 4 special = false upper = false } resource "random_pet" "virtual_network_name" { prefix = "vnet-${random_string.prefix.result}" } resource "azurerm_virtual_network" "vnet" { count = 3 name = "${random_pet.virtual_network_name.id}-0${count.index}" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location address_space = ["10.${count.index}.0.0/16"] } # Add a subnet to each virtual network resource "azurerm_subnet" "subnet_vnet" { count = 3 name = "default" virtual_network_name = azurerm_virtual_network.vnet[count.index].name resource_group_name = azurerm_resource_group.rg.name address_prefixes = ["10.${count.index}.0.0/24"] } # Create a Virtual Network Manager instance data "azurerm_subscription" "current" { } resource "azurerm_network_manager" "network_manager_instance" { name = "network-manager" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name scope_accesses = ["Connectivity"] description = "example network manager" scope { subscription_ids = [data.azurerm_subscription.current.id] } } # Create a network group resource "azurerm_network_manager_network_group" "network_group" { name = "network-group" network_manager_id = azurerm_network_manager.network_manager_instance.id } # Add three virtual networks to a network group as dynamic members with Azure Policy resource "random_pet" "network_group_policy_name" { prefix = "network-group-policy" } resource "azurerm_policy_definition" "network_group_policy" { name = "${random_pet.network_group_policy_name.id}" policy_type = "Custom" mode = "Microsoft.Network.Data" display_name = "Policy Definition for Network Group" metadata = <<METADATA { "category": "Azure Virtual Network Manager" } METADATA policy_rule = <<POLICY_RULE { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Network/virtualNetworks" }, { "allOf": [ { "field": "Name", "contains": "${random_pet.virtual_network_name.id}" } ] } ] }, "then": { "effect": "addToNetworkGroup", "details": { "networkGroupId": "${azurerm_network_manager_network_group.network_group.id}" } } } POLICY_RULE } resource "azurerm_subscription_policy_assignment" "azure_policy_assignment" { name = "${random_pet.network_group_policy_name.id}-policy-assignment" policy_definition_id = azurerm_policy_definition.network_group_policy.id subscription_id = data.azurerm_subscription.current.id } # Create a connectivity configuration resource "azurerm_network_manager_connectivity_configuration" "connectivity_config" { name = "connectivity-config" network_manager_id = azurerm_network_manager.network_manager_instance.id connectivity_topology = "Mesh" applies_to_group { group_connectivity = "None" network_group_id = azurerm_network_manager_network_group.network_group.id } } # Commit deployment resource "azurerm_network_manager_deployment" "commit_deployment" { network_manager_id = azurerm_network_manager.network_manager_instance.id location = azurerm_resource_group.rg.location scope_access = "Connectivity" configuration_ids = [azurerm_network_manager_connectivity_configuration.connectivity_config.id] }
variables.tf
라는 파일을 만들고 다음 코드를 삽입합니다.variable "resource_group_location" { type = string default = "eastus" description = "Location of the resource group." } variable "resource_group_name_prefix" { type = string description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription." default = "rg" }
outputs.tf
라는 파일을 만들고 다음 코드를 삽입합니다.output "resource_group_name" { value = azurerm_resource_group.rg.name } output "virtual_network_names" { value = azurerm_virtual_network.vnet[*].name }
Terraform 코드 구현
이 코드 샘플은 관리 그룹 범위에서 Azure Virtual Network Manager를 구현합니다.
참고 항목
이 문서의 샘플 코드는 Azure Terraform GitHub 리포지토리에 있습니다. Terraform의 현재 및 이전 버전의 테스트 결과가 포함된 로그 파일을 볼 수 있습니다.
Terraform을 사용하여 Azure 리소스를 관리하는 방법을 보여 주는 추가 문서 및 샘플 코드를 참조하세요.
샘플 Terraform 코드를 테스트 및 실행할 디렉터리를 만들고 현재 디렉터리로 만듭니다.
providers.tf
라는 파일을 만들고 다음 코드를 삽입합니다.terraform { required_version = ">=1.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 3.56.0, < 4.0" } random = { source = "hashicorp/random" version = "~>3.0" } } } provider "azurerm" { features {} }
main.tf
라는 파일을 만들고 다음 코드를 삽입합니다.# Create the Resource Group resource "random_pet" "rg_name" { prefix = var.resource_group_name_prefix } resource "azurerm_resource_group" "rg" { location = var.resource_group_location name = random_pet.rg_name.id } # Create three virtual networks resource "random_string" "prefix" { length = 4 special = false upper = false } resource "random_pet" "virtual_network_name" { prefix = "vnet-${random_string.prefix.result}" } resource "azurerm_virtual_network" "vnet" { count = 3 name = "${random_pet.virtual_network_name.id}-0${count.index}" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location address_space = ["10.${count.index}.0.0/16"] } # Add a subnet to each virtual network resource "azurerm_subnet" "subnet_vnet" { count = 3 name = "default" virtual_network_name = azurerm_virtual_network.vnet[count.index].name resource_group_name = azurerm_resource_group.rg.name address_prefixes = ["10.${count.index}.0.0/24"] } data "azurerm_subscription" "current" { } # Create a Management Group resource "random_pet" "management_group_name" { prefix = "AVNM-management-group" } resource "azurerm_management_group" "mg" { display_name = random_pet.management_group_name.id subscription_ids = [ data.azurerm_subscription.current.subscription_id, ] } data "azurerm_client_config" "this" {} resource "azurerm_role_assignment" "management_group_owner" { principal_id = coalesce(var.msi_id, data.azurerm_client_config.this.object_id) scope = azurerm_management_group.mg.id role_definition_name = "Contributor" } # register Microsoft.Network to the Management Group resource "null_resource" "register_rp_to_mg" { provisioner "local-exec" { command = "az provider register --namespace Microsoft.Network -m ${azurerm_management_group.mg.name}" } depends_on = [azurerm_role_assignment.management_group_owner] } resource "time_sleep" "wait_5_seconds" { create_duration = "5s" depends_on = [null_resource.register_rp_to_mg] } # Create a Virtual Network Manager instance resource "azurerm_network_manager" "network_manager_instance" { name = "network-manager" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name scope_accesses = ["Connectivity"] description = "example network manager" scope { management_group_ids = [azurerm_management_group.mg.id] } depends_on = [time_sleep.wait_5_seconds] } # Create a network group resource "azurerm_network_manager_network_group" "network_group" { name = "network-group" network_manager_id = azurerm_network_manager.network_manager_instance.id } # Add three virtual networks to a network group as dynamic members with Azure Policy resource "random_pet" "network_group_policy_name" { prefix = "network-group-policy" } resource "azurerm_policy_definition" "network_group_policy" { name = random_pet.network_group_policy_name.id policy_type = "Custom" mode = "Microsoft.Network.Data" display_name = "Policy Definition for Network Group" metadata = <<METADATA { "category": "Azure Virtual Network Manager" } METADATA policy_rule = <<POLICY_RULE { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Network/virtualNetworks" }, { "allOf": [ { "field": "Name", "contains": "${random_pet.virtual_network_name.id}" } ] } ] }, "then": { "effect": "addToNetworkGroup", "details": { "networkGroupId": "${azurerm_network_manager_network_group.network_group.id}" } } } POLICY_RULE } resource "azurerm_subscription_policy_assignment" "azure_policy_assignment" { name = "${random_pet.network_group_policy_name.id}-policy-assignment" policy_definition_id = azurerm_policy_definition.network_group_policy.id subscription_id = data.azurerm_subscription.current.id } # Create a connectivity configuration resource "azurerm_network_manager_connectivity_configuration" "connectivity_config" { name = "connectivity-config" network_manager_id = azurerm_network_manager.network_manager_instance.id connectivity_topology = "Mesh" applies_to_group { group_connectivity = "None" network_group_id = azurerm_network_manager_network_group.network_group.id } } # Commit deployment resource "azurerm_network_manager_deployment" "commit_deployment" { network_manager_id = azurerm_network_manager.network_manager_instance.id location = azurerm_resource_group.rg.location scope_access = "Connectivity" configuration_ids = [azurerm_network_manager_connectivity_configuration.connectivity_config.id] }
variables.tf
라는 파일을 만들고 다음 코드를 삽입합니다.variable "resource_group_location" { type = string default = "eastus" description = "Location of the resource group." } variable "resource_group_name_prefix" { type = string description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription." default = "rg" } variable "msi_id" { type = string description = "(Optional) Manage identity id that be used as authentication method. Defaults to `null`." default = null }
outputs.tf
라는 파일을 만들고 다음 코드를 삽입합니다.output "resource_group_name" { value = azurerm_resource_group.rg.name } output "virtual_network_names" { value = azurerm_virtual_network.vnet[*].name }
Terraform 초기화
terraform init를 실행하여 Terraform 배포를 초기화합니다. 이 명령은 Azure 리소스를 관리하는 데 필요한 Azure 공급자를 다운로드합니다.
terraform init -upgrade
주요 정보:
-upgrade
매개 변수는 필요한 공급자 플러그 인을 구성의 버전 제약 조건을 준수하는 최신 버전으로 업그레이드합니다.
Terraform 실행 계획 만들기
terraform plan을 실행하여 실행 계획을 만듭니다.
terraform plan -out main.tfplan
주요 정보:
terraform plan
명령은 실행 계획을 만들지만 실행하지는 않습니다. 대신 구성 파일에 지정된 구성을 만드는 데 필요한 작업을 결정합니다. 이 패턴을 사용하면 실제 리소스를 변경하기 전에 실행 계획이 예상과 일치하는지 확인할 수 있습니다.- 선택 사항인
-out
매개 변수를 사용하여 계획의 출력 파일을 지정할 수 있습니다.-out
매개 변수를 사용하면 검토한 계획이 정확하게 적용됩니다.
Terraform 실행 계획 적용
terraform apply를 실행하여 실행 계획을 클라우드 인프라에 적용합니다.
terraform apply main.tfplan
주요 정보:
- 예시
terraform apply
명령은 이전에terraform plan -out main.tfplan
를 실행했다고 가정합니다. -out
매개 변수에 다른 파일 이름을 지정한 경우terraform apply
에 대한 호출에서 동일한 파일 이름을 사용합니다.-out
매개 변수를 사용하지 않은 경우 매개 변수 없이terraform apply
를 호출합니다.
결과 확인
Azure 리소스 그룹 이름을 가져옵니다.
resource_group_name=$(terraform output -raw resource_group_name)
가상 네트워크 이름을 가져옵니다.
terraform output virtual_network_names
이전 단계에서 인쇄된 각 가상 네트워크 이름에 대해 az network manager list-effective-connectivity-config를 실행하여 유효한(적용된) 구성을 인쇄합니다.
<virtual_network_name>
자리 표시자를 vnet 이름으로 바꿉니다.az network manager list-effective-connectivity-config \ --resource-group $resource_group_name \ --vnet-name <virtual_network_name>
리소스 정리
Terraform을 통해 리소스를 만들 필요가 더 이상 없으면 다음 단계를 수행합니다.
terraform 플랜을 실행하고
destroy
플래그를 지정합니다.terraform plan -destroy -out main.destroy.tfplan
주요 정보:
terraform plan
명령은 실행 계획을 만들지만 실행하지는 않습니다. 대신 구성 파일에 지정된 구성을 만드는 데 필요한 작업을 결정합니다. 이 패턴을 사용하면 실제 리소스를 변경하기 전에 실행 계획이 예상과 일치하는지 확인할 수 있습니다.- 선택 사항인
-out
매개 변수를 사용하여 계획의 출력 파일을 지정할 수 있습니다.-out
매개 변수를 사용하면 검토한 계획이 정확하게 적용됩니다.
terraform apply를 실행하여 실행 계획을 적용합니다.
terraform apply main.destroy.tfplan
Azure의 Terraform 문제 해결
Azure에서 Terraform을 사용할 때 일반적인 문제 해결