Webhooks 如何为Azure Data Factory v2中的Runbook执行配置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} 我提到: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主
我不确定这是否是最佳实践,但我有一些东西可以在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完成时才移动到下一个管道