你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将自定义操作添加到 Azure REST API

本文将介绍有关创建实现自定义作的 Azure 自定义资源提供程序终结点的要求和最佳做法。 如果不熟悉 Azure 自定义资源提供程序,请参阅 有关自定义资源提供程序的概述

如何定义动作端点

终结点是一个指向服务的 URL,该服务在服务与 Azure 之间实现基础协定。 终结点在自定义资源提供程序中定义,可以是任何可公开访问的 URL。 下面的示例具有一个动作myCustomActionendpointURL实现。

示例 ResourceProvider

{
  "properties": {
    "actions": [
      {
        "name": "myCustomAction",
        "routingType": "Proxy",
        "endpoint": "https://{endpointURL}/"
      }
    ]
  },
  "location": "eastus",
  "type": "Microsoft.CustomProviders/resourceProviders",
  "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.CustomProviders/resourceProviders/{resourceProviderName}",
  "name": "{resourceProviderName}"
}

构建动作端点

实现终结点必须处理 Azure 中新 API 的请求和响应。 创建具有 操作 的自定义资源提供程序时,它将在 Azure 中生成一组新的 API。 在这种情况下,该动作将生成一个新的 Azure 操作 API 来进行 POST 调用。

/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.CustomProviders/resourceProviders/{resourceProviderName}/myCustomAction

Azure API 传入请求:

POST https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.CustomProviders/resourceProviders/{resourceProviderName}/myCustomAction?api-version=2018-09-01-preview
Authorization: Bearer eyJ0e...
Content-Type: application/json

{
    "myProperty1": "myPropertyValue1",
    "myProperty2": {
        "myProperty3" : "myPropertyValue3"
    }
}

然后,此请求将以以下形式转发到 终结点

POST https://{endpointURL}/?api-version=2018-09-01-preview
Content-Type: application/json
X-MS-CustomProviders-RequestPath: /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.CustomProviders/resourceProviders/{resourceProviderName}/myCustomAction

{
    "myProperty1": "myPropertyValue1",
    "myProperty2": {
        "myProperty3" : "myPropertyValue3"
    }
}

同样, 终结点的响应 随后将转发回客户。 终结点的响应应返回:

  • 有效的 JSON 对象文档。 所有数组和字符串都应嵌套在顶部对象下。
  • 标头 Content-Type 应设置为“application/json;charset=utf-8”。
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

{
    "myProperty1": "myPropertyValue1",
    "myProperty2": {
        "myProperty3" : "myPropertyValue3"
    }
}

Azure 自定义资源提供程序响应:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

{
    "myProperty1": "myPropertyValue1",
    "myProperty2": {
        "myProperty3" : "myPropertyValue3"
    }
}

调用自定义动作

有两种主要方法可以从自定义资源提供程序调用自定义操作:

  • Azure CLI
  • Azure 资源管理器模板

Azure CLI

az resource invoke-action --action {actionName} \
                          --ids /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.CustomProviders/resourceProviders/{resourceProviderName} \
                          --request-body \
                            '{
                                "myProperty1": "myPropertyValue1",
                                "myProperty2": {
                                    "myProperty3": "myPropertyValue3"
                                }
                            }'
参数 必选 Description
操作 是的 ResourceProvider 中定义的动作名称。
ids 是的 ResourceProvider 的资源 ID。
请求体 将发送到 终结点的请求正文。

Azure 资源管理器模板

注释

在 Azure 资源管理器模板中,操作的支持有限。 若要在模板内调用动作,其名称中必须包含 list 前缀。

包含列表操作的示例 ResourceProvider

{
  "properties": {
    "actions": [
      {
        "name": "listMyCustomAction",
        "routingType": "Proxy",
        "endpoint": "https://{endpointURL}/"
      }
    ]
  },
  "location": "eastus"
}

示例 Azure 资源管理器模板:

{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "variables": {
        "resourceIdentifier": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.CustomProviders/resourceProviders/{resourceProviderName}",
        "apiVersion": "2018-09-01-preview",
        "functionValues": {
            "myProperty1": "myPropertyValue1",
            "myProperty2": {
                "myProperty3": "myPropertyValue3"
            }
        }
    },
    "resources": [],
    "outputs": {
        "myCustomActionOutput": {
            "type": "object",
            "value": "[listMyCustomAction(variables('resourceIdentifier'), variables('apiVersion'), variables('functionValues'))]"
        }
    }
}
参数 必选 Description
资源标识符 是的 ResourceProvider 的资源 ID。
apiVersion 是的 资源运行时的 API 版本。 这应始终为“2018-09-01-preview”。
functionValues 将发送到 终结点的请求正文。

后续步骤