Resources uitbreiden met aangepaste resourceproviders

In deze zelfstudie implementeert u een aangepaste resourceprovider in Azure waarmee de Azure Resource Manager-API wordt uitgebreid met het resourcetype Microsoft.CustomProviders/associations. In de zelfstudie ziet u hoe u bestaande resources uitbreidt die zich buiten de resourcegroep bevinden waarin het exemplaar van de aangepaste resourceprovider zich bevindt. In deze zelfstudie maakt de aangepaste resourceprovider gebruik van een logische app van Azure, maar u kunt elk openbaar API-eindpunt gebruiken.

Vereisten

Als u deze zelfstudie wilt voltooien, controleert u het volgende:

Aan de slag met het onboarden van resources

In deze zelfstudie zijn er twee onderdelen die moeten worden geïmplementeerd: de aangepaste resourceprovider en de koppeling. Om het proces te vereenvoudigen, kunt u desgewenst één sjabloon gebruiken waarmee beide onderdelen worden geïmplementeerd.

De sjabloon maakt gebruik van deze resources:

{
    "$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')]"
        }
    }
}

De infrastructuur van de aangepaste resourceprovider implementeren

In het eerste deel van de sjabloon wordt de infrastructuur van de aangepaste resourceprovider geïmplementeerd. Deze infrastructuur definieert het effect van de koppelingsresource. Als u niet bekend bent met aangepaste resourceproviders, raadpleegt u Overzicht van aangepaste resourceproviders van Azure.

We gaan de infrastructuur van de aangepaste resourceprovider implementeren. Kopieer, sla de voorgaande sjabloon op en implementeer deze, of volg en implementeer de infrastructuur met behulp van de Azure Portal.

  1. Ga naar Azure Portal.

  2. Zoek naar sjablonen in Azure-services of via het zoekvak:

    Schermopname van de zoekbalk in Azure Portal met 'sjablonen' ingevoerd als de zoekquery.

  3. Selecteer Toevoegen in het deelvenster Sjablonen:

    Schermopname van het deelvenster Sjablonen in Azure Portal met de knop Toevoegen gemarkeerd.

  4. Geef onder Algemeen waarden op voor Naam en Beschrijving voor de nieuwe sjabloon:

    Schermopname van de sectie Algemeen in Azure Portal waar de gebruiker een naam en beschrijving voor de nieuwe sjabloon invoert.

  5. Maak de Resource Manager-sjabloon door de JSON-sjabloon te kopiëren vanuit de sectie 'Aan de slag met het onboarden van resources' in dit artikel:

    Schermopname van de Azure Portal waar de gebruiker de JSON-sjabloon in de sectie ARM-sjabloon plakt.

  6. Selecteer Toevoegen om de sjabloon te maken. Als de nieuwe sjabloon niet wordt weergegeven, selecteert u Vernieuwen.

  7. Selecteer de sjabloon die u zojuist hebt gemaakt en selecteer Implementeren:

    Schermopname van de Azure Portal met de zojuist gemaakte sjabloon met de knop Implementeren gemarkeerd.

  8. Voer de instellingen voor de vereiste velden in en selecteer vervolgens het abonnement en de resourcegroep. U kunt het selectievakje Id aangepaste resourceprovider leeg laten.

    Naam van de instelling Vereist? Beschrijving
    Locatie Ja De locatie voor de resources in de sjabloon.
    Naam van logische app No De naam van de logische app.
    Naam van aangepaste resourceprovider No De naam van de aangepaste resourceprovider.
    Id van aangepaste resourceprovider No Een bestaande aangepaste resourceprovider die ondersteuning biedt voor de koppelingsresource. Als u hier een waarde opgeeft, worden de implementatie van de logische app en de aangepaste resourceprovider overgeslagen.
    Naam van koppeling No De naam van de koppelingsresource.

    Voorbeeldparameters:

    Schermopname van de Azure Portal met de invoervelden voor sjabloonparameters voor de implementatie van de aangepaste resourceprovider.

  9. Ga naar de implementatie en wacht tot deze voltooid is. Er verschijnt een scherm dat er ongeveer als volgt uitziet. U ziet de nieuwe koppelingsresource als uitvoer:

    Schermopname van de Azure Portal met een geslaagde implementatie met de nieuwe koppelingsresource als uitvoer.

    Hier ziet u de resourcegroep, met Verborgen items weergeven geselecteerd:

    Schermopname van de resourcegroep in Azure Portal met Verborgen typen weergeven geselecteerd, met de implementatie van de aangepaste resourceprovider.

  10. Bekijk het tabblad Uitvoeringsgeschiedenis van de logische app om de aanroepen te zien voor het maken van de koppeling:

    Schermopname van het tabblad Uitvoeringsgeschiedenis van logische app in Azure Portal met de aanroepen voor het maken van de koppeling.

Aanvullende koppelingen implementeren

Nadat u de infrastructuur van de aangepaste resourceprovider hebt ingesteld, kunt u eenvoudig meer koppelingen implementeren. De resourcegroep voor aanvullende koppelingen hoeft niet hetzelfde te zijn als de resourcegroep waarin u de infrastructuur van de aangepaste resourceprovider hebt geïmplementeerd. Als u een koppeling wilt maken, moet u de machtigingen Microsoft.CustomProviders/resourceproviders/write hebben voor de id van de opgegeven aangepaste resourceprovider.

  1. Ga naar de aangepaste resourceprovider Microsoft.CustomProviders/resourceProviders in de resourcegroep van de vorige implementatie. U moet het selectievakje Verborgen typen weergeven inschakelen:

    Schermopname van het Azure Portal met de resource van de aangepaste resourceprovider in de resourcegroep met Verborgen typen weergeven geselecteerd.

  2. Kopieer de eigenschap Resource-id van de aangepaste resourceprovider.

  3. Zoek naar sjablonen in Azure-services of via het zoekvak:

    Schermopname van de zoekbalk in Azure Portal met 'sjablonen' ingevoerd als de zoekquery.

  4. Selecteer de sjabloon die u eerder hebt gemaakt en selecteer vervolgens Implementeren:

    Schermopname van de Azure Portal met de eerder gemaakte sjabloon met de knop Implementeren gemarkeerd.

  5. Voer de instellingen voor de vereiste velden in en selecteer vervolgens het abonnement en een andere resourcegroep. Voer voor de instelling Aangepaste resourceprovider-id de resource-id in die u hebt gekopieerd uit de aangepaste resourceprovider die u eerder hebt geïmplementeerd.

  6. Ga naar de implementatie en wacht tot deze voltooid is. Nu moet alleen de resource voor de nieuwe koppeling worden geïmplementeerd:

    Schermopname van de Azure Portal met de geslaagde implementatie van de nieuwe koppelingenresource.

U kunt teruggaan naar de uitvoeringsgeschiedenis van de logische app en zien dat er een andere aanroep is gedaan naar de logische app. U kunt de logische app bijwerken om extra functionaliteit toe te voegen voor elke gemaakte koppeling.

Volgende stappen

In dit artikel hebt u een aangepaste resourceprovider geïmplementeerd in Azure waarmee de Azure Resource Manager-API wordt uitgebreid met het resourcetype Microsoft.CustomProviders/associates. Zie voor meer informatie over aangepaste resourceproviders: