Microsoft Azure WebJobs SDK の 0.3.0-beta プレビューを発表
このポストは、6 月 18 日に投稿した Announcing the 0.3.0-beta preview of Microsoft Azure WebJobs SDK の翻訳です。
マイクロソフトは今回、Microsoft Azure WebJobs SDK プレビューの新しいバージョンをリリースしました。WebJobs SDK については Scott Hanselman 氏がこちら (英語) で紹介しています。以前のバージョンの詳細については、こちらの記事 (英語) を参照してください。
今回のリリースは alpha2 と同じ一般機能に、さらに新機能を搭載しています。
このリリースをダウンロードする
WebJobs SDK は NuGet ギャラリーからダウンロードできます。NuGet ギャラリーで NuGet Package Manager Console を使用して、パッケージをインストールまたは更新します。
Install-Package Microsoft.Azure.Jobs –Pre
Microsoft Azure Service Bus のトリガーを使用したい場合は、次のパッケージをインストールします。
Install-Package Microsoft.Azure.Jobs.ServiceBus -Pre
パッケージ名が alpha2 から変更されたため、今回、alpha2 から beta への更新を支援するリダイレクト パッケージをアップロードしています。
Update-Package Microsoft.WindowsAzure.Jobs –Pre
Update-Package Microsoft.WindowsAzure.Jobs.Host –Pre
WebJobs SDK とは
Microsoft Azure Web Sites の WebJob (英語) は、サービスやバックグラウンド タスクなどのプログラムを Web Sites で簡単に実行できるようにするための機能で、.exe、.cmd、.bat などの各種実行形式ファイルを Web Sites にアップロードしたり、実行したりすることができます。これらは WebJob として、トリガーで実行したり継続的に実行したりすることができます。WebJobs SDK なしでバックグラウンド タスクの接続や実行を行うとなると、複雑で膨大な量のプログラミングが必要になりますが、SDK が提供するフレームワークを使用すれば、最低限の量のコードで一般的なタスクを実行することが可能になります。
WebJobs SDK のバインディング システムとトリガー システムは、Service Bus だけでなく、Microsoft Azure Storage サービスの BLOB、Queue、および Table にも対応しています。バインディング システムでは、Microsoft Azure Storage オブジェクトを読み込んだり書き込んだりするコードを簡単に作成できます。トリガー システムは、Queue または BLOB が新しいデータを受信するたびに、コードに記述されている関数を呼び出します。
WebJobs SDK のシナリオ
Azure WebJobs SDK を使用すると容易に対応できる、代表的なシナリオをいくつか紹介します。
- 画像処理などの CPU 負荷の高い作業。
- 電子メールの送信など、バックグラウンド スレッドで実行する、処理に長い時間がかかるタスク。このような処理は、これまで ASP.NET では実行できませんでした。アプリケーションが一定時間以上アイドル状態になると IIS によってリサイクルされてしまうからです。Azure Web Sites に AlwaysOn (英語) が導入されたため、アプリケーションがアイドル状態でも Web Sites がリサイクルされるのを防げるようになりました。AlwaysOn (英語) を使用すると、Web Sites がスリープ状態に入らなくなるので、処理に長い時間がかかるタスクやサービスを WebJob や WebJobs SDK で実行できます。
- Queue の処理。Web のフロントエンド サービスとバックエンド サービスの通信には Queue を使用するのが一般的です。よくある Producer-Consumer パターンの 1 つです。
- RSS 情報集約。RSS フィードのリストを保持するサイトを所有している場合、バックグラウンド プロセスでフィードからすべての記事を取得することがあります。
- ファイルのメンテナンス。ログ ファイルの集約や整理など。
SDK の目的
- Azure Storage を使用してバックグラウンド処理を容易に行えるようにする手段を提供すること。
- アプリケーションで容易に Azure Storage を使用できるようにすること。SDK を利用すれば、ストレージからのデータの読み書きを行うコードを作成する必要はありません。
- 診断やログ出力用のコードの開発なしで使える、リッチな診断および監視機能を提供すること。
今回のプレビューで更新された点
Microsoft Azure Service Bus をサポート
WebJobs SDK は新たに Microsoft Azure Service Bus をサポートします。過去のプレビュー版では、Queue で関数をトリガーすることが可能でしたが、今回のプレビュー版では、Azure Service Bus の Queue および Topic を使用できます。
たとえば、次のコードでは WebJobs SDK を使用して Service Bus Queue の新しいメッセージに対して関数をトリガーし、別の Service Bus Queue にメッセージを書き込んでいます。ダッシュボードでこれらの関数を監視、実行、中止することが可能です。また、Azure Queues と同様、Service Bus に関するすべてのダッシュボード機能を利用できます。
“AzureJobsServiceBus” という connectionString を使用して ServiceBus 接続を指定できます。Service Bus の Queue および Topic の使用例については、サンプル サイト (英語) を参照してください。
class Program
{
static void Main(string[] args)
{
JobHost host = new JobHost();
host.RunAndBlock();
}
public static void TriggerOnSBQueue(
[ServiceBusTrigger("inputqueue")] string inputText,
[ServiceBus("outputqueue")] out string outputText)
{
outputText = inputText;
}
}
トリガーやバインディングの使用がより明示的に
SDK を利用すると、関数をトリガーしてメッセージを指定の型や CLR 型 (String、TextReader、TextWriter など) にバインドできます。過去のプレビュー版では、トリガーやバインディングの使用法は、関数のパラメーターに使用する属性によって規定されていました。属性の使用法があまり明確ではなかったため、混乱を避けるために属性の名前と使用法を変更し、トリガーやバインディングをより明示的に行うようにしました。
大まかな変更点は次のとおりです。
- トリガー式の QueueInput を QueueTrigger に変更。QueueOutput を Queue に変更。
旧バージョン
public static void OnQueue(
[QueueInput("input")] string message,
[QueueOutput("output")] out string newMessage)
{
newMessage = message;
}
新バージョン
public static void OnQueue(
[QueueTrigger("input")] string message,
[Queue("output")] out string newMessage)
{
newMessage = message;
}
- トリガー式の BlobInput を BlobTrigger に変更。BlobInput および BlobOutput を Blob に変更。
旧バージョン
public static void BlobToBlob(
[BlobInput("input/{name}")] TextReader input,
[BlobOutput("output/{name}")] out string output)
{
output = input.ReadToEnd();
}
新バージョン
public static void BlobToBlob(
[BlobTrigger("input/{name}")] TextReader input,
[Blob("output/{name}")] out string output)
{
output = input.ReadToEnd();
}
ブランディングの変更
Microsoft Azure へのブランディングの変更に合わせて、パッケージ名、アセンブリ名、名前空間を変更しています。アプリケーションで変更が必要なものは次のとおりです。
旧バージョン |
新バージョン |
Microsoft.WindowsAzure.Jobs.Host |
Microsoft.Azure.Jobs |
Microsoft.WindowsAzure.Jobs |
Microsoft.Azure.Jobs.Core |
関数の発見が容易に
WebJobs SDK による関数の検索方法をカスタマイズできるように、ITypeLocator と INameResolver を追加しました。次のようなシナリオが可能になります。
- QueueName が明示的に指定されていない関数の定義。QueueName は構成ソースから読み取り、その値を実行時に指定できます。
- 関数の検索を特定のクラスまたはアセンブリに限定。
- インデックス処理時の動的関数。実行時に関数の署名を定義できます。
Queue メッセージの dequeueCount へのアクセス
SDK によって簡単に Azure Queues を使用できるようになり、一般的な使用パターンのほとんどに対応できます。低レベルの Queue にアクセスしたい場合は、SDK を通じて、よく使用されるメッセージ プロパティのいくつかにアクセスできます。高度なシナリオでこういったプロパティが必要となることがあるかもしれません。下のサンプルでは、Queue メッセージの dequeueCount にアクセスできます。また、SDK では Azure Storage SDK Queue 型にバインドすることが可能になっています。
public static void PropertyBinding(
[QueueTrigger("inputqueue")] string inputText,
int dequeueCount)
{
// dequeueCount を使用し何らかの処理を実行
}
キャンセル トークンをサポート
関数で CancellationToken パラメーターを使用して、ホストからキャンセルのリクエストを受信できます。
WebJob シャットダウン通知をサポート
WebJob の正常なシャットダウン (graceful shutdown、英語) のサポートを追加しました。これにより、WebJob が停止する前に関数の実行を終了できます。SDK は WebJob がシャットダウンするタイミングをユーザーに通知することで、WebJob の正常なシャットダウンをサポートします。この情報は CancellationToken により関数に伝えられます。次の関数は、WebJob が停止すると CancellationToken を通じてキャンセルのリクエストを受信します。
public static void UseCancellationToken(
[QueueTrigger("inputqueue")] string inputText,
TextWriter log,
CancellationToken token)
{
// 長い時間がかかる関数をキャンセルすることが可能
while (!token.IsCancellationRequested)
{
Thread.Sleep(2000);
log.WriteLine("Not cancelled");
}
log.WriteLine("cancelled");
}
トリガーが host.Call() でサポートされるように
host.Call() を通じて呼び出された関数に対してトリガーを使用できます。
class Program
{
static void Main(string[] args)
{
JobHost host = new JobHost();
host.Call(typeof(Program).GetMethod("TriggerOnQueue"),
new { inputText="input" });
}
public static void TriggerOnQueue(
[QueueTrigger("inputqueue")] string inputText)
{
// Queue メッセージを処理
}
}
JobHost 構成
Azure ストレージ アカウントおよび Service Bus アカウントの既定の connectionString 名をオーバーライドする場合は、JobHostConfiguration で行うことができます。
static void Main(string[] args)
{
var _storageConn = ConfigurationManager
.ConnectionStrings["MyStorageConnection"].ConnectionString;
var _servicesBusConn = ConfigurationManager
.ConnectionStrings["MyServiceBusConnection"].ConnectionString;
JobHostConfiguration config = new JobHostConfiguration(_storageConn)
{
ServiceBusConnectionString = _servicesBusConn
};
JobHost host = new JobHost(config);
host.RunAndBlock();
}
Azure Storage の依存関係を更新
WebJobs SDK は Azure Storage 4.0.1 パッケージ (英語) に依存します。
SDK の既存の機能
alpha2 に引き続き今回のリリースでもサポートしている機能は次のとおりです。
Azure Storage
Azure Storage の BLOB、Queue、Table に対応しています。
トリガー
Queue または BLOB で新たな入力が検出されると、関数が実行されます。たとえば、次のコードでは、新しいメッセージが “inputqueue” という Queue に入ると ProcessQueue 関数をトリガーします。トリガーの詳細については、こちらの記事 (英語) を参照してください。
public static void ProcessQueue(
[QueueTrigger("inputqueue")] string input)
{
// Queue メッセージを処理
}
バインディング機能
この SDK ではバインディング機能がサポートされており、C# プリミティブ型と、BLOB、Table、Queue といった Azure Storage の間でモデル バインディングを行います。これにより、BLOB、Table、Queue からデータを読み書きする処理が簡単になり、Azure Storage からの読み書きを実行するコードを開発者が習得する必要がなくなります。
現在 Stream、TextReader/Writer、String のバインディングがサポートされています。カスタム型や Storage SDK のその他の型へのバインディングのサポートを追加することが可能です。
Azure Storage でのバインディング機能の動作の詳細については、BLOB (英語)、Queue (英語)、Table (英語) の各記事をお読みください。
ホスティング機能
JobHost は、プログラムに含まれる関数を認識している実行コンテナーです。JobHost オブジェクト (Microsoft.Azure.Jobs (英語) で入手可能) は、バインディングを読み取り、トリガーをリッスンし、関数を呼び出します。次の例では、JobHost のインスタンスを作成し RunAndBlock() を呼び出します。JobHost はこのホストで定義した関数に対するすべてのトリガーをリッスンします。
static void Main(string[] args)
{
JobHost host = new JobHost();
host.RunAndBlock();
}
WebJob の監視用ダッシュボード
WebJob (言語、型を問わない) の実行中は、リアルタイムの監視が可能です。これにより、WebJob の状態 (Running、Stopped、Successfully completed)、最終実行日時、実行ログを確認できます。次の画面で Web Sites で稼動するすべての WebJob を確認できます。
関数実行の詳細
“ImageProcessing” という WebJob の実行を監視する場合、プログラム内の関数呼び出しに関する次のような詳細情報を確認できます。
- この関数のパラメーター
- 関数の実行所要時間
- BLOB からの読み取りの所要時間と、読み書きのバイト数
この ImageProcessing WebJob のコードは次のとおりです。
public class ImageProcessing
{
static void Main(string[] args)
{
JobHost host = new JobHost();
host.RunAndBlock();
}
public static void Resize(
[BlobTrigger(@"images-input/{name}")] WebImage input,
[Blob(@"images2-output/{name}")] out WebImage output)
{
var width = 80;
var height = 80;
output = input.Resize(width, height);
}
public static void WaterMark(
[BlobTrigger(@"images2-output/{name}")] WebImage input,
[Blob(@"image2-output/{name}")] out WebImage output)
{
output = input.AddTextWatermark("WebJobs", fontSize: 6);
}
}
public class WebImageBinder : ICloudBlobStreamBinder<WebImage>
{
public WebImage ReadFromStream(System.IO.Stream input)
{
return new WebImage(input);
}
public void WriteToStream(WebImage result, System.IO.Stream output)
{
var bytes = result.GetBytes();
output.Write(bytes, 0, bytes.Length);
}
}
呼び出しと再実行
上の例では、Resize 関数が何らかの理由で正常に動作しない場合、新しい画像をアップロードして Resize 関数を再実行すると、実行チェーンがトリガーされ、Watermark 関数が呼び出されます。これは、関数どうしが複雑に組み合わされている場合に問題を診断してデバッグするのに便利です。また、ダッシュボードから関数を実行することも可能です。
関数の因果関係
上の例では、Resize 関数が BLOB への書き込みを行うと、WaterMark 関数がトリガーされます。ダッシュボードでは、この関数の因果関係が表示されます。多数の関数が複雑に絡み合い、新しい入力が検出されるたびにトリガーされるような場合に、この因果関係グラフが役立ちます。
BLOB の検索
[Search Blobs] をクリックし BLOB を検索すると、該当する BLOB で発生した事象に関する情報を確認できます。たとえば、ImageProcessing の場合は Resize 関数が実行されると、BLOB に対する書き込みが行われます。BLOB の検索の詳細については、こちらの記事 (英語) を参照してください。
サンプル
WebJobs SDK のサンプルは次の場所を参照してください。https://aspnet.codeplex.com/SourceControl/latest#Samples/AzureWebJobs/ReadMe.txt (英語)
- BLOB、Table、Queue、および Service Bus でのトリガーやバインディングの使用例をご覧いただけます。
- PhluffyShuffy というサンプルでは、画像処理を行う Web サイトでユーザーが写真をアップロードすると、BLOB ストレージのその画像を処理する関数がトリガーされます。
関連資料
- チュートリアル: Azure WebJobs SDK の使用を開始する (英語)
- Channel 9 のビデオ: Azure WebJobs SDK で仕事を便利に (英語)
- Scott Hanselman 氏による WebJob と SDK の紹介 (英語)
- Brady Gaster 氏による WebJobs SDK と ASP.NET を使用した Web サイト モニターの構築に関する記事 (英語)
- Azure の WebJob に関する参考資料 (英語)
SDK を使用した WebJob のデプロイ
WebJob ポータル ページからプログラムをアップロードしたくない場合は、FTP、Git または Web Deploy を使用できます。詳細については、「Azure WebJob をデプロイする方法 (英語)」や「WebJob を使用する .NET コンソール アプリを Azure に Git 経由でデプロイする (英語)」を参照してください。
作成した WebJob を自分の Web サイトにデプロイする場合は、次の Visual Studio 拡張機能 (英語) をご確認ください。
0.2.0-alpha2 から 0.3.0-beta への移行時の既知の問題
新しい API に合わせた名前空間の更新
旧バージョン |
新バージョン |
Microsoft.WindowsAzure.Jobs.Host |
Microsoft.Azure.Jobs |
Microsoft.WindowsAzure.Jobs |
Microsoft.Azure.Jobs.Core |
connectionString 名の更新
connectionStrings を設定する際、WebJob の app.config または Microsoft Azure Web Sites の “Configure Tab” で connectionString 名前を 0.3.0-beta と同じ名前に変更する必要があります。
旧バージョン |
新バージョン |
AzureJobsData |
AzureJobsStorage |
AzureJobsRuntime |
AzureJobsDashboard |
Table のバインディング
今回のリリースでは、Azure Table Storage の IDictionary<Tuple,Tuple> バインディングのサポートを廃止しています。Table へのバインドは CloudTableEntity を使用してください。両者の違いと Tables へのバインド方法は、次のとおりです。より詳細な使用例については、サンプル サイトの Table の使用法 (英語) を参照してください。
旧バージョン
public static void CountAndSplitInWords(
[QueueInput] string textInput,
[Table] IDictionary<Tuple<string, string>, WordCount> words)
{
}
新バージョン
public static void CountAndSplitInWords(
[QueueTrigger("textInput")] string textInput,
[Table("words")] CloudTable wordsTable)
{
}
ログ
ログを記録する場合は、Console.Write() を使用します。このログは WebJob の詳細情報としてダッシュボードに表示されます。
関数レベルのログを記録する場合は、あらゆる情報のログを BLOB ストレージに記録する TextWriter を使用してください。このログは関数の実行の詳細情報としてダッシュボードに表示されます。
public static void Logging(
[QueueTrigger("inputqueue")] string inputText,
TextWriter log)
{
log.WriteLine(inputText);
}
ダッシュボードは 0.3.0-beta でデプロイされた WebJob にのみ対応
WebJob を 0.2.0-alpha2 の SDK でデプロイしている場合は、ダッシュボードで WebJob のログを確認すると、“Host not running” という警告が表示されます。これは、今回のリリースにより最新バージョンのダッシュボードがすべての Azure Web Sites にデプロイされることが原因です。新しいダッシュボードはプロトコルが若干変更されており、0.2.0-alpha2 との互換性がありません。このエラーを回避するには 0.3.0-beta NuGet パッケージを使用するよう WebJob を更新し、WebJob を再度デプロイしてください。
フィードバックとヘルプについて
Microsoft Azure Web Sites の WebJob (英語) 機能と Microsoft Azure WebJobs SDK は現在プレビュー版です。今後の開発に活用するため、皆様からのフィードバックをお待ちしております。
チュートリアルに直接関係のない質問は、Azure フォーラム、ASP.NET フォーラム (英語) または StackOverflow.com (英語) までお寄せください。Twitter は #AzureWebJobs をお付けください。StackOverflow ではタグ "Azure-WebJobsSDK" をご使用ください。