Webhooks 如何为Azure Data Factory v2中的Runbook执行配置Webhook活动?

Webhooks 如何为Azure Data Factory v2中的Runbook执行配置Webhook活动?,webhooks,azure-data-factory-2,azure-runbook,Webhooks,Azure Data Factory 2,Azure Runbook,我正在从ADF运行Runbook powershell和graphical。我发现完成这项任务的方法之一是使用Webhook。如果之前的runbook上存在依赖项,我将让runbook并行和串行运行 总的来说 如果在Azure Blob存储中删除平面文件,则会触发包含相应运行手册的管道。这部分工作正常 Runbook的webhook用于ADF webhook活动。这就是我面临的问题。我不确定webhook活动的主体应该是什么 经过一些研究,我找到了一些关于回调uri的东西,需要在webhook主

我正在从ADF运行Runbook powershell和graphical。我发现完成这项任务的方法之一是使用Webhook。如果之前的runbook上存在依赖项,我将让runbook并行和串行运行

总的来说

如果在Azure Blob存储中删除平面文件,则会触发包含相应运行手册的管道。这部分工作正常

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

经过一些研究,我找到了一些关于回调uri的东西,需要在webhook主体中添加或以某种方式生成。如何获取此回调uri?如果我没有添加正确的回调uri,那么活动将一直运行到超时。我相信当运行它的runbook成功执行时,webhook活动应该完成,这样我们就可以继续管道中的下一个webhook活动。我也尝试过网络活动,但都是一样的问题

我现在使用的主体就在json下面

{body:{myMessage:Sample}

我提到:


我不确定这是否是最佳实践,但我有一些东西可以在Powershell工作流运行手册中使用

如果runbook定义了webhook,则使用webhookdata参数。您的请求正文需要是JSON格式,并且$WebhookData参数会将其提取出来。例如,假设webhook活动中的主体如下所示:

{MyParam:1,MyOtherParam:Hello}

在runbook中,您可以通过以下方式获取参数:

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和$paramtoo中的变量是从解析的JSON主体字符串填充的。数据工厂会自动将回调URI追加到主体字符串。您不需要创建它

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


我希望这有帮助

我不确定这是否是最佳实践,但我有一些东西可以在Powershell工作流运行手册中使用

如果runbook定义了webhook,则使用webhookdata参数。您的请求正文需要是JSON格式,并且$WebhookData参数会将其提取出来。例如,假设webhook活动中的主体如下所示:

{MyParam:1,MyOtherParam:Hello}

在runbook中,您可以通过以下方式获取参数:

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和$paramtoo中的变量是从解析的JSON主体字符串填充的。数据工厂会自动将回调URI追加到主体字符串。您不需要创建它

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


我希望这有帮助

感谢这些链接,它们是有用的资源。我已经设法让它在一个调用runbook来调整azure analysis services的管道中工作。没有很好地记录runbook返回失败和成功信息

这里有一些代码可以提供一些帮助,我从几个地方获得了这些代码,但很多代码都来自于本Microsoft页面上的公开问题:

datafactory Webhook活动传入一些头,SourceHost为@pipeline.datafactory,SourceProcess为@pipeline.pipeline。这样我们就可以进行一些检查,以确认runbook是否由可接受的进程运行

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

@json(concat('{"AnalysisServer":"', pipeline().parameters.AASName, '", "MinimumSKU":"', pipeline().parameters.SKU,'"}') )
您的runbook需要WebhookData参数

param
(
    [Parameter (Mandatory=$false)]
    [object] $WebhookData
)
然后,您可以获取所需的所有位,包括检查是否提供了回调URI:

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,则runbook不应运行:

} else {
    Write-Error -Message 'Runbook was not started from Webhook' -ErrorAction stop
}
传回一条错误消息非常容易,传回一条成功消息非常痛苦,但是上面的方法似乎有效,在我的datafactory管道中,我可以访问结果

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

请注意,对于Invoke WebRequest,一些联机示例没有指定-UseBasicParsing,但正如runbook所抱怨的那样:Invoke WebRequest:响应内容无法解析,因为Internet Explorer引擎不可用,或者Internet Explorer的第一次启动配置不完整。

感谢这些链接,它们是非常有用的资源。我已经设法让它在一个调用runbook来调整azure analysis services大小的管道中工作。让runbook返回failur e和成功信息没有很好的记录

这里有一些代码可以提供一些帮助,我从几个地方获得了这些代码,但很多代码都来自于本Microsoft页面上的公开问题:

datafactory Webhook活动传入一些头,SourceHost为@pipeline.datafactory,SourceProcess为@pipeline.pipeline。这样我们就可以进行一些检查,以确认runbook是否由可接受的进程运行

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

@json(concat('{"AnalysisServer":"', pipeline().parameters.AASName, '", "MinimumSKU":"', pipeline().parameters.SKU,'"}') )
您的runbook需要WebhookData参数

param
(
    [Parameter (Mandatory=$false)]
    [object] $WebhookData
)
然后,您可以获取所需的所有位,包括检查是否提供了回调URI:

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,则runbook不应运行:

} else {
    Write-Error -Message 'Runbook was not started from Webhook' -ErrorAction stop
}
传回一条错误消息非常容易,传回一条成功消息非常痛苦,但是上面的方法似乎有效,在我的datafactory管道中,我可以访问结果

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

请注意,对于Invoke WebRequest,一些联机示例没有指定-UseBasicParsing,但正如runbook所抱怨的那样:Invoke WebRequest:响应内容无法解析,因为Internet Explorer引擎不可用,或者Internet Explorer的第一次启动配置不完整。

对延迟表示歉意几个月前,我找到了完整的解决方案。感谢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中可用的input和Output按钮添加了一个输入参数。我将输入参数命名为WebhookData,并将类型命名为Object。输入参数的名称区分大小写,应与Powershell代码中使用的参数匹配


这解决了我的问题。runbook在从ADF管道调用时启动,只有在webhook调用的基础runbook完成时才移动到下一个管道。

为延迟道歉。几个月前我找到了完整的解决方案。感谢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中可用的input和Output按钮添加了一个输入参数。我将输入参数命名为WebhookData,并将类型命名为Object。输入参数的名称区分大小写,应与Powershell代码中使用的参数匹配

这解决了我的问题。runbook在从ADF管道调用时启动,只有在webhook调用的底层runbook完成时才移动到下一个管道