Azure Export for Terraform を使用したカスタマイズされたリソースの選択と名前付け
Azure Export for Terraform には、エクスポートするリソースをカスタマイズするためのさまざまなオプションが用意されています。
この記事では、各オプションの長所と短所について説明します。
- UI を使用する
- クエリ モードの使用
- マッピング ファイルの使用
ユーザー インターフェイスの使用
Azure Export for Terraform を対話型モードで実行すると、指定されたリソース (実行時に指定したパラメーター経由) が表示されます。 既定では、すべてのリソースがエクスポートされます。
削除は、リソースをスキップまたは含めるトグルとして機能します。 エクスポートからリソースを削除するには、方向キーを使用して目的のリソースを選択し、[削除] を押します。 リソースが更新され、「スキップ」と表示されます。
スキップ アクションを元に戻すには、スキップされたリソースが選択されていることを確認し、もう一度 [削除] を押します。
長所:
- 単一のトグル キーを使用する必要があります。
- コマンドを実行する前に、必要なリソースを知る必要はありません。
短所:
- スクロールしてスキップするリソースが多数ある場合、アクションには時間がかかる場合があります。
クエリ モードの使用
必要なフィルターを正確に把握している場合、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>
マッピング ファイルは、対話型モードまたは非対話型モードで使用できます。
- 対話型モード: リソース リスト ビューで対話形式で実行する場合は [s] キーを押します。
- 非対話型モード:
resource
フラグを追加することで、すべてのエクスポート コマンド (resource-group
、query
、mapping file
、--generate-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
以上と共にaztfexport
v0.13
以上を実行すると、--generate-import-block
コマンドは、import.tf
ファイルと共にマッピング ファイルを生成します。 import.tf
ファイルには、aztfexport
でマップできた各リソースのインポート ブロックが含まれています。 この時点から、構成の動作は既存のインポート ブロック ワークフローと同一になります。 終了するには、terraform plan
を実行します。
結果のエクスポートからリソースを削除またはフィルター処理するには、リソースの ID やその他の情報を含むブロックを削除します。
インポート ブロックと Azure Export を比較する
よく尋ねられる質問は、Azure Export for Terraform とインポート ブロックの用途の違いです。 2 つのツールについて認識している利点は次のとおりです。
- Azure Export for Terraform は、リソースの検出に役立ちます。 必要なリソースの検出とエクスポートに役立つさまざまな方法があります。
- Azure Export for Terraform では、手動および自動の手段によるリソース フィルター処理も可能です。
- Azure Export for Terraform では、出力と共にインポート ブロックが自動生成されるため、作成プロセスの時間と労力を節約できます。
- Terraform インポート ブロックは Terraform でネイティブにサポートされているため、簡単に使用できます。 これらを組み合わせて使用することで、大きなメリットを期待できます。
長所:
- ネイティブの Terraform 対応ワークフロー。 JSON は必要ありません。
- ファイルを編集しているため、エディターを使用して、削除または編集に必要なものを検索して置き換えることができます。
- 名前付け基準に合わせてリソースの名前を変更できます。
- 大量のリソースを適切に処理します。
短所:
- 単純なシナリオでは、この手法は過剰である可能性があります。
- フィルターを手動で変更する必要があります。
- 古いバージョンの Terraform とは連携できません。
まとめ
この記事では、Azure Export for Terraform を使用してエクスポートするときにリソースをフィルター処理するためのさまざまなオプションについて説明しました。