Seleção e nomenclatura de recursos personalizados usando a Exportação do Azure para Terraform.
A Exportação do Azure para Terraform fornece várias opções para personalizar os recursos que você exporta.
Neste artigo, você aprende os prós e contras de cada opção.
- Usando a IU
- Usando o modo de consulta
- Usando um arquivo de mapeamento
Usando a interface do usuário
Quando você executa a Exportação do Azure para 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 atua como uma alternância para ignorar ou incluir recursos. Para remover recursos da exportação, use as teclas de seta para selecionar o recurso desejado e pressione Excluir. O recurso é atualizado para exibir "Ignorar".
Para desfazer a ação de ignorar, verifique se o recurso ignorado está selecionado e pressione Excluir novamente.
Vantagens:
- Requer o uso de uma única tecla de alternância.
- Não é necessário saber os recursos que você quer antes de executar o comando.
Desvantagens:
- A ação pode levar muito tempo se você tiver muitos recursos para percorrer e ignorar.
Usando o modo de consulta
Aplicar um filtro usando a sintaxe de consulta do Azure Resource Graph é uma técnica poderosa quando você sabe exatamente quais filtros precisa.
aztfexport query [option] <ARG_where_predicate>
Por exemplo, vamos supor que você tenha um grupo de recursos chamado myResourceGroup
que tem muitos recursos, incluindo um recurso de rede. Se você quiser exportar apenas o recurso de rede, poderá usar a seguinte sintaxe:
aztfexport query -n "resourceGroup =~ 'myResourceGroup' and type contains 'Microsoft.Network'"
Vantagens:
- Comando único sem necessidade de edição manual.
- Suporta um número ilimitado de filtros.
- Lida com grande quantidade de recursos de forma eficiente.
Desvantagens:
- Fácil exclusão de recursos que você precisa exportar.
- Requer conhecimento da sintaxe do Azure Resource Graph.
Usando um arquivo de mapeamento
A seguinte sintaxe mostra os conceitos básicos 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 sinalizador--generate-mapping-file
.
Se seus casos de uso exigirem modificações de pré-exportação, você poderá construir ou editar manualmente o arquivo de mapeamento. Veja a seguir alguns exemplos de quando é recomendável editar manualmente seu próprio arquivo de mapeamento:
Caso de uso | Etapas |
---|---|
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ê quer renomear todos os seus recursos de maneira consistente. | Altere a propriedade resource-name para qualquer nome que corresponda aos 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 ou Microsoft.Compute . |
Por exemplo, vamos supor 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 (o padrão é o Azure resource_id
) é apenas um identificador nesse modo.
Agora, vamos supor que queremos manter o grupo de recursos e todos os recursos relacionados à computação e modificar o valor resource_name
.
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 usando o seguinte comando:
aztfexport map -n "aztfexportResourceMapping.json"
Vantagens:
- Como você está editando um arquivo, pode usar um editor para localizar e substituir o que 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.
Desvantagens:
- Para cenários simples, essa técnica pode ser um exagero.
- Requer modificações manuais.
Usando blocos de importação do Terraform
Ao executar 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 arquivo import.tf
inclui blocos de importação para cada um dos recursos aztfexport
que foi capaz de mapear. Deste ponto em diante, o comportamento da configuração é idêntico ao fluxo de trabalho do bloco de importação preexistente. Para finalizar, execute terraform plan
.
Para excluir ou filtrar recursos da exportação resultante, você pode excluir o bloco que contém o ID do recurso e outras informações.
Comparar blocos de importação e Exportação do Azure
Uma pergunta comum é a diferença entre usar a Exportação do Azure para Terraform e os blocos de importação. Os benefícios que notamos entre as duas ferramentas incluem:
- A Exportação do Azure para Terraform ajuda na descoberta de recursos. Há vários métodos disponíveis para ajudar a descobrir e exportar os recursos desejados.
- A Exportação do Azure para Terraform fornece filtragem de recursos, também por meios manuais e automatizados.
- A Exportação do Azure para 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 do Terraform são suportados nativamente no Terraform, o que os torna fáceis de usar. Combinados, acreditamos que o uso de ambos proporciona um enorme benefício para você.
Vantagens:
- Fluxo de trabalho com suporte nativo do Terraform. Não é necessário JSON.
- Como você está editando um arquivo, pode usar um editor para localizar e substituir o que precisa remover ou editar.
- Pode renomear recursos para corresponder aos seus padrões de nomenclatura.
- Lida bem com grandes quantidades de recursos.
Desvantagens:
- Para cenários simples, essa técnica pode ser um exagero.
- 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 a Exportação do Azure para Terraform.