Compartilhar via


Estender recursos com provedores de recursos personalizados

Neste tutorial, você implanta um provedor de recursos personalizado no Azure que estende a API do Azure Resource Manager com o tipo de recurso Microsoft.CustomProviders/associations. O tutorial mostra como estender os recursos existentes que estão fora do grupo de recursos em que a instância do provedor de recursos personalizados está localizada. Neste tutorial, o provedor de recursos personalizado é ativado por um aplicativo lógico do Azure, mas você pode usar qualquer ponto de extremidade de API pública.

Pré-requisitos

Para concluir este tutorial, revise o seguinte:

Introdução à integração de recursos

Neste tutorial, há duas partes que precisam ser implantadas: o provedor de recursos personalizados e a associação. Para facilitar o processo, opcionalmente, você pode usar um único modelo que implanta ambos.

O modelo usará 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')]"
        }
    }
}

Implante a infraestrutura do provedor de recursos personalizados

A primeira parte do modelo implanta a infraestrutura do provedor de recursos personalizados. Essa infraestrutura define o efeito do recurso de associações. Se você não estiver familiarizado com provedores de recursos personalizados, confira a Visão geral dos Provedores de Recursos Personalizados do Azure.

Vamos implantar a infraestrutura do provedor de recursos personalizados. Copie, salve e implante o modelo anterior ou acompanhe o tutorial e implante a infraestrutura usando o portal do Azure.

  1. Vá para o Portal do Azure.

  2. Pesquise modelos em Todos os Serviços ou usando a caixa de pesquisa principal:

    Captura de tela da barra de pesquisa no portal do Azure com

  3. Selecione Adicionar no painel Modelos:

     Captura de tela do painel Modelos no portal do Azure com o botão Adicionar destacado.

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

    Captura de tela da seção Geral no portal do Azure, onde o usuário insere um Nome e uma Descrição para o novo modelo.

  5. Crie o modelo do Resource Manager copiando o modelo JSON da seção "Introdução à integração de recursos" deste artigo:

    Captura de tela do portal do Azure em que o usuário cola o modelo JSON na seção Modelo do ARM.

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

  7. Selecione o modelo recém-criado e, em seguida, selecione Implantar:

    Captura de tela do portal do Azure mostrando o modelo recém-criado com o botão Implantar destacado.

  8. Insira as configurações para os campos obrigatórios e, em seguida, selecione a assinatura e o grupo de recursos. Deixe a caixa ID do Provedor de Recursos Personalizado vazia.

    Nome da configuração Necessário? Descrição
    Location Sim A localização dos recursos no modelo.
    Nome do Aplicativo Lógico Não O nome do aplicativo lógico.
    Nome do Provedor de Recursos Personalizado Não O nome do provedor de recursos personalizado.
    ID do Provedor de Recursos Personalizado Não Um provedor de recursos personalizado existente que dá suporte ao recurso de associação. Se você especificar um valor aqui, o aplicativo lógico e a implantação do provedor de recursos personalizados serão ignorados.
    Nome da Associação Não O nome do recurso de associação.

    Parâmetros de exemplo:

    Captura de tela do portal do Azure exibindo os campos de entrada dos parâmetros de modelo para a implantação do provedor de recursos personalizado.

  9. Acesse a implantação e aguarde a conclusão dela. Você deverá ver algo semelhante à captura de tela a seguir. Você deverá ver o novo recurso de associação como uma saída:

    Captura de tela do portal do Azure mostrando uma implantação bem-sucedida com o novo recurso de associação como saída.

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

    Captura de tela do grupo de recursos no portal do Azure com a opção Mostrar tipos ocultos selecionada, exibindo a implantação do provedor de recursos personalizado.

  10. Explore a guia Histórico de execuções do aplicativo lógico para ver as chamadas para a criação da associação:

    Captura de tela da guia Histórico de execuções do aplicativo lógico no portal do Azure, mostrando as chamadas para a criação da associação.

Implantar associações adicionais

Depois de configurar a infraestrutura do provedor de recursos personalizados, você poderá implantar mais associações com facilidade. O grupo de recursos para associações adicionais não precisa ser o mesmo do grupo de recursos em que você implantou a infraestrutura do provedor de recursos personalizados. Para criar uma associação, você precisa ter permissões Microsoft.CustomProviders/resourceproviders/write na ID do Provedor de Recursos Personalizado especificado.

  1. Acesse o recurso Microsoft.CustomProviders/resourceProviders do provedor de recursos personalizados no grupo de recursos da implantação anterior. Você precisa marcar a caixa de seleção Mostrar tipos ocultos:

    Captura de tela do portal do Azure exibindo o recurso do provedor de recursos personalizado no grupo de recursos com a opção Mostrar tipos ocultos selecionada.

  2. Copie a propriedade ID do Recurso do provedor de recursos personalizados.

  3. Pesquise modelos em Todos os Serviços ou usando a caixa de pesquisa principal:

    Captura de tela da barra de pesquisa no portal do Azure com

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

    Captura de tela do portal do Azure mostrando o modelo criado anteriormente com o botão Implantar destacado.

  5. Insira as configurações para os campos obrigatórios e, em seguida, selecione a assinatura e outro grupo de recursos. Na configuração da ID do Provedor de Recursos Personalizados, insira a ID do Recurso que você copiou do provedor de recursos personalizados implantado anteriormente.

  6. Acesse a implantação e aguarde a conclusão dela. Agora, ela deverá implantar apenas o novo recurso de associações:

    Captura de tela do portal do Azure exibindo a implantação bem-sucedida do novo recurso de associações.

Volte ao Histórico de execuções do aplicativo lógico e veja que outra chamada foi feita ao aplicativo lógico. Atualize o aplicativo lógico para aumentar a funcionalidade adicional de cada associação criada.

Próximas etapas

Neste artigo, você implantou um provedor de recursos personalizado no Azure que estende a API do Azure Resource Manager com o tipo de recurso Microsoft.CustomProviders/associates. Para continuar aprendendo sobre provedores de recursos personalizados, consulte: