Azure Web ジョブでバッチを実行するための簡易的な作業手順と、タイムアウトなどの注意点について記述します。
まず、Azure Web ジョブを配置するまでの基本的な流れは次の通りです。
- ストレージを作成する
- Web App を作成する
- Web ジョブを開発して配置する
これらについて、以下に詳細を書いていきます。
■ ストレージを作成する
Azure ポータルで、ストレージを 1 つ作成します。
厳密には、
- ログを格納するためのストレージ (AzureWebJobsDashboard)
- バッチが利用するストレージ (AzureWebJobsStorage)
の 2 種類なのですが、1 つのストレージに両方の役割を持たせてもかまいません。
また、後の手順で接続文字列を使うため、[キー] からコピーしておきます。
■ Web App を作成する
Azure のポータルで、Web App を作成します。
[アプリケーション設定] の [接続文字列] で、「AzureWebJobsDashboard」をキーとする設定を追加します。
これで、WebJobs ダッシュボードを利用できるようになります。

■ Web ジョブを開発して配置する
Visual Studio で、新規のプロジェクトを [Azure WebJob] のテンプレートから作成します。
App.config を開くと、接続文字列の設定が 2 種類あります。
この両方に、先ほどと同じ接続文字列を設定します。

以下、Web ジョブの開発の流れを簡単に書いておきます。
なお、今回作成したサンプルは TaskWebJob (GitHub) にあります。バッチ処理の題材として、素数を求めています。
(1) 手動またはスケジュールで開始する場合
詳細は Web ジョブ SDK を使用して Azure テーブル ストレージを使用する方法などを参照。
- メソッドに [NoAutomaticTrigger] を付ける
- JobHost.Call メソッドで、そのメソッドを呼び出す
- Azure WebJob として発行する
- 実行するには、ポータルの Web App の [Web ジョブ] で実行する
(2) キューをトリガーとして開始する場合
詳細は Web ジョブ SDK を使用して Azure キュー ストレージを操作する方法などを参照。
- メソッドの引数に [QueueTrigger] を付ける
- JobHost.RunAndBlock メソッドを使う
- Azure WebJob として発行する
- 実行するには、指定したキューにメッセージを追加する
以上で、Azure Web ジョブにバッチを配置することができました。
さて、バッチを実際に実行してみると、タイムアウトしてしまうことがあります。
以下では、タイムアウトについて書いていきます。
■ 有料プランの場合
既定では Web App の [アプリケーション設定] の [常時接続] がオフに設定されており、
Web App (というより Kudu?) が 20 分ほどでタイムアウトしてしまいます。
[常時接続] をオンに設定すれば解決します。
■ 無料プランの場合
無料プランでは、[常時接続] をオンにできません。
バッチの実行がタイムアウトする原因は 2 つあります。
- Web App のタイムアウト
- タイムアウトは 20 分ほどです。
- Kudu への要求が連続的にされていれば、タイムアウトは延長されます。
- CPU 時間の制限
- 実際の時間ではなく、CPU を使用した時間です。
- 例えば、連続して 3 分使うと、Web App が停止します。
したがって、WebJobs ダッシュボードなどを表示したままにして、
かつ CPU 使用率の低いバッチであれば実行可能ということになります。
そこで、例えば Thread.Sleep メソッドをコードに含めるという方法があります。
Thread.Sleep などでスレッドを中断しながら実行すると、CPU 利用率を激減させることができます。
CPU 時間の使用量は [クォータ] で見ることができます。

作成したサンプル
TaskWebJob (GitHub)
参照
Azure Web ジョブのリソース
Azure App Service に .NET Web ジョブを作成する
Web ジョブ SDK を使用して Azure キュー ストレージを操作する方法
Web ジョブ SDK を使用して Azure テーブル ストレージを使用する方法
Web ジョブでバックグラウンド タスクを実行する
Visual Studio を使用して Web ジョブを展開する
LINQ で素数を求める (C#)