【问题标题】:How to configure Webhook activity for runbooks execution in Azure Data Factory v2?如何为 Azure 数据工厂 v2 中的 Runbook 执行配置 Webhook 活动?
【发布时间】:2019-10-31 00:37:12
【问题描述】:

我正在从 ADF 运行运行手册(powershell 和图形)。我发现完成此任务的方法之一是使用 webhook。我将让 Runbook 并行和串联运行(如果依赖于以前的 Runbook)。

总体而言,

  • 如果将平面文件拖放到 Azure Blob 存储中,则会触发包含相应 Runbook 的管道。这部分工作正常。

  • Runbook 的 webhook 用于 ADF webhook 活动。这就是我面临的问题。我不确定 webhook 活动的主体应该是什么?

经过一些研究,我发现需要在 webhook 的主体中添加(或以某种方式生成)有关回调 uri 的内容。我怎样才能得到这个回调 uri?如果我没有添加正确的回调 uri,那么活动会一直运行到超时。我相信当它正在运行的 runbook 成功执行时,该功能应该是 webhook 活动完成,因此我们可以继续进行管道中的下一个 webhook 活动。我也尝试过网络活动,但这是同样的问题。

我现在使用的 body 就在 json 下面。

{"body":{"myMessage":"Sample"}}

我参考过:

https://vanishedgradient.com/2019/04/25/webhooks-with-azure-data-factory/

https://mrpaulandrew.com/2019/06/18/azure-data-factory-web-hook-vs-web-activity/

https://social.msdn.microsoft.com/Forums/en-US/2effcefb-e65b-4d5c-8b01-138c95126b79/in-azure-data-factory-v2-how-to-process-azure-analysis-service-cube?forum=AzureDataFactory

