Expandir recursos com fornecedores de recursos personalizados

Neste tutorial, vai implementar um fornecedor de recursos personalizado no Azure que expande a API de Resource Manager do Azure com o tipo de recurso Microsoft.CustomProviders/associations. O tutorial mostra como expandir os recursos existentes que estão fora do grupo de recursos onde está localizada a instância do fornecedor de recursos personalizado. Neste tutorial, o fornecedor de recursos personalizado é alimentado por uma aplicação lógica do Azure, mas pode utilizar qualquer ponto final de API público.

Pré-requisitos

Para concluir este tutorial, certifique-se de que revê o seguinte:

Introdução à integração de recursos

Neste tutorial, existem duas partes que precisam de ser implementadas: o fornecedor de recursos personalizado e a associação. Para facilitar o processo, pode utilizar opcionalmente um único modelo que implemente ambos.

O modelo utilizará estes recursos:

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "location": {
            "type": "string",
            "allowedValues": [
                "australiaeast",
                "eastus",
                "westeurope"
            ],
            "metadata": {
                "description": "Location for the resources."
            }
        },
        "logicAppName": {
            "type": "string",
            "defaultValue": "[uniqueString(resourceGroup().id)]",
            "metadata": {
                "description": "Name of the logic app to be created."
            }
        },
        "customResourceProviderName": {
            "type": "string",
            "defaultValue": "[uniqueString(resourceGroup().id)]",
            "metadata": {
                "description": "Name of the custom resource provider to be created."
            }
        },
        "customResourceProviderId": {
            "type": "string",
            "defaultValue": "",
            "metadata": {
                "description": "The resource ID of an existing custom resource provider. Provide this to skip deployment of new logic app and custom resource provider."
            }
        },
        "associationName": {
            "type": "string",
            "defaultValue": "myAssociationResource",
            "metadata": {
                "description": "Name of the custom resource that is being created."
            }
        }
    },
    "resources": [
        {
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2021-04-01",
            "condition": "[empty(parameters('customResourceProviderId'))]",
            "name": "customProviderInfrastructureTemplate",
            "properties": {
                "mode": "Incremental",
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "parameters": {
                        "logicAppName": {
                            "type": "string",
                            "defaultValue": "[parameters('logicAppName')]"
                        }
                    },
                    "resources": [
                        {
                            "type": "Microsoft.Logic/workflows",
                            "apiVersion": "2019-05-01",
                            "name": "[parameters('logicAppName')]",
                            "location": "[parameters('location')]",
                            "properties": {
                                "state": "Enabled",
                                "definition": {
                                    "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
                                    "actions": {
                                        "Switch": {
                                            "cases": {
                                                "Case": {
                                                    "actions": {
                                                        "CreateCustomResource": {
                                                            "inputs": {
                                                                "body": {
                                                                    "properties": "@addProperty(triggerBody().Body['properties'], 'myDynamicProperty', 'myDynamicValue')"
                                                                },
                                                                "statusCode": 200
                                                            },
                                                            "kind": "Http",
                                                            "type": "Response"
                                                        }
                                                    },
                                                    "case": "CREATE"
                                                }
                                            },
                                            "default": {
                                                "actions": {
                                                    "DefaultHttpResponse": {
                                                        "inputs": {
                                                            "statusCode": 200
                                                        },
                                                        "kind": "Http",
                                                        "type": "Response"
                                                    }
                                                }
                                            },
                                            "expression": "@triggerBody().operationType",
                                            "type": "Switch"
                                        }
                                    },
                                    "contentVersion": "1.0.0.0",
                                    "outputs": {},
                                    "parameters": {},
                                    "triggers": {
                                        "CustomProviderWebhook": {
                                            "inputs": {
                                                "schema": {}
                                            },
                                            "kind": "Http",
                                            "type": "Request"
                                        }
                                    }
                                }
                            }
                        },
                        {
                            "type": "Microsoft.CustomProviders/resourceProviders",
                            "apiVersion": "2018-09-01-preview",
                            "name": "[parameters('customResourceProviderName')]",
                            "location": "[parameters('location')]",
                            "properties": {
                                "resourceTypes": [
                                    {
                                        "name": "associations",
                                        "mode": "Secure",
                                        "routingType": "Webhook,Cache,Extension",
                                        "endpoint": "[[listCallbackURL(concat(resourceId('Microsoft.Logic/workflows', parameters('logicAppName')), '/triggers/CustomProviderWebhook'), '2019-05-01').value]"
                                    }
                                ]
                            }
                        }
                    ],
                    "outputs": {
                        "customProviderResourceId": {
                            "type": "string",
                            "value": "[resourceId('Microsoft.CustomProviders/resourceProviders', parameters('customResourceProviderName'))]"
                        }
                    }
                }
            }
        },
        {
            "type": "Microsoft.CustomProviders/associations",
            "apiVersion": "2018-09-01-preview",
            "name": "[parameters('associationName')]",
            "location": "global",
            "properties": {
                "targetResourceId": "[if(empty(parameters('customResourceProviderId')), reference('customProviderInfrastructureTemplate').outputs.customProviderResourceId.value, parameters('customResourceProviderId'))]",
                "myCustomInputProperty": "myCustomInputValue",
                "myCustomInputObject": {
                    "Property1": "Value1"
                }
            }
        }
    ],
    "outputs": {
        "associationResource": {
            "type": "object",
            "value": "[reference(parameters('associationName'), '2018-09-01-preview', 'Full')]"
        }
    }
}

Implementar a infraestrutura do fornecedor de recursos personalizado

