Seleção e nomeação de recursos personalizados usando a Exportação do Azure para Terraform
O Azure Export for Terraform fornece várias opções para personalizar quais recursos você exporta.
Neste artigo, você aprende prós e contras para cada opção.
- Usando a interface do usuário
- Usando o Modo de Consulta
- Usando um arquivo de mapeamento
Usando a interface do usuário
Quando você executa o Azure Export for Terraform no modo interativo, os recursos especificados (por meio dos parâmetros especificados durante a execução) são exibidos. Por padrão, todos os recursos são exportados.
A opção Excluir funciona como uma alternância para ignorar ou incluir recursos. Para remover recursos de serem exportados, use as teclas de seta para selecionar o recurso desejado e pressione Delete. O recurso é atualizado para exibir "Ignorar".
Para desfazer a ação de ignorar, verifique se o recurso ignorado está selecionado e pressione Delete novamente.
Prós:
- Requer o uso de uma única tecla de alternância.
- Não precisa saber os recursos desejados antes de executar o comando.
Contras:
- A ação pode ser demorada se você tiver muitos recursos para percorrer e ignorar.
Usando o modo de consulta
A aplicação de um filtro usando a sintaxe de consulta do Gráfico de Recursos do Azure é uma técnica poderosa quando você sabe exatamente quais filtros precisa.
aztfexport query [option] <ARG_where_predicate>
Como exemplo, digamos que você tenha um grupo de recursos nomeado myResourceGroup
que tenha muitos recursos, incluindo um recurso de rede. Se quiser exportar apenas o recurso de rede, você pode usar a seguinte sintaxe:
aztfexport query -n "resourceGroup =~ 'myResourceGroup' and type contains 'Microsoft.Network'"
Prós:
- Comando único sem necessidade de edição manual.
- Suporta um número ilimitado de filtros.
- Lida com uma grande quantidade de recursos de forma eficiente.
Contras:
- Fácil de excluir recursos que você precisa exportar.
- Requer conhecimento da sintaxe do Azure Resource Graph.
Usando um arquivo de mapeamento
A sintaxe a seguir mostra as noções básicas para exportar um conjunto de recursos definido em um arquivo de mapeamento de recursos:
aztfexport mapping-file [option] <resource_mapping_file>
Você pode usar um arquivo de mapeamento nos modos interativo ou não interativo:
- Modo interativo: pressione s ao executar interativamente no modo de exibição de lista de recursos.
- Modo não interativo: Você pode gerar o arquivo de mapeamento em todos os comandos de exportação (
resource
,resource-group
,query
,mapping file
) adicionando o--generate-mapping-file
sinalizador.
Se seus casos de uso exigirem modificações de pré-exportação, você poderá construir ou editar manualmente o arquivo de mapeamento. Aqui estão alguns exemplos de quando você gostaria de editar manualmente seu próprio arquivo de mapeamento:
Caso de utilização | Passos |
---|---|
Você tem muitos recursos em um grupo de recursos, mas só precisa exportar alguns selecionados. | Exclua os objetos JSON do editor de sua escolha e salve o arquivo antes de exportar. |
Você deseja renomear todos os seus recursos de maneira consistente. | Altere a propriedade para qualquer nome que corresponda aos resource-name padrões de conformidade da sua empresa. |
Você precisa refatorar um conjunto de recursos por seu tipo de recurso - como rede ou computação. | Use seu editor para encontrar todos os Microsoft.Network recursos Microsoft.Compute . |
Por exemplo, digamos que você execute o seguinte comando para um grupo de recursos que contém uma máquina virtual:
aztfexport rg --generate-mapping-file --non-interactive myResourceGroup
Os resultados são semelhantes ao seguinte arquivo 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"
}
}
Somente o valor do objeto no arquivo de mapeamento tem significância. A chave (padrão para o Azure resource_id
) é apenas um identificador neste modo.
Agora, digamos que queremos manter o grupo de recursos e quaisquer recursos relacionados à computação e modificar o resource_name
valor.
Poderíamos atualizar o arquivo de mapeamento da seguinte maneira:
{
"/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"
}
}
Depois de editar o arquivo de mapeamento, exporte o arquivo de mapeamento usando o seguinte comando:
aztfexport map -n "aztfexportResourceMapping.json"
Prós:
- Como você está editando um arquivo, você pode usar um editor para encontrar e substituir o que você precisa remover ou editar.
- A saída JSON permite funcionalidades exclusivas - como scripts para filtrar.
- Pode renomear recursos para corresponder aos seus padrões de nomenclatura.
- Pode refatorar JSON em vários arquivos de mapeamento.
- Lida bem com grandes quantidades de recursos.
Contras:
- Para cenários simples, essa técnica pode ser exagerada.
- Requer modificações manuais.
Usando blocos de importação Terraform
Quando executado aztfexport
v0.13
ou superior ao lado do Terraform v1.5
ou superior, o --generate-import-block
comando gera um arquivo de mapeamento ao lado de um import.tf
arquivo. O import.tf
arquivo inclui blocos de importação para cada um dos recursos aztfexport
que foi capaz de mapear. A partir deste ponto, o comportamento da configuração é idêntico ao fluxo de trabalho de bloco de importação preexistente. Para terminar, execute terraform plan
.
Para excluir ou filtrar recursos da exportação resultante, você pode excluir o bloco que contém a ID do recurso e outras informações.
Comparar blocos de importação e a Exportação do Azure
Uma pergunta comum é a diferença entre usar o Azure Export for Terraform e importar blocos. Os benefícios entre as duas ferramentas que notamos incluem:
- O Azure Export for Terraform ajuda na descoberta de recursos. Há vários métodos disponíveis para ajudar a descobrir e exportar os recursos desejados.
- O Azure Export for Terraform fornece filtragem de recursos, também através de meios manuais e automatizados.
- O Azure Export for Terraform gera automaticamente blocos de importação com suas saídas, economizando tempo e esforço no processo de criação.
- Os blocos de importação Terraform são suportados nativamente no Terraform, o que os torna fáceis de usar. Combinados, acreditamos que o uso de ambos proporciona enormes benefícios para você.
Prós:
- Fluxo de trabalho nativo suportado pelo Terraform. Não é necessário JSON.
- Como você está editando um arquivo, você pode usar um editor para encontrar e substituir o que você precisa remover ou editar.
- Pode renomear recursos para corresponder aos seus padrões de nomenclatura.
- Lida bem com grandes quantidades de recursos.
Contras:
- Para cenários simples, essa técnica pode ser exagerada.
- Requer modificações manuais para filtrar.
- Não funciona com versões mais antigas do Terraform.
Resumo
Neste artigo, você aprendeu sobre as várias opções para filtrar recursos ao exportar com o Azure Export for Terraform.