【问题讨论】:

    标签: webhooks azure-data-factory-2 azure-runbook


    【解决方案1】:

    感谢您的链接,它们是有用的资源。我已经设法让这个管道工作,该管道调用运行手册来调整天蓝色分析服务的大小。没有很好地记录运行手册返回失败和成功信息。

    这里有一些代码可以提供一点帮助,我从几个地方获取了这些代码,但其中很多来自此 Microsoft 页面上的未解决问题 (https://github.com/MicrosoftDocs/azure-docs/issues/43897):https://docs.microsoft.com/en-us/azure/data-factory/control-flow-webhook-activity

    datafactory Webhook 活动传入一些“Headers”,SourceHost 是 @pipeline().DataFactory 和 SourceProcess 是 @pipeline().Pipeline。这样我们就可以进行一些检查以确认运行手册是否由可接受的进程运行。

    调用的主体是我们需要的其他变量:

    @json(concat('{"AnalysisServer":"', pipeline().parameters.AASName, '", "MinimumSKU":"', pipeline().parameters.SKU,'"}') )
    

    您的 Runbook 需要 WebhookData 参数

    param
    (
        [Parameter (Mandatory=$false)]
        [object] $WebhookData
    )
    

    然后您可以获取所有需要的信息,包括检查是否提供了回调:

    if ($WebhookData)
    {
    
        # Split apart the WebhookData
        $WebhookName     =     $WebhookData.WebhookName
        $WebhookHeaders  =     $WebhookData.RequestHeader
        $WebhookBody     =     $WebhookData.RequestBody | Convertfrom-Json
        $WebhookADF      =     $WebhookHeaders.SourceHost
        $WebhookPipeline =     $WebhookHeaders.SourceProcess
    
    Write-Output -InputObject ('Runbook started through webhook {0} called by {1} on {2}.' -f $WebhookName, $WebhookPipeline, $WebhookADF)
    
    # if there's a callBackURI then we've been called by something that is waiting for a response
    If ($WebhookBody.callBackUri)
    {
        $WebhookCallbackURI =  $WebhookBody.callBackUri
    }
    
    ...
    }
    
    

    变量$WebHookHeaders:@{Connection=Keep-Alive; Expect=100-continue; Host=sXXevents.azure-automation.net; SourceHost=**MYDATAFACTORYNAME**; SourceProcess=**MYPIPELINENAME**; x-ms-request-id=**UNIQUEIDENTIFIER**}

    然后您可以从 json 正文中获取信息:$AzureAnalysisServerName = $WebHookBody.AnalysisServer

    将错误/失败传回 Runbook 相对容易,请注意,我将成功/更新消息放入 $Message 中,并且只有在出现错误时才会在 $ErrorMessage 中包含内容:

    $ErrorMessage = "Failed to do stuff I wanted" 
    
    if ($ErrorMessage) 
    {
    
        $Output = [ordered]@{ output= @{
            AzureAnalysisServerResize = "Failed" }
            error = @{
                ErrorCode = "ResizeError"
                Message = $ErrorMessage
            }
            statusCode = "500"
        }
    } else {
        $Output = [ordered]@{ 
            output= @{ 
                "AzureAnalysisServerResize" = "Success"
                "message" = $Outputmessage 
            }
            statusCode = "200"
        }
    }
    
    $OutputJson = $Output | ConvertTo-Json -Depth 10
    
    # if we have a callbackuri let the ADF Webhook activity know that the script is complete 
    # Otherwise it waits until its timeout
    If ($WebhookCallBackURI)
    {
        $WebhookCallbackHeaders = @{
            "Content-Type"="application/json"
        }
        Invoke-WebRequest -UseBasicParsing -Uri $WebhookCallBackURI -Method Post -Body $OutputJson -Header $WebhookCallbackHeaders
    }
    

    然后我用 else 结束 if ($WebhookData) { 调用,说明如果不是从 webhook 调用 runbook,则不应运行:

    } else {
        Write-Error -Message 'Runbook was not started from Webhook' -ErrorAction stop
    }
    

    传回错误消息很容易,传回成功消息很痛苦,但上述方法似乎有效,并且在我的数据工厂管道中我可以访问结果。

    Output
    {
        "message": "Analysis Server MYSERVERNAME which is SKU XX is already at or above required SKU XX.",
        "AzureAnalysisServerResize": "Success"
    }
    

    请注意,对于 Invoke-WebRequest,一些在线示例未指定 -UseBasicParsing,但我们不得不按照运行手册的抱怨:Invoke-WebRequest :无法解析响应内容,因为 Internet Explorer 引擎不可用,或 Internet Explorer 的首次启动配置不完整。

    【讨论】:

      【解决方案2】:

      我不确定这是否是最佳做法,但我有一些在 Powershell 工作流运行手册中起作用的东西。

      如果 Runbook 定义了 webhook,则使用 webhookdata 参数。您的请求正文需要采用 JSON 格式,并且 $WebhookData 参数会选择它。例如,假设您的 webhook 活动中的 Body 如下所示:

      {"MyParam":1, "MyOtherParam":"Hello"}

      在您的运行手册中,您可以通过以下方式获取参数:

      Param([object]$WebhookData)
      
      if($WebhookData){
          $parameters=(ConvertFrom-Json -InputObject $WebhookData.RequestBody)
          if($parameters.MyParam) {$ParamOne = $parameters.MyParam} 
          if($parameters.MyOtherParam) {$ParamTwo = $parameters.MyOtherParam} 
      }
      

      Runbook 中的变量 $ParamOne 和 $ParamTwo 是从解析的 JSON 正文字符串中填充的。数据工厂自动将 callBackUri 附加到 Body 字符串。你不需要创建它。

      您必须使用 $WebhookData 名称。这是一个定义的属性。

      我希望这会有所帮助。

      【讨论】:

        【解决方案3】:

        抱歉耽搁了。几个月前我找到了完整的解决方案。感谢 Nick 和 Sara 添加这些片段。我使用了类似的代码作为返回码。我们使用的是图形化的运行手册,只允许进行有限的更改,所以我只是在运行手册的末尾添加了返回代码 (Powershell),几乎没有影响。我插入了以下代码:

        if ($WebhookData)
        {
            Write-Output $WebhookData
            $parameters = (ConvertFrom-Json -InputObject $WebhookData.RequestBody)
            if ($parameters.callBackUri)
            {
                $callbackuri = $parameters.callBackUri
            }
        }
        
        
        if ($callbackuri)
        {
            Invoke-WebRequest -Uri $callbackuri -UseBasicParsing -Method POST
        }
        
        Write-Output $callbackuri
        

        在此之后,我使用 Runbook 中可用的“输入和输出”按钮添加了一个输入参数。我将输入参数命名为“WebhookData”并输入为“Object”。输入参数的名称区分大小写,应与 Powershell 代码中使用的参数匹配。

        这解决了我的问题。从 ADF 管道调用 Runbook 时启动,仅当 Webhook 调用的底层 Runbook 完成时才移动到下一个管道。

        【讨论】:

          猜你喜欢
          • 2019-04-24
          • 2018-10-02
          • 1970-01-01
          • 2019-11-18
          • 1970-01-01
          • 1970-01-01
          • 2018-11-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多