チュートリアル: イベント ドリブンのバックグラウンド処理に Azure WebJobs SDK の使用を開始する
Azure App Service 用の Azure WebJobs SDK を使用して、Web アプリでバックグラウンド タスクやスケジュールされたタスクを実行したり、イベントに応答したりできるようにします。
Visual Studio 2022 を使用して、WebJobs SDK を使用して Azure Storage キュー メッセージに応答する .NET Core コンソール アプリを作成し、プロジェクトをローカルで実行し、最後に Azure にデプロイします。
このチュートリアルでは、次の内容を学習します。
- コンソール アプリを作成する
- 関数を追加する
- ローカルでテストする
- Azure にデプロイ
- Application Insights ログを有効にする
- 入力/出力バインドを追加する
前提条件
Visual Studio 2022 と Azure 開発ワークロード。 Visual Studio 2022 をインストールします。
アクティブなサブスクリプションが含まれる Azure アカウント。 無料でアカウントを作成できます。
コンソール アプリを作成する
このセクションでは、Visual Studio 2022 でプロジェクトを作成することから始めます。 次に、Azure 開発用のツール、コード発行、およびトリガーをリッスンして関数を呼び出す関数を追加します。 最後に、従来の監視ツールを無効にし、既定のフィルターを備えたコンソール プロバイダーを有効にするコンソール ログを設定します。
Note
この記事の手順は、.NET 6.0 で実行される .NET Core コンソール アプリを作成するために検証されています。
プロジェクトを作成する
Visual Studio で、 [ファイル]>[新規作成]>[プロジェクト] の順に選択します。
[新しいプロジェクトの作成] で、 [コンソール アプリケーション (C#)] を選択してから、 [次へ] を選択します。
[新しいプロジェクトの構成] で、プロジェクトに WebJobsSDKSample という名前を付け、 [次へ] を選択します。
[ターゲット フレームワーク] を選択し、 [作成] を選択します。 このチュートリアルは、.NET 6.0 を使用して検証されています。
WebJobs NuGet パッケージをインストールする
最新の WebJobs NuGet パッケージをインストールします。 このパッケージには、Microsoft.Azure.WebJobs (WebJobs SDK) が含まれています。これを使用すると、Azure AppService の WebJobs に関数コードを発行できます。
Microsoft.Azure.WebJobs.Extensions NuGet パッケージの最新の安定バージョン 4.x を入手します。
Visual Studio で、 [ツール]>[NuGet パッケージ マネージャー] にアクセスします。
[パッケージ マネージャー コンソール] を選択します。 NuGet のコマンドレットの一覧、ドキュメントへのリンク、および
PM>
エントリ ポイントが表示されます。次のコマンドで、
<4_X_VERSION>
を手順 1 で確認した現在のバージョン番号に置き換えます。Install-Package Microsoft.Azure.WebJobs.Extensions -version <4_X_VERSION>
[パッケージ マネージャー コンソール] で、このコマンドを実行します。 拡張機能の一覧が表示され、自動的にインストールされます。
ホストを作成する
ホストは関数のランタイム コンテナーであり、トリガーをリッスンし、関数を呼び出します。 以下の手順では、IHost
を実装するホストを作成します。これは、ASP.NET Core での汎用ホストです。
[Program.cs] タブを選択し、既存のコンテンツを削除して、これらの
using
ステートメントを追加します。using System.Threading.Tasks; using Microsoft.Extensions.Hosting;
また、Program.cs で次のコードを追加します。
namespace WebJobsSDKSample { class Program { static async Task Main() { var builder = new HostBuilder(); builder.ConfigureWebJobs(b => { b.AddAzureStorageCoreServices(); }); var host = builder.Build(); using (host) { await host.RunAsync(); } } } }
ASP.NET Core では、ホストの構成は HostBuilder
インスタンスでメソッドを呼び出すことによって設定します。 詳しくは、「.NET での汎用ホスト」をご覧ください。 ConfigureWebJobs
拡張メソッドでは、WebJobs ホストが初期化されます。 ConfigureWebJobs
で、Storage バインド拡張機能などの特定のバインド拡張機能を初期化し、それらの拡張機能のプロパティを設定します。
コンソール ログ記録の有効化
ASP.NET Core ログ フレームワークを使用するコンソール ログを設定します。 このフレームワーク (Microsoft.Extensions.Logging) には、さまざまな組み込みおよびサードパーティのログ プロバイダーと連携する API が含まれています。
Microsoft.Extensions.Logging
を含む、Microsoft.Extensions.Logging.Console
NuGet パッケージの最新の安定バージョンを取得します。次のコマンドで、
<6_X_VERSION>
を手順 1 で確認した現在のバージョン番号に置き換えます。 NuGet パッケージの種類ごとに、一意のバージョン番号が付いています。Install-Package Microsoft.Extensions.Logging.Console -version <6_X_VERSION>
[パッケージ マネージャー コンソール] で、現在のバージョン番号を入力し、コマンドを実行します。 拡張機能の一覧が表示され、自動的にインストールされます。
[Program.cs] タブで、この
using
ステートメントを追加します。using Microsoft.Extensions.Logging;
引き続き [Program.cs] で、 コマンドの前に
ConfigureLogging
メソッドをBuild
HostBuilder
に追加します。AddConsole
メソッドでは、構成にコンソールのログ記録が追加されます。builder.ConfigureLogging((context, b) => { b.AddConsole(); });
Main
メソッドは次のようになります。static async Task Main() { var builder = new HostBuilder(); builder.ConfigureWebJobs(b => { b.AddAzureStorageCoreServices(); }); builder.ConfigureLogging((context, b) => { b.AddConsole(); }); var host = builder.Build(); using (host) { await host.RunAsync(); } }
この追加により、これらの変更が行われます。
- ダッシュボード ログ記録を無効にします。 ダッシュボードはレガシ監視ツールであり、ダッシュボード ログ記録は高スループットの実稼働シナリオにはお勧めしません。
- 既定のフィルターを使用してコンソールのプロバイダーを追加します。
これで、Azure Storage キューへのメッセージ到着によってトリガーされる関数を追加することができます。
関数を追加する
関数とは、スケジュールに沿って実行されたり、イベントに基づいてトリガーされたり、あるいはオンデマンドで実行されたりするコードの単位です。 トリガーはサービス イベントをリッスンします。 WebJobs SDK のコンテキストでは、トリガーはデプロイ モードを指すわけではありません。 SDK を使用して作成されたイベントドリブンまたはスケジュールされた WebJobs は、"Always On" が有効になっている継続的な WebJobs として常にデプロイする必要があります。
このセクションでは、Azure Storage キュー内のメッセージによってトリガーされる関数を作成します。 まず、Azure Storage に接続するために、バインド拡張機能を追加する必要があります。
Storage バインディング拡張機能をインストールする
WebJobs SDK のバージョン 3 以降で Azure Storage サービスに接続するには、別の Storage バインド拡張機能パッケージをインストールする必要があります。
Note
5.x より、Microsoft.Azure.WebJobs.Extensions.Storage はストレージ サービスによって分割され、AddAzureStorage()
拡張メソッドがサービスの種類別に移行されています。
Microsoft.Azure.WebJobs.Extensions.Storage NuGet パッケージの最新の安定バージョンであるバージョン 5.x を取得します。
次のコマンドで、
<5_X_VERSION>
を手順 1 で確認した現在のバージョン番号に置き換えます。 NuGet パッケージの種類ごとに、一意のバージョン番号が付いています。Install-Package Microsoft.Azure.WebJobs.Extensions.Storage -Version <5_X_VERSION>
[パッケージ マネージャー コンソール] で、
PM>
エントリ ポイントで現在のバージョン番号を指定してコマンドを実行します。引き続き Program.cs の
ConfigureWebJobs
拡張メソッドで、(Build
コマンドの前の)HostBuilder
インスタンスにAddAzureStorageQueues
メソッドを追加して、Storage 拡張機能を初期化します。 この時点で、ConfigureWebJobs
メソッドはこのようになります。builder.ConfigureWebJobs(b => { b.AddAzureStorageCoreServices(); b.AddAzureStorageQueues(); });
builder
がインスタンス化されたら、Main
メソッドに次のコードを追加します。builder.UseEnvironment(EnvironmentName.Development);
開発モードで実行すると、ランタイムでメッセージを見つけて関数を呼び出すまでの時間を大幅に遅らせる可能性があるキュー ポーリング指数バックオフが減少します。 開発とテストが完了したら、このコード行を削除するか、
Production
に切り替える必要があります。Main
メソッドは次の例のようになります。static async Task Main() { var builder = new HostBuilder(); builder.UseEnvironment(EnvironmentName.Development); builder.ConfigureLogging((context, b) => { b.AddConsole(); }); builder.ConfigureWebJobs(b => { b.AddAzureStorageCoreServices(); b.AddAzureStorageQueues(); }); var host = builder.Build(); using (host) { await host.RunAsync(); } }
キューによってトリガーされる関数の作成
QueueTrigger
属性は、queue
と呼ばれる Azure Storage キューに新しいメッセージが書き込まれたときに、この関数を呼び出すようランタイムに通知します。 キュー メッセージの内容は、message
パラメーター内のメソッド コードに提供されます。 メソッドの本文では、トリガー データを処理します。 この例では、コードはメッセージをログに記録するだけです。
ソリューション エクスプローラーで、プロジェクトを右クリックして、 [追加]>[新しい項目] の順に選択し、 [クラス] を選択します。
新しい C# クラス ファイルに Functions.cs という名前を付けて、 [追加] を選択します。
Functions.cs で、生成されたテンプレートを次のコードに置き換えます。
using Microsoft.Azure.WebJobs; using Microsoft.Extensions.Logging; namespace WebJobsSDKSample { public class Functions { public static void ProcessQueueMessage([QueueTrigger("queue")] string message, ILogger logger) { logger.LogInformation(message); } } }
ランタイムがメソッドにアクセスして実行するためには、Functions クラスを
public static
としてマークする必要があります。 上記のコード サンプルでは、queue
という名前のキューにメッセージが追加されると、関数が実行され、message
文字列がログに書き込まれます。 監視対象のキューは、次に作成する既定の Azure Storage アカウントに含まれています。
message
パラメーターは文字列である必要はありません。 JSON オブジェクト、バイト配列、または CloudQueueMessage オブジェクトにバインドすることもできます。 キュー トリガーの使用方法に関するページをご覧ください。 バインドの種類 (キュー、BLOB、テーブルなど) ごとに、バインドできる異なる種類のパラメーター セットがあります。
Azure のストレージ アカウントの作成
ローカルで実行する Azure ストレージ エミュレーターには、WebJobs SDK に必要な機能がすべてあるわけではありません。 Azure でストレージ アカウントを作成し、それを使用するようにプロジェクトを構成します。
汎用 v2 ストレージ アカウントの作成方法については、Azure Storage アカウントの作成に関するページをご覧ください。
接続文字列を検索してコピーする
ストレージを構成するには、接続文字列が必要です。 次のステップのために、この接続文字列を保持します。
Azure portal で、自分のストレージ アカウントに移動し、 [設定] を選択します。
[設定] で [アクセス キー] を選択します。
[key1] の下の [接続文字列] には、 [クリップボードにコピー] アイコンを選択します。
ローカル環境で実行するようにストレージを構成する
WebJobs SDK では、Azure のアプリケーション設定内でストレージの接続文字列が検索されます。 ローカル環境で実行すると、ローカル構成ファイルまたは環境変数内でこの値が検索されます。
プロジェクトを右クリックし、 [追加]>、 [新しい項目] の順に選択し、 [JavaScript JSON 構成ファイル] を選択し、新しいファイルに appsettings.json という名前を付け、 [追加] を選択します。
新しいファイルで、次の例のように
AzureWebJobsStorage
フィールドを追加します。{ "AzureWebJobsStorage": "{storage connection string}" }
{storage connection string} を、先ほどコピーした接続文字列で置き換えます。
ソリューション エクスプローラーで appsettings.json ファイルを選択し、 [プロパティ] ウィンドウで [出力ディレクトリにコピー] アクションを [新しい場合はコピーする] に設定します。
このファイルには接続文字列シークレットが含まれているため、リモート コード リポジトリにこのファイルを保存しないでください。 プロジェクトを Azure に発行した後、Azure App Service のアプリに同じ接続文字列アプリ設定を追加できます。
ローカルでテストする
プロジェクトをローカルでビルドして実行し、関数をトリガーするメッセージ キューを作成します。
Azure portal で、ストレージ アカウントに移動し、[キュー] タブ (1) を選択します。 [+ キュー] (2) を選択し、キュー名 (3) として「queue」と入力します。 次に [OK] (4) を選択します。
新しいキューをクリックし、[メッセージの追加] を選択します。
[メッセージの追加] ダイアログで、メッセージ テキストとして「Hello World!」と入力し、[OK]を選択します。 これでキューにメッセージが入りました。
Ctrl キーを押しながら F5 キーを押してプロジェクトを実行します。
コンソールには、ランタイムで関数が検出されたことが表示されます。
ProcessQueueMessage
関数でQueueTrigger
属性を使用したので、WeJobs ランタイムはqueue
という名前のキューでメッセージをリッスンします。 このキューで新しいメッセージが見つかると、ランタイムはメッセージ文字列値を渡して関数を呼び出します。[キュー] ウィンドウに戻り、それを更新します。 ローカルで実行されている関数によって処理されたため、メッセージが消えます。
コンソール ウィンドウを閉じます。
ここで、WebJobs SDK プロジェクトを Azure に発行します。
Azure にデプロイ
デプロイ時に、関数を実行するアプリ サービス インスタンスを作成します。 .NET コンソール アプリを Azure の App Service に発行すると、WebJob として自動的に実行されます。 発行に関する詳細については、「Visual Studio を使用して Web ジョブを開発してデプロイする」を参照してください。
Azure リソースを作成する
ソリューション エクスプローラーで、プロジェクトを右クリックし、 [発行] を選択します。
[発行] ダイアログ ボックスの [対象] で [Azure] を選択してから、 [次へ] を選択します。
[特定のターゲット] で [Azure WebJobs] を選択してから、 [次へ] を選択します。
[App Service instances] (App Service インスタンス) の上で、[新しい Azure WebJob を作成する] のプラス (+) ボタンを選択します。
[App Service (Windows)] ダイアログ ボックスでは、次の表のホスティング設定を使用します。
設定 提案された値 Description 名前 グローバルに一意の名前 新しい関数アプリを一意に識別する名前。 サブスクリプション サブスクリプションの選択 使用する Azure サブスクリプション。 リソース グループ myResourceGroup 関数アプリを作成するリソース グループの名前。 新しいリソース グループを作成する場合は、 [新規] を選択します。 ホスティング プラン App Service プラン App Service プランは、アプリのホストとなる Web サーバー ファームの場所、サイズ、機能を規定します。 1 つの App Service プランを共有するように Web アプリを構成することで、複数のアプリをホストするときのコストを抑えることができます。 App Service プランでは、リージョン、インスタンス サイズ、スケール数、および SKU (Free、Shared、Basic、Standard、または Premium) を定義します。 [新規] を選択して、新しい App Service プランを作成します。 Free レベルと Basic レベルでは、サイトを継続的に実行する [Always On] オプションはサポートされていません。 [作成] を選択して、これらの設定で Azure に Web ジョブと関連リソースを作成し、プロジェクト コードをデプロイします。
[完了] を選択して [発行] ページに戻ります。
Always On を有効にする
継続的な WebJob の場合は、WebJobs が正常に実行されるように、サイトで Always On 設定を有効にする必要があります。 Always On を有効にしない場合、ランタイムは非アクティブな状態が数分間続くとアイドル状態になります。
[発行] ページで、 [ホスティング] の上にある 3 つの点を選択してホスティング プロファイル セクションのアクションを表示し、 [Azure portal で開きます] を選択します。
[設定] で、 [構成]>[全般設定] を選択し、 [Always On] を [オン] に設定します。次に、 [保存] と [続行] を選択し、サイトを再起動します。
プロジェクトの発行
Azure で Web アプリを作成したので、WebJobs プロジェクトを発行します。
[発行] ページの [ホスティング] で、[編集] ボタンを選択し、 [WebJob の種類] を
Continuous
に変更して、 [保存] を選択します。 これにより、メッセージがキューに追加されたときに WebJob が実行されるようになります。 トリガーされた WebJobs は、通常、手動の Webhook に対してのみ使用されます。[発行] ページの右上隅にある [発行] ボタンを選択します。 操作が完了すると、Azure で WebJob が実行されます。
ストレージ接続アプリ設定を作成する
appsettings.json 構成ファイルでローカルに使用したのと同じストレージ接続文字列設定を Azure で作成する必要があります。 これにより、接続文字列をより安全に格納することができます。また、次のことを行います。
[発行プロファイル] ページで、 [ホスティング] の上にある 3 つの点を選択してホスティング プロファイル セクションのアクションを表示し、 [Azure App Service の設定を管理する] を選択します。
[アプリケーション設定] で、 [+ 設定の追加] を選択します。
[新しいアプリ設定名] に「
AzureWebJobsStorage
」と入力し、 [OK] を選択します。[リモート] に、ローカル設定の接続文字列を貼り付け、 [OK] を選択します。
これで、Azure のアプリに接続文字列が設定されました。
Azure で関数をトリガーする
ローカルで実行していないことを確認します。 コンソール ウィンドウが開いたままの場合は閉じます。 そうしないと、作成するキュー メッセージが最初にローカル インスタンスによって処理される可能性があります。
Visual Studio の [キュー] ページで、前と同様にキューにメッセージを追加します。
[キュー] ページを更新すると、Azure で実行されている関数によって処理されたため、新しいメッセージが表示されなくなります。
Application Insights ログを有効にする
WebJob を Azure で実行する場合、コンソール出力を表示して関数の実行を監視することはできません。 WebJob を監視できるようにするには、プロジェクトを発行するときに、関連する Application Insights インスタンスを作成する必要があります。
Application Insights インスタンスを作成する
[発行プロファイル] ページで、 [ホスティング] の上にある 3 つの点を選択してホスティング プロファイル セクションのアクションを表示し、 [Azure portal で開きます] を選択します。
Web アプリの [設定] で、 [Application Insights] を選択し、 [Application Insights を有効にする] を選択します。
生成されたインスタンスのリソース名と場所を確認し、 [適用] を選択します。
[設定] で [構成] を選択し、新しい
APPINSIGHTS_INSTRUMENTATIONKEY
が作成されたことを確認します。 このキーは、WebJob インスタンスを Application Insights に接続するために使用されます。
Application Insights のログを利用するには、ログ コードも更新する必要があります。
Application Insights 拡張機能をインストールする
Microsoft.Azure.WebJobs.Logging.ApplicationInsights NuGet パッケージの最新の安定バージョンであるバージョン 3.x を取得します。
次のコマンドで、
<3_X_VERSION>
を手順 1 で確認した現在のバージョン番号に置き換えます。 NuGet パッケージの種類ごとに、一意のバージョン番号が付いています。Install-Package Microsoft.Azure.WebJobs.Logging.ApplicationInsights -Version <3_X_VERSION>
[パッケージ マネージャー コンソール] で、
PM>
エントリ ポイントで現在のバージョン番号を指定してコマンドを実行します。
Application Insights ログ プロバイダーを初期化する
Program.cs を開き、ConfigureLogging
で AddConsole
の呼び出しの後に次の初期化子を追加します。
// If the key exists in settings, use it to enable Application Insights.
string instrumentationKey = context.Configuration["APPINSIGHTS_INSTRUMENTATIONKEY"];
if (!string.IsNullOrEmpty(instrumentationKey))
{
b.AddApplicationInsightsWebJobs(o => o.InstrumentationKey = instrumentationKey);
}
Main
メソッド コードは次の例のようになります。
static async Task Main()
{
var builder = new HostBuilder();
builder.UseEnvironment(EnvironmentName.Development);
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddAzureStorage();
});
builder.ConfigureLogging((context, b) =>
{
b.AddConsole();
// If the key exists in settings, use it to enable Application Insights.
string instrumentationKey = context.Configuration["APPINSIGHTS_INSTRUMENTATIONKEY"];
if (!string.IsNullOrEmpty(instrumentationKey))
{
b.AddApplicationInsightsWebJobs(o => o.InstrumentationKey = instrumentationKey);
}
});
var host = builder.Build();
using (host)
{
await host.RunAsync();
}
}
これにより、既定のフィルタリングを使用して Application Insights ログ プロバイダーが初期化されます。 ローカルで実行しているときは、情報レベルとそれより高いレベルのログがすべて、コンソールと Application Insights の両方に出力されます。
プロジェクトを再発行し、この関数を再びトリガーします
ソリューション エクスプローラーで、プロジェクトを右クリックし、 [発行] を選択します。
「Hello App Insights!」をメッセージ テキストとして入力すること以外は、前に行ったときと同様に、Azure portal を使用してキュー メッセージを作成します。
[発行プロファイル] ページで、 [ホスティング] の上にある 3 つの点を選択してホスティング プロファイル セクションのアクションを表示し、 [Azure portal で開きます] を選択します。
Web アプリの [設定] で、 [Application Insights] を選択し、 [Application Insights データの表示] を選択します。
[検索] を選択し、 [See all data in the last 24 hours](過去 24 時間のすべてのデータを表示) を選択します。
「Hello App Insights!」メッセージが表示されない場合は、[定期的に更新] をクリックして数分待ちます。 Application Insights クライアントが処理するログをフラッシュするのに少し時間がかかるので、ログはすぐには表示されません。
入力/出力バインドを追加する
バインドを使用すると、データの読み取りと書き込みを行うコードが簡略化されます。 入力バインディングでは、データを読み取るコードを簡略化します。 出力バインディングでは、データを書き込むコードを簡略化します。
バインドの追加
入力バインディングでは、データを読み取るコードを簡略化します。 この例では、キュー メッセージは BLOB の名前であり、Azure Storage の BLOB の検索と読み取りに使用します。 次に、出力バインドを使用して、ファイルのコピーを同じコンテナーに書き込みます。
Functions.cs で、
using
を追加します。using System.IO;
ProcessQueueMessage
メソッドを次のコードに置き換えます。public static void ProcessQueueMessage( [QueueTrigger("queue")] string message, [Blob("container/{queueTrigger}", FileAccess.Read)] Stream myBlob, [Blob("container/copy-{queueTrigger}", FileAccess.Write)] Stream outputBlob, ILogger logger) { logger.LogInformation($"Blob name:{message} \n Size: {myBlob.Length} bytes"); myBlob.CopyTo(outputBlob); }
このコードでは、
queueTrigger
はバインディング式なので、実行時に別の値に解決されます。 実行時には、キュー メッセージの内容が含まれます。このコードでは、出力バインドを使用して、キュー メッセージによって識別されるファイルのコピーを作成します。 ファイルのコピーは先頭に copy- が付きます。
Program.cs の
ConfigureWebJobs
拡張メソッドで、(Build
コマンドの前の)HostBuilder
インスタンスにAddAzureStorageBlobs
メソッドを追加して、Storage 拡張機能を初期化します。 この時点で、ConfigureWebJobs
メソッドはこのようになります。builder.ConfigureWebJobs(b => { b.AddAzureStorageCoreServices(); b.AddAzureStorageQueues(); b.AddAzureStorageBlobs(); });
ストレージ アカウントで BLOB コンテナーを作成します。
a. Azure portal 内で、[データ ストレージ] の下の [コンテナー] タブに移動し、[+ コンテナー] を選択します
b. [新しいコンテナー] ダイアログで、コンテナー名として「container」を入力し、[作成] を選択します。
BLOB コンテナーに Program.cs ファイルをアップロードします (このファイルは、ここでは例として使用しています。任意のテキスト ファイルをアップロードし、そのファイルの名前でキュー メッセージを作成できます)。
a. 作成した新しいコンテナーを選択します
b. [アップロード] ボタンを選択します。
c. Program.cs を検索して選択し、 [OK] を選択します。
プロジェクトを再発行する
ソリューション エクスプローラーで、プロジェクトを右クリックし、 [発行] を選択します。
[発行] ダイアログで、現在のプロファイルが選択されていることを確認し、 [発行] を選択します。 発行の結果は [出力] ウィンドウに詳しく表示されます。
Program.cs をメッセージのテキストとして、以前に作成したキューにキュー メッセージを作成します。
ファイルのコピーである copy-Program.cs が BLOB コンテナーに表示されます。
次のステップ
このチュートリアルでは、WebJobs SDK 3.x プロジェクトを作成、実行、デプロイする方法について説明しました。