アレアレ

お役立ち情報、お悩み解決情報を発信!

Azure

AzureのWebアプリが落ちたら自動で再起動する方法

AzureのWebアプリが落ちたら自動で再起動する方法

今回は、マイクロソフトが運営するクラウドサービズMicrosoft Azure上で、Webアプリ(旧WebSites)を利用している人にお伝えしたいお役立ち情報です。

私は、AzureのWebアプリ上でWordpressのブログをいくつか運営しているのですが、たまに、Webアプリが落ちることがあるんですね。その目安として、Sサイズ1インスタンスのWebアプリに乗せたWordpressが、月間10万PVを超える規模のアクセスになると、月に5回くらいの頻度で落ちるようになる印象です。

その対応方法として、Azureの自動スケールを使う方法もあるのですが、そうするとサーバーの利用料が増えます。で、落ちたWebアプリは、Azureの管理ポータルから再起動してやれば、正常に戻るため、「落ちたら再起動」という運用でも何とか回るんですね。

こうすると多少ダウンタイムは発生してしまいますが、自動スケールによってサーバーの利用料が増えない点はメリットとなります。

出先や深夜に障害が起きた時の対応ができない

さて。Azureでは、Webアプリの運用状況を監視して、問題が起きたらメールで警告を通知してくれる「Azure Alert」という機能があるんですね。例えば、「Http Server Errorが直近の5分間に3回以上発生したら、メールで通知」ということができるわけです。

で、これまでは、私はこの機能を利用してWebアプリが落ちたかどうかをチェックしていました。そして、Azureから「Webアプリが落ちたよ」とメールで警告が来たら、Azureの管理ポータルにログインし、該当するWebアプリを手動で再起動、ということを行っていました。

ですが、この手動で再起動する方法だと、出先や深夜に障害が起きた時の対応ができないんですね。なので、この作業をAzure Automationを利用して自動化することにしました。

で、もともとAzure Alertには、「監視対象が問題となる条件を満たしたらメールを送る」という方法に加えて、Webhookという通知方法が用意されています。

azure alert webhookそして、このWebhookは、指定したURLに対して、問題が起きたらPostして通知してくれる仕組みです。なので、WebhookでPostされることをきっかけに、落ちたWebアプリを再起動するようなAzure Automationを作り、それをAzure AlertのWebhookから呼び出すように設定すれば、今回の目的が達成できることになります。

初めてAzure Automationを利用するための準備

というわけで、今回の問題は、「いかにしてAzure AutomationでWebアプリを再起動するか」ということに置き換えられます。その実現方法をご紹介すると。

まず、今回Azure Automationを利用するのが初めての人は、次の記事を参考に、Azure AD上にAzure Automationから利用するためのアカウントを作成してください。

Azure Automation でリソース管理を自動化するには

ここで作成するアカウントは、Azure Automationの「資格情報」として、利用することになります。簡単には、Azure Automationから、Azure上のリソースを操作するための特別なアカウントを用意している感じです。

で、このアカウントとは別に、Azure Automationの機能側でも、「Automationアカウント」というものを作ることになります。

azure automation accountAutomationアカウントを作ったら、このアカウントに対し、先ほど作成したAzure ADのアカウントを資格情報として登録します。「資産」→「資格情報」→「新しい資格情報」とクリックして行き、Azure ADに作成したアカウント情報を登録します。

new-assetちなみに「名前」の箇所は、自分で任意に決めるものです。で、この「名前」は、このあと作成する、Runbookで利用します。

以上で、初めてAzure Automationを利用するための準備が整いました。

Azure AutomationでWebアプリを再起動するRunbook

では、Automationアカウントに対して、Webアプリを再起動するRunbookを作成します。Runbookとは、PowerShellもしくはGUIでのワークフローで実装する、自動処理の定義のことです。

ここでは、「Runbookの種類」をPowerShellとするRunbookとして、そのWebアプリを再起動する処理を定義します。

add-new-runbook上の画像のように新しいRunbookを作成したら、そのコードとして、次のソースを利用します。ただ、ソース上の「資格情報で入力した名前」と「再起動したいWebアプリのサイト名」となっている箇所は、適宜自分の環境に合わせて変更してください。

$credentialAssetName = "資格情報で入力した名前"

try
{
    $myCredential = Get-AutomationPSCredential -Name $credentialAssetName
}
catch {
        Write-Error -Message $_.Exception
        throw $_.Exception
}

if(!$myCredential) {
        Throw "資格情報 '${credentialAssetName}'が見つかりません。"
}

$siteName = "再起動したいWebアプリのサイト名"

Add-AzureRmAccount -Credential $myCredential
Add-AzureAccount -Credential $myCredential

$website = Get-AzureWebsite -Name $siteName

if(!$website){
	Throw "Webアプリ '${siteName}' が見つかりません。"
}

Write-Output "${siteName} を再起動しています..."

Restart-AzureWebsite -Name $siteName

Write-Output "${siteName} の再起動が完了しました。"

Runbookのソースを登録したら、まずは、「テストウィンドウ」を利用して、テストを行ってみてください。うまく動作すれば、テスト結果が「完了」となり、「サイト名 の再起動が完了しました。」という出力結果が得られるはずです。

またテスト中は、実際にサイト名で指定したWebアプリに再起動がかかりますので、ご注意ください。テストがうまくいったら、Runbookを「発行」します。

で、発行したRunbookは、「Webhook」の設定をすることで、POSTから起動できるようになるんですね。具体的には、この設定すると、「https://s4events.azure-automation.net/webhooks?token=…」というPost用のURLが発行され、そこにPOSTをすることで、このRunbookが起動できるようになります。

つまり、Azure Alertの「Webhook」に、このURLを指定することで、Azure Alertで指定した条件をトリガーに、Webアプリの再起動ができるようになったわけです。

azure alert webhookその設定方法ですが、App ServiceのWebアプリの「ツール」から行えます。Webhookを設定したいWebアプリをApp Serviceの一覧から選んだら、「ツール」をクリックします。その「ツール」に「警告」という機能があるので、クリックします。

その「警告」で「アラートの追加」をクリックすると、警告を発生するための条件が指定できます。その条件を指定した上で、Webhookの入力欄に、上で作成したRunbookのURLを指定します。以上を保存して完了です。

以上の設定を行うと、アラートの発生条件を満たした際に、警告からWebhookのURLにPostが行われ、それによって、Webアプリを再起動するRunbookが起動される、という流れが自動化されます。

Return Top