A primeira parte do modelo implementa a infraestrutura do fornecedor de recursos personalizado. Esta infraestrutura define o efeito do recurso de associações. Se não estiver familiarizado com fornecedores de recursos personalizados, veja Descrição Geral dos Fornecedores de Recursos Personalizados do Azure.

Vamos implementar a infraestrutura do fornecedor de recursos personalizado. Copie, guarde e implemente o modelo anterior ou siga e implemente a infraestrutura com o portal do Azure.

  1. Aceda ao Portal do Azure.

  2. Procure modelos em Todos os Serviços ou através da caixa de pesquisa principal:

    Captura de ecrã da barra de pesquisa no portal do Azure com

  3. Selecione Adicionar no painel Modelos :

    Captura de ecrã do painel Modelos no portal do Azure com o botão Adicionar realçado.

  4. Em Geral, introduza um Nome e uma Descrição para o novo modelo:

    Captura de ecrã da secção Geral no portal do Azure em que o utilizador introduz um Nome e uma Descrição para o novo modelo.

  5. Crie o modelo Resource Manager ao copiar no modelo JSON a partir da secção "Introdução à integração de recursos" deste artigo:

    Captura de ecrã do portal do Azure em que o utilizador cola o modelo JSON na secção Modelo do ARM.

  6. Selecione Adicionar para criar o modelo. Se o novo modelo não for apresentado, selecione Atualizar.

  7. Selecione o modelo criado recentemente e, em seguida, selecione Implementar:

    Captura de ecrã do portal do Azure a mostrar o modelo recentemente criado com o botão Implementar realçado.

  8. Introduza as definições dos campos necessários e, em seguida, selecione a subscrição e o grupo de recursos. Pode deixar a caixa ID do Fornecedor de Recursos Personalizado vazia.

    Nome da definição Necessário? Description
    Localização Sim A localização dos recursos no modelo.
    Nome da Aplicação Lógica Não O nome da aplicação lógica.
    Nome do Fornecedor de Recursos Personalizado Não O nome do fornecedor de recursos personalizado.
    ID do Fornecedor de Recursos Personalizado Não Um fornecedor de recursos personalizado existente que suporta o recurso de associação. Se especificar um valor aqui, a aplicação lógica e a implementação do fornecedor de recursos personalizado serão ignoradas.
    Nome da Associação Não O nome do recurso de associação.

    Parâmetros de exemplo:

    Captura de ecrã do portal do Azure a apresentar os campos de entrada dos parâmetros do modelo para a implementação do fornecedor de recursos personalizado.

  9. Aceda à implementação e aguarde que a implementação seja concluída. Deverá ver algo semelhante à seguinte captura de ecrã. Deverá ver o novo recurso de associação como um resultado:

    Captura de ecrã do portal do Azure a mostrar uma implementação bem-sucedida com o novo recurso de associação como saída.

    Eis o grupo de recursos, com a opção Mostrar tipos ocultos selecionada:

    Captura de ecrã do grupo de recursos no portal do Azure com a opção Mostrar tipos ocultos selecionada, a apresentar a implementação do fornecedor de recursos personalizado.

  10. Explore o separador Histórico de execuções da aplicação lógica para ver as chamadas para a criação da associação:

    Captura de ecrã do separador Histórico de execuções da aplicação lógica no portal do Azure a mostrar as chamadas para a criação da associação.

Implementar associações adicionais

Depois de configurar a infraestrutura do fornecedor de recursos personalizado, pode facilmente implementar mais associações. O grupo de recursos para associações adicionais não tem de ser o mesmo que o grupo de recursos onde implementou a infraestrutura do fornecedor de recursos personalizado. Para criar uma associação, tem de ter permissões Microsoft.CustomProviders/resourceproviders/write no ID do Fornecedor de Recursos Personalizado especificado.

  1. Aceda ao recurso Microsoft.CustomProviders/resourceProviders do fornecedor de recursos personalizado no grupo de recursos da implementação anterior. Tem de selecionar a caixa de verificação Mostrar tipos ocultos :

    Captura de ecrã do portal do Azure a apresentar o recurso do fornecedor de recursos personalizado no grupo de recursos com a opção Mostrar tipos ocultos selecionada.

  2. Copie a propriedade ID do Recurso do fornecedor de recursos personalizado.

  3. Procure modelos em Todos os Serviços ou através da caixa de pesquisa principal:

    Captura de ecrã da barra de pesquisa no portal do Azure com

  4. Selecione o modelo criado anteriormente e, em seguida, selecione Implementar:

    Captura de ecrã do portal do Azure a mostrar o modelo criado anteriormente com o botão Implementar realçado.

  5. Introduza as definições dos campos necessários e, em seguida, selecione a subscrição e um grupo de recursos diferente. Para a definição ID do Fornecedor de Recursos Personalizado , introduza o ID do Recurso que copiou do fornecedor de recursos personalizado que implementou anteriormente.

  6. Aceda à implementação e aguarde que a implementação seja concluída. Deverá agora implementar apenas o novo recurso de associações:

    Captura de ecrã do portal do Azure a mostrar a implementação bem-sucedida do novo recurso de associações.

Pode voltar ao Histórico de execuções da aplicação lógica e ver que foi efetuada outra chamada para a aplicação lógica. Pode atualizar a aplicação lógica para aumentar a funcionalidade adicional para cada associação criada.

Passos seguintes

Neste artigo, implementou um fornecedor de recursos personalizado no Azure que expande a API de Resource Manager do Azure com o tipo de recurso Microsoft.CustomProviders/associates. Para continuar a aprender sobre fornecedores de recursos personalizados, veja: