Поделиться через


Расширение ресурсов с помощью настраиваемых поставщиков ресурсов

В этом руководстве вы развернете в Azure пользовательский поставщик ресурсов, расширяющий API Azure Resource Manager с типом ресурса Microsoft.CustomProviders/associations. В этом руководстве показано, как расширить существующие ресурсы, которые находятся за пределами группы ресурсов, в которой находится экземпляр пользовательского поставщика ресурсов. В этом руководстве поставщик пользовательских ресурсов работает на базе приложения логики Azure, но вы можете использовать любую общедоступную конечную точку API.

Предварительные требования

Для работы с этим руководством вам потребуется следующее.

Начало работы с подключением ресурсов

В этом руководстве необходимо развернуть два элемента: настраиваемый поставщик ресурсов и связь. Чтобы упростить этот процесс, вы можете дополнительно использовать один шаблон, который развертывает оба элемента.

В шаблоне будут использоваться следующие ресурсы:

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

Развертывание инфраструктуры настраиваемого поставщика ресурсов

Первая часть шаблона развертывает инфраструктуру настраиваемого поставщика ресурсов. Эта инфраструктура определяет воздействие ресурса ассоциаций. Если вы не знакомы с настраиваемыми поставщиками ресурсов, см. статью Общие сведения о поставщиках настраиваемых ресурсов Azure.

Давайте развернем инфраструктуру настраиваемого поставщика ресурсов. Скопируйте, сохраните и разверните предыдущий шаблон или следуйте указаниям по развертыванию инфраструктуры, используя портал Azure.

  1. Перейдите на портал Azure.

  2. Найдите шаблоны в разделе Все службы или с помощью основного поля поиска:

    Снимок экрана: панель поиска в портал Azure с введенными

  3. В области Шаблоны выберите Добавить:

    Снимок экрана: область

  4. В разделе Общиевведите имя и описание для нового шаблона:

    Снимок экрана: раздел

  5. Создание шаблона Resource Manager, скопировав шаблон JSON из раздела "Начало работы с подключением ресурсов" этой статьи:

    Снимок экрана: портал Azure, где пользователь вставляет шаблон JSON в раздел шаблон ARM.

  6. Чтобы создать шаблон, выберите Добавить. Если новый шаблон не отображается, выберите Обновить.

  7. Выберите только что созданный шаблон, а затем нажмите Развернуть:

    Снимок экрана: портал Azure с вновь созданным шаблоном с выделенной кнопкой

  8. Введите параметры для обязательных полей, а затем выберите подписку и группу ресурсов. Поле идентификатора настраиваемого поставщика ресурсов можно оставить пустым.

    Имя параметра Необходим? Описание
    Расположение Да Расположение ресурсов в шаблоне.
    Название приложения логики Нет Имя приложения логики.
    Имя настраиваемого поставщика ресурсов Нет Имя настраиваемого поставщика ресурсов.
    Идентификатор настраиваемого поставщика ресурсов Нет Существующий настраиваемый поставщик ресурсов, который поддерживает ресурс связи. Если указать здесь значение, развертывание приложения логики и пользовательского поставщика ресурсов будет пропущено.
    Имя ассоциации Нет Имя ресурса связи.

    Примеры параметров:

    Снимок экрана: портал Azure с полями входных параметров шаблона для развертывания настраиваемого поставщика ресурсов.

  9. Перейдите к развертыванию и дождитесь его завершения. Результат будет подобен приведенному на следующем снимке экрана. Новый ресурс связи появится в виде выходных данных:

    Снимок экрана: портал Azure показывает успешное развертывание с новым ресурсом связи в качестве выходных данных.

    Вот группа ресурсов, в которой выбрано Показывать скрытые типы:

    Снимок экрана: группа ресурсов в портал Azure с выбранным параметром Показать скрытые типы с развертыванием настраиваемого поставщика ресурсов.

  10. Просмотрите вкладку приложения логики Журнал выполнения, чтобы увидеть вызовы к созданию связи:

    Снимок экрана: вкладка

Развертывание дополнительных связей

После настройки настраиваемой инфраструктуры поставщика ресурсов можно легко развернуть дополнительные связи. Группа ресурсов для дополнительных связей не обязательно должна совпадать с группой ресурсов, в которой развернута инфраструктура настраиваемого поставщика ресурсов. Чтобы создать связь, необходимо иметь разрешения Microsoft.CustomProviders/resourceproviders/write для указанного идентификатора настраиваемого поставщика ресурса.

  1. Перейдите к ресурсу Поставщика настраиваемых ресурсов Microsoft.CustomProviders/resourceProviders в группе ресурсов предыдущего развертывания. Вам понадобится установить флажок Показывать скрытые типы.

    Снимок экрана: портал Azure с настраиваемым ресурсом поставщика ресурсов в группе ресурсов с выбранным параметром Показать скрытые типы.

  2. Скопируйте свойство Идентификатор ресурса настраиваемого поставщика ресурсов.

  3. Найдите шаблоны в разделе Все службы или с помощью основного поля поиска:

    Снимок экрана: панель поиска в портал Azure с введенными

  4. Выберите созданный ранее шаблон и щелкните Развернуть:

    Снимок экрана: портал Azure с ранее созданным шаблоном с выделенной кнопкой

  5. Введите параметры для обязательных полей, а затем выберите подписку и другую группу ресурсов. В поле Настраиваемый идентификатор поставщика ресурсов введите идентификатор ресурса, скопированный из пользовательского поставщика ресурсов, развернутого ранее.

  6. Перейдите к развертыванию и дождитесь его завершения. Теперь он должен развертывать только новый ресурс связей:

    Снимок экрана: портал Azure с успешным развертыванием нового ресурса связей.

Можно вернуться к полю приложения логики Журнал выполнения и увидеть, что к приложению логики был сделан другой вызов. Вы можете обновить приложение логики, добавляя дополнительные функциональные возможности для каждой созданной связи.

Дальнейшие действия

В этой статье вы выполнили развертывание в Azure пользовательского поставщика ресурсов, расширяющего API Azure Resource Manager с типом ресурса Microsoft.CustomProviders/associates. Чтобы продолжить изучение настраиваемых поставщиков ресурсов, см. статью: