使用適用於 Terraform 的 Azure 匯出自訂資源選取和命名

適用於 Terraform 的 Azure 匯出提供各種選項來自定義您匯出的資源。

在本文中,您將瞭解每個選項的優缺點。

  • 使用UI
  • 使用查詢模式
  • 使用對應檔案

使用使用者介面

當您以互動式模式執行適用於 Terraform 的 Azure 匯出時,指定的資源(透過您在執行時指定的參數)會顯示。 根據預設,會匯出所有資源。

Delete 可做為略過或包含資源的切換。 若要移除要導出的資源,請使用箭頭鍵來選取所需的資源,然後按 [刪除]。 資源會更新以顯示 「Skip」。

若要復原略過動作,請確認已選取略過的資源,然後按 [刪除 ]。

優點:

  • 需要使用單一切換鍵。
  • 在執行 命令之前,不需要知道您想要的資源。

缺點:

  • 如果您有許多資源可捲動並略過,動作可能會很耗時。

使用查詢模式

使用 Azure Resource Graph 查詢語法套用篩選是一種功能強大的技術,當您確切知道您需要的篩選條件。

aztfexport query [option] <ARG_where_predicate>

例如,假設您有名為 myResourceGroup 的資源群組,其中包含許多資源,包括網路資源。 如果您想要只匯出網路資源,您可以使用下列語法:

aztfexport query -n "resourceGroup =~ 'myResourceGroup' and type contains 'Microsoft.Network'"

優點:

  • 不需要手動編輯的單一命令。
  • 支援無限數量的篩選。
  • 有效率地處理大量資源。

缺點:

  • 輕鬆排除您需要導出的資源。
  • 需要瞭解 Azure Resource Graph 語法。

使用對應檔案

下列語法顯示匯出資源對應檔中定義的一組資源的基本概念:

aztfexport mapping-file [option] <resource_mapping_file>

您可以在互動式或非互動式模式中使用對應檔案:

  • 互動式模式:在資源清單檢視中以互動方式執行時按下
  • 非互動式模式:您可以藉由新增 --generate-mapping-file 旗標,在所有匯出命令 (resource、 、 resource-groupquerymapping file、 ) 中產生對應檔案。

如果您的使用案例需要匯出前修改,您可以手動建構或編輯對應檔。 以下是當您想要手動編輯自己的對應檔案時的一些範例:

使用案例 步驟
您在資源群組中有許多資源,但只需要匯出幾個資源。 從您選擇的編輯器中刪除 JSON 物件,並在匯出之前儲存盤案。
您想要以一致的方式重新命名所有資源。 resource-name 屬性變更為符合您公司合規性標準的任何名稱。
您必須依資源類型重構一組資源,例如網路或計算。 使用您的編輯器來尋找所有 Microsoft.NetworkMicrosoft.Compute 資源。

例如,假設您針對包含虛擬機的資源群組執行下列命令:

aztfexport rg --generate-mapping-file --non-interactive myResourceGroup

結果類似下列 JSON 檔案:

{
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-MyResourceGroup/extensions/OmsAgentForLinux": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-MyResourceGroup/extensions/OmsAgentForLinux",
		"resource_type": "azurerm_virtual_machine_extension",
		"resource_name": "res-0"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup",
		"resource_type": "azurerm_resource_group",
		"resource_name": "res-1"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/sshPublicKeys/vm-MyResourceGroup_key": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/sshPublicKeys/vm-MyResourceGroup_key",
		"resource_type": "azurerm_ssh_public_key",
		"resource_name": "res-2"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-MyResourceGroup": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-MyResourceGroup",
		"resource_type": "azurerm_linux_virtual_machine",
		"resource_name": "res-3"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkInterfaces/vm-myResourceGroup-vm-d146": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkInterfaces/vm-myResourceGroup-vm-d146",
		"resource_type": "azurerm_network_interface",
		"resource_name": "res-4"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkInterfaces/vm-myResourceGroup-vm-d146/networkSecurityGroups/L3N1YnNjcmlwdGlvbnMvZGJmM2I2Y2ItYzFkMC00ZDA0LTk0YjktNTE1MDliOGQzM2ZkL3Jlc291cmNlR3JvdXBzL2hhc2hpY29uZi12bS1kZW1vL3Byb3ZpZGVycy9NaWNyb3NvZnQuTmV0d29yay9uZXR3b3JrU2VjdXJpdHlHcm91cHMvdm0taGFzaGljb25mLXZtLWRlbW8tbnNn": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkInterfaces/vm-myResourceGroup-vm-d146|/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkSecurityGroups/vm-MyResourceGroup-nsg",
		"resource_type": "azurerm_network_interface_security_group_association",
		"resource_name": "res-5"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkSecurityGroups/vm-MyResourceGroup-nsg": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkSecurityGroups/vm-MyResourceGroup-nsg",
		"resource_type": "azurerm_network_security_group",
		"resource_name": "res-6"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/publicIPAddresses/vm-MyResourceGroup-ip": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/publicIPAddresses/vm-MyResourceGroup-ip",
		"resource_type": "azurerm_public_ip",
		"resource_name": "res-7"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/virtualNetworks/MyResourceGroup-vnet": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/virtualNetworks/MyResourceGroup-vnet",
		"resource_type": "azurerm_virtual_network",
		"resource_name": "res-8"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/virtualNetworks/MyResourceGroup-vnet/subnets/default": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/virtualNetworks/MyResourceGroup-vnet/subnets/default",
		"resource_type": "azurerm_subnet",
		"resource_name": "res-9"
	}
}

只有對應檔中的物件值具有意義。 密鑰(預設為 Azure resource_id)只是此模式中的識別碼。

現在,假設我們想要保留資源群組和任何計算相關資源,並修改 resource_name 值。

我們可以更新對應檔案,如下所示:

{
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup",
		"resource_type": "azurerm_resource_group",
		"resource_name": "myResourceGroup"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM",
		"resource_type": "azurerm_linux_virtual_machine",
		"resource_name": "myVM"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/sshPublicKeys/myKey": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/sshPublicKeys/myKey",
		"resource_type": "azurerm_ssh_public_key",
		"resource_name": "myKey"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-myResourceGroup/extensions/OmsAgentForLinux": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-myResourceGroup/extensions/OmsAgentForLinux",
		"resource_type": "azurerm_virtual_machine_extension",
		"resource_name": "myVMExtension"
	}
}

編輯對應檔案之後,您可以使用下列命令匯出對應檔案:

aztfexport map -n "aztfexportResourceMapping.json"

優點:

  • 由於您正在編輯檔案,因此您可以使用編輯器來尋找並取代移除或編輯所需的專案。
  • JSON 輸出可啟用唯一的功能 ,例如要篩選的腳本。
  • 可以重新命名資源以符合您的命名標準。
  • 可以將 JSON 重構成多個對應檔案。
  • 妥善處理大量的資源。

缺點:

  • 針對簡單的案例,這項技術可能會過度運作。
  • 需要手動修改。

摘要

在本文中,您已瞭解使用 Azure Export for Terraform 匯出時篩選資源的各種選項。

下一步