Runbook 用いた仮想マシンの自動起動/停止の際に "The pipeline was not run because a pipeline is already running. Pipelines cannot be run concurrently." のエラーでジョブが失敗する事象について

こんにちは、Azure テクニカル サポートの伊東です。
本日は Azure Automation の Runbook を用いて仮想マシンの自動起動および停止を実施した際に、"The pipeline was not run because a pipeline is already running. Pipelines cannot be run concurrently." のエラーでジョブが失敗する事象について、発生原因と対処策をご案内いたします。

発生している事象について

Automation の実行基盤では通常、認証の処理後に実行基盤上でそれぞれジョブに対し個別のワーカーが作成され、Runbook を実行します。しかし、現在 Runbook による複数の処理が同一のワーカーにて実行されてしまう場合があることが確認されており、タイミングによっては以下のエラーで処理が失敗することがあります。

エラー メッセージ: The pipeline was not run because a pipeline is already running. Pipelines cannot be run concurrently.

こちらの事象が発生しているというお問い合わせは複数いただいており、弊社開発部門にて現在、不具合の修正を進めております。問題解消のためには Azure 基盤に関わる修正が必要となることから、完全な解決の目途は現時点 (2018/3/7 現在) では決定しておりませんが、一刻も早い解決に向け取り組んでおります。

 

対処策

上述の通り、修正の目途は決定していないため、以下 2 点の回避策にて本事象に対応いただくことを推奨しております。

<対処策 1>
仮想マシンを起動させる時刻を数分程度ずらすようご設定ください。根本的な解決策とはなりませんが、ほとんどのお客様にてこの対処にて事象が発生しなくなることをご確認いただいております。

<対処策 2>
PowerShell Runbook を利用して VM を自動起動/停止するスクリプトを作成し、下記のコードを追加することで本事象を回避することが可能です。以下のコードでは、ミューテックスの機構を追加し排他制御を実現することで事象を回避しております。尚、グラフィカル Runbook では本事象を回避する排他制御を実装することは出来ないため、対処策 1 にてご対応ください。

 $lockName = $pid
Write-Debug "Using lock $lockName";
$lock = New-Object System.Threading.Mutex($false, $lockName); $lock.WaitOne(); 
try {
    /*VM の自動起動 or 停止を行うスクリプト*/
}
finally
{
 $lock.ReleaseMutex();
 $lock.Dispose();
}

 

以上、Runbook を用いて仮想マシンの自動起動および停止を実施した際に、"The pipeline was not run because a pipeline is already running. Pipelines cannot be run concurrently." のエラーでジョブが失敗する事象についてご案内しました。
※ 本情報の内容 (添付書類、リンク先などを含む) は、作成日時点のものであり、予告なく変更される場合があります。