Azureあの機能この機能:スケジューラ

こんにちは。日山(@hiiyan0402)です。

今回はAzureスケジューラを解説します。


Azure スケジューラって?

ざっくり言うと、
定期的に「HTTP/Sエンドポイント呼び出し」or「Azureキューストレージへのエンキュー」を行うためのサービス
です。

Microsoftの公式サイトでは以下のとおりに説明されています。
「定期的に繰り返される単純または複雑なスケジュールでのジョブの実行」
「Azure Scheduler を使用すると、HTTP/S エンドポイントの呼び出し、ストレージ キューへのメッセージの送信などの操作を任意のスケジュールで起動できます。Scheduler を使用して、Azure の内部および外部のサービスを信頼性の高い方法で呼び出すジョブをクラウドに作成します。これらのジョブをすぐに実行するか、定期的なスケジュールで実行するか、今後の特定の時点で実行するかを選択します。」

どんな時に使うの?

Webサイトやクラウドサービス(Workerロール)などのサービスに対して、定期的にジョブ実行を行わせる際に使用します。例えば、以下の用途が考えられます。

定時バッチの実現

定時バッチ実行を行うために使用します。まずキュー駆動で動作するWorkerロールを稼働させておきます。キュー駆動とは、常にキューを監視しておき、キューにメッセージがある場合にのみ動作する処理のことを指します。そして、スケジューラで定時に従ってキューをエンキューさせることで、Workerロールを定時で動作させます。

Webアプリケーション上での定期的な処理の実行

例えば、Webアプリケーションにキャッシュをクリアさせるためのエンドポイントを用意しておき、スケジューラで定期的に呼び出すことで、キャッシュを定期的にクリアさせる、など。

スケジューラ利用時の注意点

現状、実行に失敗した場合(HTTPリクエストが400/500番台)で合った場合に、メール等で通知させるなどの機能がないことに注意です。
そのため、呼び出し結果が失敗し続けていることを即座に検知する必要のない定時呼び出しで利用するか、別の方法で呼び出し失敗に検知/報告させる仕組みを用意する必要があります。

なので、Webサイトのヘルスチェックエンドポイント(※1)の定期呼び出しのために使用するのは全く適していません。(残念…)

(※1)ヘルスチェックエンドポイントとは、呼び出した場合、そのシステムと関連システムが正常に稼働していることを確認し、チェック結果を返すエンドポイントのことを指しています。
Azure CloudDesignPattern : Health Endpoint Monitoring Pattern
AWS CloudDesignPattern : Deep Health Check パターン

※Azureのアラート機能と組み合わせることでエラー検出&メール通知が実現できるかもしれないです(未検証ですが)

スケジュールジョブの作り方

スケジューラで定期的にエンドポイント呼び出し/エンキューを行う設定のことを「ジョブ」と呼びます。
そしてジョブのグループのことを「ジョブコレクション」と呼びます。
1つのサブスクリプションに対して、ジョブコレクションとジョブは複数個作成することができます。
ジョブを作成する場合、まずジョブコレクションを作成します。ジョブコレクションの名前とリージョンを指定します。
20140907_hiyama_01

ジョブコレクションを作成したら、次にジョブを作成します。ジョブの名称と、実行内容を入力します。
アクションの種類として「HTTP」「HTTPS」「ストレージキュー」が選択できます。
「HTTP」「HTTPS」ではエンドポイント呼び出しを行います。エンドポイントのURLとHTTPメソッド(GET/POST/PUT/DELETE)を指定します。
「ストレージキュー」ではエンキューを行います。対象となるストレージアカウント&キュー名を指定して、アクセスするためのSAS(Shared Access Signature : 共有アクセス署名)を指定し、そしてキューメッセージを指定します。SASはその場で生成することができます。生成すると2012/02/12~2016/3/7の期間で有効なSASが発行されますので、再来年まで大丈夫です。
20140907_hiyama_02

最後にスケジュール設定を行います。まず「一度だけのジョブ」か「定期的なジョブ」を指定します。
どちらの場合も、開始日時を指定することができます。
定期的なジョブの場合、繰り返し間隔と終了日を指定することができます。繰り返し単位は「分」「時間」「日」「週」「月」が選択可能で、「週」の場合は指定曜日を、「月」の場合は指定日/指定曜日/平日の○日目 を指定することができます。最大500日間隔の間隔が指定可能です。(※無料プランの場合、分間隔の指定はできません)
20140907_hiyama_03

これでジョブコレクションが作成されましたが、既定でプランが「標準」となっているので課金されます。課金は1時間単位で計算されますし、ジョブ実行がなければ課金されません。
プランが違うと「ジョブ実行の最小間隔」「ジョブの最大実行回数」「最大ジョブコレクション数」が異なってきます。無料プランだと最短で1時間単位の実行となり、最大3,600回しかジョブが実行できません。
20140907_hiyama_04

ジョブは作成後にも修正することができます。先程はできなかったのですが、エンドポイント呼び出しだとヘッダと基本認証の指定まですることができます。
20140907_hiyama_05

実行結果の確認

スケジュールジョブの実行結果はこんな感じで確認できます。
20140907_hiyama_06

またレスポンス結果など、詳細情報も確認可能です。
20140907_hiyama_07

キューにエンキューされるメッセージ

スケジュールジョブでエンキューされるメッセージは単純に指定したメッセージだけ、というわけではなく、以下の様なXMLとなっています。なので参照側でいちいちパースしないといけないです。

<?xml version="1.0" encoding="utf-16"?>
<StorageQueueMessage xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <ExecutionTag>cc953d4dbaecdcabcaa6a02eXXXXXXXX</ExecutionTag>
  <ClientRequestId>55f1cf9c-5188-474a-ba05-1d1cXXXXXXXX</ClientRequestId>
  <ExpectedExecutionTime>2014-09-07T02:32:59</ExpectedExecutionTime>
  <SchedulerJobId>SampleJob2</SchedulerJobId>
  <SchedulerJobCollectionId>SampleJobCollection</SchedulerJobCollectionId>
  <Region>Japan West</Region>
  <Message>365日24時間監視 Microsoft Azure のフルマネージドサービス cloud.config</Message>
</StorageQueueMessage>

まとめ

  • Azureスケジューラはサービスに対して定期的な処理をさせるために使用する
  • 特にWorkerロールでの定時バッチ実現の際に活用できる
  • また割りと柔軟なエンドポイント呼び出しが可能なので、Webアプリでの定期的な処理実行にも活用できる
  • スケジューラからサービスへの呼び出し結果が失敗した場合にアラートを出すような機能はないので注意
  • ジョブコレクション新規作成時に既定のプランが有料プランになっているので注意
  • エンキューされるメッセージがXML化されているので注意

今回も最後までご覧いただきありがとうございました!

TechTarget

クラウドエンジニア  日山 雅之による記事「Microsoft Azure スマート解説」がTechTarget Japanにて好評連載中です (全7回)