AzureのETLサービスであるAzure Data FactoryのPipelineをトリガー機能によるスケジュールではなくPowerShellから実行したい。
Pipelineの実行
以下コマンドでPipelineを実行できます。
ただし、Invoke-AzDataFactoryV2Pipeline
コマンドは実行完了を待ちませんのでRun IDを取得して別のコマンドで処理の状態をチェックする必要があります。
$runid = Invoke-AzDataFactoryV2Pipeline -ResourceGroupName hoge-rg -DataFactoryName hoge-df -PipelineName pipeline1
実行結果の確認
先ほど取得したRun IDを使用して処理の状態を取得します。
正常終了している場合はStatusがSucceededとなります。
Get-AzDataFactoryV2PipelineRun -ResourceGroupName hoge-rg -DataFactoryName hoge-df -PipelineRunId $runid
ResourceGroupName : hoge-rg
DataFactoryName : hoge-df
RunId : 0f5dae66-c986-49ee-bb60-f4c787517014
PipelineName : pipeline1
LastUpdated : 2020/03/20 15:03:10
Parameters : {}
RunStart : 2020/03/20 15:03:04
RunEnd : 2020/03/20 15:03:10
DurationInMs : 6215
Status : Succeeded
Message :
処理が完了していない…
成否問わず一回の結果確認で完了ステータスが取得できれば良いですが、中々そうもいきませんね。
ですので完了するまで何度もコマンドを実行してステータスを取得します。
ループで定期的にステータスを取得するようにすれば問題ないでしょう。
次のサンプルでは10秒ごとに結果を確認し、処理が10分で完了しない場合ループを抜けるようにしています。
$limitTime = (Get-Date).AddSeconds(600)
$RunEnd= $false
do{
Start-Sleep 10
$result = Get-AzDataFactoryV2PipelineRun -ResourceGroupName hoge-rg -DataFactoryName hoge-df -PipelineRunId $runid
Write-Output $result.Status
if (!$result.RunEnd) {
continue
}
$RunEnd= $true
break
} while ((Get-Date) -lt $limitTime)
まとめ
トリガーによるPipelineのスケジュール実行は便利ですが、Pipelineに設定できない別のプログラム等と
先行後続関係を持っての実行制御が難しいです。
PowerShellから実行することでその辺りの制御に有効だと思います。