是否有选项可以从Azure功能的部署中获取事件网格触发url + key的输出值?

时间:2018-05-16 09:43:02

标签: azure azure-devops azure-functions arm-template azure-eventgrid

是否可以选择从Azure功能的部署中获取输出值的事件网格触发器url + key?

我们想要的方案如下: - 我们通过ARM在VSTS版本中部署功能服务。 - 部署了Function服务后,我们部署了事件网格订阅。

谢谢, Shraddha Agrawal

3 个答案:

答案 0 :(得分:1)

是的,有一种方法可以使用REST API来获取功能访问代码。以下是步骤:

  1. 假设函数的名称是 EventGridTrigger2 和run.csx:

    #r "Newtonsoft.Json"
    
    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;
    
    public static void Run(JObject eventGridEvent, TraceWriter log)
    {
        log.Info(eventGridEvent.ToString(Formatting.Indented));
    
    }
    
  2. 和function.json文件:

        {
            "bindings": [
            {
              "type": "eventGridTrigger",
              "name": "eventGridEvent",
              "direction": "in"
            }
           ],
           "disabled": false
        }
    

    正如您所看到的,上述绑定是无类型的,适用于任何输出架构,例如 InputEventSchema EventGridSchema (默认架构)和 CloudEventV01Schema (修复了一些bug之后)。

    1. 创建的订阅的目标属性如下所示:

      "destination": {
          "properties": {
            "endpointUrl": null,
            "endpointBaseUrl": "https://myFunctionApp.azurewebsites.net/admin/extensions/EventGridExtensionConfig"
          },
          "endpointType": "WebHook"
        },
      
    2. 请注意,Azure EventGrid触发器的完整subscriberUrl具有以下格式,其中查询字符串包含用于将请求路由到正确函数的参数:

      https://{FunctionApp}.azurewebsites.net/admin/extensions/EventGridExtensionConfig?functionName={FunctionName}&code={masterKey}
      

      为了创建订阅者,我们必须使用其完整的subscriberUrl包含查询字符串。在这一刻,唯一未知的值是masterKey。

      1. 要获取Function App(Host)masterkey,我们必须使用管理REST API调用:

        https://management.azure.com/subscriptions/{mySubscriptionId}/resourceGroups/{myResGroup}/providers/Microsoft.Web/sites/{myFunctionApp}/functions/admin/masterkey?api-version=2016-08-01
        
      2. 响应的格式如下:

            {
               "masterKey": "*************************************************"
            }
        

        请注意,此次通话需要验证不记名令牌

        一旦我们为FunctionApp(主机)提供了一个masterKey,我们就可以将它用于该主机中的任何功能。

答案 1 :(得分:1)

我想您在问:“如何使用ARM在VSTS版本中部署Azure功能并获取其触发网址,以便我可以在下一个VSTS发布步骤中使用触发网址?”

它没有很好的文档记录,但使用official docsthis blog post和一些反复试验,我们已经弄明白了。

这就是ARM的样子:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {}
  "variables": {},
  "resources": [],
  "outputs": {
    "triggerUrl": {
      "type": "string",
      "value": "[listsecrets(resourceId('Microsoft.Web/sites/functions', 'functionAppName', 'functionName'),'2015-08-01').trigger_url]"
    }
  }
}

您使用“Azure资源组部署”步骤部署它,确保在“部署输出”文本框中输入变量名称,例如triggerUrl

示例输出:

{"triggerUrl":{"type":"String","value":"https://functionAppName.azurewebsites.net/api/functionName?code=1234"}}

然后,您将之后的PowerShell步骤(或Azure PowerShell步骤)从变量中获取值。

$environmentVariableName = "triggerUrl"
$outputVariables = (Get-Item env:$environmentVariableName).Value

然后用它做点什么。

答案 2 :(得分:0)

随着Functions App V2.0.12050的更新,事件网格触发器的URI有所不同。另请参见here