如何在Azure Data Factory中用PowerShell脚本自动化任务、捕获错误并发送邮件?
Azure Data Factory 管道自动化+失败邮件通知(PowerShell实现,无需Logic App)
核心思路
通过PowerShell调用Azure Data Factory的Az模块,实现管道触发、运行状态轮询、失败错误捕获,最终用PowerShell原生邮件命令或Azure SendGrid发送通知,全程不依赖Logic App或自定义活动。
1. 前置准备
- 安装并导入Az.DataFactory模块:
Install-Module -Name Az.DataFactory -Force -Scope CurrentUser Import-Module Az.DataFactory - 确保执行脚本的账号拥有ADF的Data Factory Contributor权限,同时具备邮件发送权限(SMTP账号或SendGrid API密钥)
2. 完整PowerShell脚本实现
# -------------------------- 配置参数 -------------------------- $resourceGroupName = "你的资源组名称" $dataFactoryName = "你的ADF实例名称" $pipelineName = "目标管道名称" # 邮件配置(SMTP示例,可替换为SendGrid API) $smtpServer = "smtp.office365.com" # 示例:Office 365 SMTP服务器 $smtpPort = 587 $senderEmail = "alert@yourdomain.com" $recipientEmails = @("user1@yourdomain.com", "user2@yourdomain.com") $smtpCredential = Get-Credential -Message "输入SMTP账号密码" # 轮询配置(根据管道时长调整) $maxPollTimes = 60 # 最多轮询60次 $pollInterval = 30 # 每次间隔30秒 # ------------------------------------------------------------- # 1. 触发管道运行 try { $pipelineRun = Invoke-AzDataFactoryV2Pipeline -ResourceGroupName $resourceGroupName ` -DataFactoryName $dataFactoryName ` -PipelineName $pipelineName $runId = $pipelineRun.RunId Write-Host "管道触发成功,运行ID: $runId" } catch { # 触发失败时发送邮件 $errorSubject = "ADF管道触发失败 | $pipelineName" $errorBody = "触发管道时发生错误:`n`n错误详情:$_" Send-MailMessage -From $senderEmail -To $recipientEmails ` -Subject $errorSubject -Body $errorBody ` -SmtpServer $smtpServer -Port $smtpPort ` -UseSsl -Credential $smtpCredential Write-Error "管道触发失败,已发送通知邮件" exit 1 } # 2. 轮询管道运行状态 $currentStatus = "InProgress" for ($i=1; $i -le $maxPollTimes; $i++) { $runDetails = Get-AzDataFactoryV2PipelineRun -ResourceGroupName $resourceGroupName ` -DataFactoryName $dataFactoryName ` -PipelineRunId $runId $currentStatus = $runDetails.Status Write-Host "第$i次轮询,当前状态: $currentStatus" if ($currentStatus -ne "InProgress") { break } Start-Sleep -Seconds $pollInterval } # 3. 处理运行结果 if ($currentStatus -eq "Failed") { # 获取所有失败活动的详细错误信息 $failedActivities = Get-AzDataFactoryV2ActivityRun -ResourceGroupName $resourceGroupName ` -DataFactoryName $dataFactoryName ` -PipelineRunId $runId ` -Status "Failed" # 构建邮件内容 $errorSubject = "ADF管道执行失败 | $pipelineName (运行ID: $runId)" $errorBody = @" 管道执行失败,详细信息如下: 管道名称:$pipelineName 运行ID:$runId 失败时间:$($runDetails.LastUpdated) --- 失败活动列表 --- "@ foreach ($activity in $failedActivities) { $errorBody += @" 活动名称:$($activity.ActivityName) 活动类型:$($activity.ActivityType) 错误信息:$($activity.Error.Message) "@ if ($activity.Error.Details) { $errorBody += "错误详情:`n$($activity.Error.Details | Out-String)" } } # 发送失败通知邮件 try { Send-MailMessage -From $senderEmail -To $recipientEmails ` -Subject $errorSubject -Body $errorBody ` -SmtpServer $smtpServer -Port $smtpPort ` -UseSsl -Credential $smtpCredential Write-Host "失败通知邮件已发送" } catch { Write-Error "发送通知邮件失败:$_" } } elseif ($currentStatus -eq "Succeeded") { Write-Host "管道执行成功" } else { Write-Host "管道运行状态异常:$currentStatus" }
3. 关键注意事项
- 权限验证:执行脚本的账号需能读取ADF运行日志,SMTP账号需允许客户端发件(比如Office 365需开启“允许不安全应用”或使用应用密码)
- 轮询参数调整:
maxPollTimes和pollInterval要匹配管道的预期运行时长,避免过早终止轮询 - 邮件方式替换:如果不想用SMTP,可以改用Azure SendGrid API,替换
Send-MailMessage为Invoke-RestMethod调用SendGrid的邮件发送接口 - 自动化部署:可将脚本部署到Azure Automation Runbook或本地Windows任务计划,实现定期自动触发
内容的提问来源于stack exchange,提问作者Harshlata
相关产品推荐
相关产品推荐

