Freigeben über


Azure Automation : try / catch を利用した Runbook のリトライ処理

こんにちは、Azure サポートチームの山口です。
本記事では、Azure Automation の PowerShell Runbook に、try / catch 構文を利用したリトライ処理を実装する方法を紹介したいと思います。

はじめに


『複数の仮想マシンを一斉起動する Runbook をスケジュールしていて、時間になって確認してみると一台の仮想マシンだけ起動に失敗していた、、、』といったお問い合わせを最近多く頂きます。Azure にアクセスするタイミングによっては、コマンドレットやパラメータの指定は正しいのに、Azure 内部が起因となるエラーが偶に生じてしまいます。このような不運なエラーが起きる原因は、排他制御など様々な要因がありますが、Azure Automation の観点から可用性を高めるためには、Runbook 内でのリトライ処理が非常に有効となります。本記事で紹介するリトライ処理を実装すると、成功するまで Runbook を繰り返し実行するので、上記のようなエラーを回避することが出来ます。

リトライ処理の実装には、PowerShell v2.0 からサポートされている try / catch 構文を使用します。try / catch (/ finally) に関する詳細は、MS 公式ブログ An Introduction to Error Handling in PowerShell (英語) などのサイトを参考にしていただけたらと思います。

リトライ処理のテンプレート


早速、リトライ処理を実現する PowerShell スクリプトのテンプレートを紹介したいと思います。
このスクリプトは、Azure Automation での PowerShell Runbook 環境だけでなく、通常の PowerShell 環境でも使用することが出来る汎用的なものです。次のセクションで、このテンプレートを組み込んだ PowerShell Runbook のサンプルを紹介しますので、PowerShell Runbook として使用したい場合はそちらもご覧ください。

PowerShell スクリプト

 # リトライ間隔(秒)
$RetryIntervalInSeconds = 10
# リトライ回数
$NumberOfRetryAttempts = 2
# 実行完了したかのフラグ
$CmdOk = $False

do {
    try {

        # Some code here.
        # ---------------

        # 実行完了
        $CmdOk = $True
    }
    catch {
        # エラー(例外)の詳細を表示
        write-output "Exception Caught..."

        $ErrorMessage = $_.Exception.Message
        $StackTrace = $_.Exception.StackTrace
        Write-Output "Error Occurred: Message: $ErrorMessage, stack: $StackTrace."
        Write-Output "Retry attempts left: $NumberOfRetryAttempts"
        Write-Output "---------------------------------------------------------"

        # リトライ
        $NumberOfRetryAttempts--
        Start-Sleep -Seconds $RetryIntervalInSeconds
    }
} while (-not $CmdOk -and $NumberOfRetryAttempts -ge 0)

概要

try / catch のリトライ処理を制御するために 3 つの変数を使用しています。

  • $RetryIntervalInSeconds で、次の処理を開始するまで何秒の間隔を空けるのかを指定します。このパラメータは Start-Sleep 関数のために使われます。
  • $NumberOfRetryAttempts はリトライ処理を何回実行するかを表しています。
  • $CmdOk は終了判断のための真偽値で、実行したい処理が終了した場合にのみ $True となります。

そして、以下の箇所に目的のスクリプト コードを記述してください。

 # Some code here.
# ---------------

リトライ処理を組み込んだ Runbook の例


上のセクションで紹介したテンプレートを、実際に Runbook に組み込んだサンプルを作成しました。参考にしていただければと思います。

RetrySample

インポート方法

  1. Azure ポータルにログインし、Azure Automation アカウントの [Runbook] ブレードを開きます。
  2. [Runbook の追加] を押します。
  3. [既存の Runbook をインポートしています] から 上記ファイルをインポートしてください。

それでもダメな場合は?


上記で紹介したリトライ処理を組み込んでもエラーが発生し続けるという場合には、些細なことでも結構ですので、気兼ねなく Azure サポートまでお問合せください。
お問い合わせの際には、以下の情報もご提供いただけるとスムーズに調査を行うことができます。ご協力の程、宜しくお願い致します。

  1. ジョブ ID
  2. エラー内容
    上記の2つは、[Automation アカウント] ブレード >> アカウントの選択 >> [ジョブ] ブレード の画面で、ジョブを選択した状態から確認することが出来ます。
  3. Runbook 本体
    PowerShell Runbook のスクリプ トコード、グラフィカル Runbook のキャプチャなど

本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。