WebhookでRunbookを起動する時、任意の値を渡す
2019-09-05
azblob://2022/11/11/eyecatch/2019-09-05-pass-any-value-to-runbook-with-webhook-000.jpg

Azure Automation の Runbook をご存知でしょうか?
簡単に言うと、 PowerShell  スクリプト等を使用して処理の自動化ができるものです。
実行時にパラメータを指定するように構成することもできます。

作成した Runbook は Azure ポータルから実行することもできますが、Webhook を設定して外部から実行することも可能です。Webhook を指定する場合は、Webhook 設定で Runbook のパラメータをすべて固定値で指定しなければなりません。
つまり Webhook の実行側から任意の値を渡したいときは何か工夫が必要になります。

今回は Webhook の実行側から任意の値を渡す方法、具体的に言うと Webhook 実行時の HTTPヘッダーを読み取る方法を紹介します。

【注】
以降の内容は私が検証した実績のある PowerShell ワークフロー Runbook を想定して説明します。
適宜、下記の記事を参考にしていただけたらと思います。
https://docs.microsoft.com/ja-jp/azure/automation/automation-webhooks

謎のパラメータ、 WebhookData

Runbook のパラメータは基本的には好きな名前が付けられますが、WebhookData という名前の object 型のパラメータは特殊な動作をします。

WebhookData には、Webhook を呼び出すときに使用した POST 要求の内容が格納されます。
例えば RequestHeader プロパティにはリクエストヘッダ―が入ります。
POST要求のリクエスト内容が入る箱なので、例えば Runbook のテストウィンドウから実行しても値は入りません。

これを使えば、POST要求のリクエストに任意の値を含めれば Runbook から読み取れそうだと思いませんか?
参考ドキュメントには書かれていますが、改めてやってみましょう。

実装例

Automation アカウントを作成し、Runbook の作成で PowerShell ワークフローを作成してください。
今回は Runbook 名を test としてみました。
作成した Runbook を編集し、下記の内容を記載してください。

workflow test
{
    param(
        [object]$WebhookData
    )

    Write-Output "Start"
    Write-Output $WebhookData.RequestHeader.message
    Write-Output "End"
}

謎のパラメータ WebhookData に入っているPOSTリクエストの内容のうち、リクエストヘッダーに含まれる message の値を出力する単純な処理です。

編集が完了し内容を「保存」したら、「公開」することをお忘れなく。
未公開の Runbook は実行できません(Runbook 更新時に何度かハマりました・・・)

続いて Webhook の作成を実施します。
URLのコピーを忘れずに実施しましょう。

テスト

Runbook の準備ができたので、さっそく挙動をテストしてみましょう。
Webhook をPOSTでキックすれば良いので、 curlInvoke-WebRequest を使って呼び出せば良いですね。
Invoke-WebRequest を使った場合は下記のようになります。ローカル PC の PowerShell 等で実行しましょう。
token= の右側は、先ほどコピーした Webhook の URL に合わせてください

Invoke-WebRequest -Uri https://s4events.azure-automation.net/webhooks?token=xxxx -Method POST -Headers @{ 'message' = 'test message' }

Webhook の URL を POST要求 で叩いて、ヘッダーにメッセージを入れています。
実行完了したら、Runbook のジョブの出力ウィンドウを見てみましょう。

おお~、任意の値が渡せましたね!
ちなみに入力ウィンドウを見ると、謎のパラメータの値も確認できます。