使用適用於 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-group
query
mapping file
、 ) 中產生對應檔案。
如果您的使用案例需要匯出前修改,您可以手動建構或編輯對應檔。 以下是當您想要手動編輯自己的對應檔案時的一些範例:
使用案例 | 步驟 |
---|---|
您在資源群組中有許多資源,但只需要匯出幾個資源。 | 從您選擇的編輯器中刪除 JSON 物件,並在匯出之前儲存盤案。 |
您想要以一致的方式重新命名所有資源。 | 將 resource-name 屬性變更為符合您公司合規性標準的任何名稱。 |
您必須依資源類型重構一組資源,例如網路或計算。 | 使用您的編輯器來尋找所有 Microsoft.Network 或 Microsoft.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 重構成多個對應檔案。
- 妥善處理大量的資源。
缺點:
- 針對簡單的案例,這項技術可能會過度運作。
- 需要手動修改。
使用 Terraform 匯入區塊
當與 Terraform v1.5
或更新版本一起執行v0.13
aztfexport
或更新時,--generate-import-block
命令會與檔案一起import.tf
產生對應檔案。 檔案 import.tf
包含每個資源的 aztfexport
匯入區塊都能夠對應。 從這個點開始,組態的行為與 預先存在的匯入區塊工作流程相同。 若要完成,請執行 terraform plan
。
若要從產生的匯出中刪除或篩選資源,您可以刪除包含資源識別碼和其他資訊的區塊。
比較匯入區塊和 Azure 導出
常見的問題是使用 Azure Export for Terraform 和 import 區塊之間的差異。 我們注意到的兩個工具的優點包括:
- 適用於 Terraform 的 Azure 導出有助於資源探索。 有各種方法可用來協助探索和導出您想要的資源。
- 適用於 Terraform 的 Azure 匯出也可透過手動和自動化方式提供資源篩選。
- 適用於 Terraform 的 Azure 匯出會自動產生匯入區塊及其輸出,以節省撰寫程式的時間和精力。
- Terraform 中原生支援 Terraform 匯入區塊,因此很容易使用。 結合在一起,我們相信兩者的使用都為您帶來巨大的好處。
優點:
- 原生 Terraform 支援的工作流程。 不需要 JSON。
- 由於您正在編輯檔案,因此您可以使用編輯器來尋找並取代移除或編輯所需的專案。
- 可以重新命名資源以符合您的命名標準。
- 妥善處理大量的資源。
缺點:
- 針對簡單的案例,這項技術可能會過度運作。
- 需要手動修改才能篩選。
- 不適用於舊版的 Terraform。
摘要
在本文中,您已瞭解使用 Azure Export for Terraform 匯出時篩選資源的各種選項。