Visual Studio には、C# クラス ライブラリ関数を開発、テスト、および Azure にデプロイする方法が用意されています。 このエクスペリエンスが Azure Functions を初めて使用する場合は、 Azure Functions の概要を参照してください。
すぐに始めるには、Visual Studio での関数のクイックスタートを最後まで行うことをお勧めします。
この記事では、Visual Studio を使用して C# クラス ライブラリ関数を開発し、Azure に発行する方法について詳しく説明します。 C# クラス ライブラリ関数を開発するための 2 つのモデルがあります。 分離ワーカー モデル と インプロセス モデルです。
この記事は分離型ワーカーモデルバージョンをお読みいただいています。 記事の上部にある任意のモデルを選択できます。
この記事のインプロセス モデル バージョンをお読みください。 記事の上部にある任意のモデルを選択できます。
重要
インプロセス モデルのサポートは、2026 年 11 月 10 日に終了します。 分離された worker モデルにアプリを移行することをお勧めします。
特に明記されていない限り、ここで示す手順と例は Visual Studio 2022 のものです。 Visual Studio 2022 リリースの詳細については、 リリース ノート または プレビューリリース ノートを参照してください。
前提条件
Azure の開発ワークロードを含む Visual Studio 2022。
Azure Storage アカウントなど、他の必要なリソースは、発行プロセス中にサブスクリプションに作成されます。
-
Azure アカウントをお持ちでない場合は、開始する前に無料アカウントを作成してください。
Azure Functions プロジェクトを作成する
Visual Studio の Azure Functions プロジェクト テンプレートを使用すると、Azure の関数アプリに発行できる C# クラス ライブラリ プロジェクトを作成できます。 関数アプリを使用すると、リソースの管理、デプロイ、スケーリング、および共有を容易にするための論理ユニットとして関数をグループ化できます。
Visual Studio メニューで、[ファイル]>[新規]>[プロジェクト] を選択します。
[ 新しいプロジェクトの作成 ] ダイアログで、検索ボックスに 関数 を入力し、 Azure Functions テンプレートを選択して、[ 次へ] を選択します。
[ 新しいプロジェクトの構成 ] ダイアログで、[ プロジェクト名] にプロジェクトの名前を入力し、[ 次へ] を選択します。 関数アプリ名は、C# 名前空間として有効である必要があります。そのため、アンダースコア、ハイフン、その他の英数字以外の文字は使用しないでください。
[ 追加情報 ] ダイアログで、次の表に示すアクションを実行します。
設定 アクション 説明 関数ワーカー [.NET 8.0 Isolated (Long Term Support)]\(.NET 8.0 分離 (長期サポート)\) を選択します。 Visual Studio は、 分離されたワーカー プロセスで実行される関数プロジェクトを作成します。 分離ワーカー プロセスでは、長期サポート (LTS) を提供しない他のバージョンの .NET および .NET Framework もサポートされます。 詳細については、「Azure Functions ランタイム バージョンをターゲットにする方法」をご覧ください。 Function [Http トリガー] を選択します。 Visual Studio は、HTTP 要求によってトリガーされる関数を作成します。 ランタイム ストレージ アカウントに Azurite を使用する (AzureWebJobsStorage) このチェック ボックスをオンにします。 Azure の関数アプリにはストレージ アカウントが必要であるため、プロジェクトを Azure に発行する際に割り当てられるか、作成されます。 HTTP トリガーでは、ストレージ アカウントの接続文字列は使用されません。 その他のすべてのトリガーの種類には、有効なストレージ アカウント接続文字列が必要です。 承認レベル [ 匿名] を選択します。 この承認設定を使用すると、任意のクライアントがキーを指定せずに作成された関数をトリガーできます。 この構成により、新しい関数を簡単にテストできます。 詳細については、「認可レベル」を参照してください。 設定 アクション 説明 関数ワーカー .NET 8.0 インプロセス (長期サポート) を選択します。 Visual Studio では、Functions ランタイムのバージョン 4.x を使用してインプロセスで実行される関数プロジェクトが作成されます。 詳細については、「Azure Functions ランタイム バージョンをターゲットにする方法」をご覧ください。 Function [Http トリガー] を選択します。 Visual Studio は、HTTP 要求によってトリガーされる関数を作成します。 ランタイム ストレージ アカウントに Azurite を使用する (AzureWebJobsStorage) このチェック ボックスをオンにします。 Azure の関数アプリにはストレージ アカウントが必要であるため、プロジェクトを Azure に発行する際に割り当てられるか、作成されます。 HTTP トリガーでは、ストレージ アカウントの接続文字列は使用されません。 その他のすべてのトリガーの種類には、有効なストレージ アカウント接続文字列が必要です。 承認レベル 匿名の選択 この承認設定を使用すると、任意のクライアントがキーを指定せずに作成された関数をトリガーできます。 この構成により、新しい関数を簡単にテストできます。 詳細については、「認可レベル」を参照してください。 [承認レベル] を [匿名] に設定していることを確認します。 関数 の既定のレベルを選択した場合は、関数エンドポイントにアクセスするための要求で 関数キー を提示する必要があります。
[作成] を選択して、関数プロジェクトと HTTP トリガー関数を作成します。
Functions プロジェクトを作成すると、プロジェクト テンプレートによって C# プロジェクトが作成され、 Microsoft.Azure.Functions.Worker
がインストールされ、NuGet パッケージが Microsoft.Azure.Functions.Worker.Sdk
され、ターゲット フレームワークが設定されます。
Functions プロジェクトを作成すると、プロジェクト テンプレートによって C# プロジェクトが作成され、 Microsoft.NET.Sdk.Functions
NuGet パッケージがインストールされ、ターゲット フレームワークが設定されます。
新しいプロジェクトには次のファイルが含まれます。
host.json: このファイルは、Functions ホストを構成するための方法を提供します。 これらの設定は、ローカルでの実行時と Azure での実行時の両方に適用されます。 詳細については、host.json reference のリファレンスを参照してください。
local.settings.json: このファイルは、関数をローカルで実行するときに使用する設定を保持します。 これらの設定は、アプリが Azure で実行されるときに使用されません。 詳細については、「 アプリ設定をローカルで操作する」を参照してください。
重要
local.settings.json ファイルにはシークレットを含めることができるため、プロジェクト ソース管理から除外する必要があります。 このファイルの [プロパティ ] ダイアログで、[ 出力ディレクトリにコピー ] 設定が [新しい場合はコピー] に設定されていることを確認します。
詳細については、分離ワーカー ガイドの プロジェクト構造 を参照してください。
詳細については、「関数クラス ライブラリ プロジェクト」を参照してください。
ローカルでアプリの設定を操作する
関数アプリが Azure で実行されると、関数に必要な設定が アプリ設定に暗号化されて格納されます。 ローカル開発時に、これらの設定は代わりにlocal.settings.jsonファイルのValues
コレクションに追加されます。
local.settings.json ファイルには、ローカル開発ツールで使用される設定も格納されます。
プロジェクトの Values
の コレクション内の項目は、Azure の関数アプリのアプリケーション設定の項目をミラー化するためのものです。
Visual Studio では、プロジェクトを発行するときに 、local.settings.json の設定は自動的にアップロードされません。 これらの設定が Azure の関数アプリにも確実に存在するようにするには、プロジェクトを発行した後にそれらをアップロードします。 詳細については、「Function App の設定」を参照してください。
ConnectionStrings
コレクション内の値は発行されません。
コードを使用して、関数アプリの設定値を環境変数として読み取ることもできます。 詳細については、「環境変数」を参照してください。
ローカル開発用のプロジェクトを構成する
Functions ランタイムは、ストレージ アカウントを内部的に使用します。 開発中は、この内部アカウントに対して有効なストレージ アカウントを使用することも、 Azurite エミュレーターを使用することもできます。
HTTP および webhook 以外のすべてのトリガーの種類について、Values.AzureWebJobsStorage
キーの値を設定する必要があります。
- ストレージ アカウントの場合は、ストレージ アカウントの接続文字列に値を設定します。
- エミュレーターの場合は、値を
UseDevelopmentStorage=true
に設定します。
エミュレーターを使用する場合は、デプロイの前に、この設定を実際のストレージ アカウント接続文字列に変更します。 詳細については、ローカル ストレージ エミュレーターに関するページを参照してください。
ストレージ アカウントの接続文字列を設定するには、次の手順を実行します。
Azure portal にサインインし、ストレージ アカウントに移動します。
セキュリティ + ネットワーク>アクセス キーを選択します。 key1 で、接続文字列の値をコピーします。
Visual Studio プロジェクトで、 local.settings.json ファイルを開きます。
AzureWebJobsStorage
キーの値をコピーした接続文字列に設定します。前の手順を繰り返し、関数に必要なその他のすべての接続について、
Values
配列に一意のキーを追加します。
プロジェクトに関数を追加する
C# クラス ライブラリ関数では、関数が使用するバインドは、コード内の属性を適用することによって定義されます。 提供されているテンプレートから関数トリガーを作成する場合は、トリガー属性が適用されます。
[ソリューション エクスプローラー] で、プロジェクト ノードを右クリックして [追加]>[新しい Azure 関数] を選びます。
[ 新しい項目の追加 ] ダイアログで、[ Azure 関数] を選択し、[ 追加] を選択します。
トリガーを選択し、必要なバインド プロパティを設定します。 ストレージ サービス トリガーを選択し、接続を構成する場合は、トリガー接続を構成するためのチェック ボックスをオンにします。 次の例は、Queue Storage トリガー関数を作成するための設定を示しています。
[] を選択し、[] を追加します。 前の手順でストレージ接続を構成するためのチェック ボックスをオンにすると、[ 依存関係への接続 ] ページが表示されます。 Azurite ストレージ エミュレーターまたは Azure Storage を選択し、[ 次へ] を選択します。
- Azurite ストレージ エミュレーターを選択すると、 ストレージ Azurite エミュレーターへの接続 ページが表示されます。 次の手順を実行します。
- [次へ] を選択します。
- [ 変更の概要 ] ページで、[ 完了] を選択します。 Visual Studio によって依存関係が構成され、トリガー クラスが作成されます。
-
Azure Storage を選択すると、[Azure Storage への接続] ページが表示されます。 次の手順を実行します。
- ストレージ アカウントを選択し、[ 次へ] を選択します。 Visual Studio は、Azure アカウントへの接続とエンドポイントの取得を試みます。
- [次へ] を選択します。
- [ 変更の概要 ] ページで、[ 完了] を選択します。 Visual Studio によって依存関係が構成され、トリガー クラスが作成されます。
このトリガーの例では、
QueueStorage
という名前のキーを使うストレージ接続に対するアプリケーション設定を使います。 このキーは、 local.settings.json ファイルに格納され、Azurite エミュレーターまたはストレージ アカウントを参照します。- Azurite ストレージ エミュレーターを選択すると、 ストレージ Azurite エミュレーターへの接続 ページが表示されます。 次の手順を実行します。
新しく追加されたクラスを確認します。 たとえば、次の C# クラスは、基本的な Queue Storage トリガー関数を表します。
Run()
メソッドは、Function
で属性付けされます。 この属性は、メソッドが関数のエントリ ポイントであることを示します。using System; using Azure.Storage.Queues.Models; using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Logging; namespace Company.Function; public class QueueTriggerCSharp { private readonly ILogger<QueueTriggerCSharp> _logger; public QueueTriggerCSharp(ILogger<QueueTriggerCSharp> logger) { _logger = logger; } [Function(nameof(QueueTriggerCSharp))] public void Run([QueueTrigger("PathValue", Connection = "ConnectionValue")] QueueMessage message) { _logger.LogInformation("C# Queue trigger function processed: {messageText}", message.MessageText); } }
静的
Run()
メソッドは、FunctionName
で属性付けされます。 この属性は、メソッドが関数のエントリ ポイントであることを示します。using System; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Host; using Microsoft.Extensions.Logging; namespace Company.Function { public class QueueTriggerCSharp { [FunctionName("QueueTriggerCSharp")] public void Run([QueueTrigger("PathValue", Connection = "ConnectionValue")]string myQueueItem, ILogger log) { log.LogInformation($"C# Queue trigger function processed: {myQueueItem}"); } } }
バインド固有の属性は、エントリ ポイント メソッドに指定された各バインド パラメーターに適用されます。 属性ではパラメーターとしてバインド情報を取ります。
前のコードでは、最初のパラメーターには、Queue Storage トリガー関数を示す QueueTrigger
属性が適用されています。 キュー名および接続文字列の設定名は、パラメーターとして QueueTrigger
属性に渡されます。 クラスで次の手順を実行します。
- キュー名パラメーターは、前の手順でトリガーを作成するために使用したキューの名前 (
myqueue-items
など) と一致する必要があります。 - 接続文字列の設定名は、前の手順でトリガーを作成するために使用した名前 (
QueueStorage
など) と一致する必要があります。
詳細については、 Azure Functions の Azure Queue Storage トリガーに関するページを参照してください。
前の手順を使用して、関数アプリ プロジェクトに関数を追加します。 プロジェクト内の各関数で異なるトリガーを使用できますが、1 つの関数には 1 つのトリガーのみを使用する必要があります。 詳細については、「 Azure Functions のトリガーとバインド」を参照してください。
バインドの追加
トリガーと同じように、入力バインドと出力バインドも、バインド属性として関数に追加されます。 関数にバインドを追加するには、次の手順を実行します。
プロジェクトをローカル開発用に構成していることを確認します。
特定のバインドごとに適切な NuGet 拡張機能パッケージを追加します。 バインド固有の NuGet パッケージの要件については、バインディングのリファレンス記事を参照してください。 たとえば、Azure Event Hubs トリガーのパッケージ要件については、 Azure Functions の Azure Event Hubs トリガーとバインドに関するページを参照してください。
パッケージ マネージャー コンソールで次のコマンドを使用して、特定のパッケージをインストールします。
Install-Package Microsoft.Azure.Functions.Worker.Extensions.<BINDING_TYPE> -Version <TARGET_VERSION>
Install-Package Microsoft.Azure.WebJobs.Extensions.<BINDING_TYPE> -Version <TARGET_VERSION>
このコードでは、
<BINDING_TYPE>
をバインド拡張機能の特定の名前に置き換え、<TARGET_VERSION>
を4.0.0
などの特定のバージョンのパッケージに置き換えます。 有効なバージョンは、NuGet.org の個々のパッケージ ページに記載されています。バインドが必要なアプリ設定がある場合は、
Values
の コレクションに追加します。この関数では、ローカルで実行するときにこれらの値を使用します。 関数が Azure の関数アプリ で実行される場合は、関数アプリの設定が使用されます。 Visual Studio を使うと、簡単にローカル設定を Azure に発行できます。
適切なバインド属性をメソッド シグネチャに追加します。 次のコードでは、キュー メッセージによって
Run
関数がトリガーされます。 次に、出力バインドによって、同じテキストを持つ新しいキュー メッセージが別のキューに作成されます。public class QueueTrigger { private readonly ILogger _logger; public QueueTrigger(ILoggerFactory loggerFactory) { _logger = loggerFactory.CreateLogger<QueueTrigger>(); } [Function("CopyQueueMessage")] [QueueOutput("myqueue-items-destination", Connection = "QueueStorage")] public string Run([QueueTrigger("myqueue-items-source", Connection = "QueueStorage")] string myQueueItem) { _logger.LogInformation($"C# Queue trigger function processed: {myQueueItem}"); return myQueueItem; } }
QueueOutput
属性は、メソッドでのバインドを定義します。 複数の出力バインドの場合は、代わりに、返されるオブジェクトの文字列プロパティにこの属性を配置します。 詳しくは、「複数の出力バインディング」をご覧ください。public static class SimpleExampleWithOutput { [FunctionName("CopyQueueMessage")] public static void Run( [QueueTrigger("myqueue-items-source", Connection = "QueueStorage")] string myQueueItem, [Queue("myqueue-items-destination", Connection = "QueueStorage")] out string myQueueItemCopy, ILogger log) { log.LogInformation($"CopyQueueMessage function processed: {myQueueItem}"); myQueueItemCopy = myQueueItem; } }
Queue
パラメーターのout
属性は、出力バインディングを定義します。Queue Storage への接続は、
QueueStorage
設定から取得されます。 詳しくは、特定のバインドの参照記事をご覧ください。
Functions でサポートされるバインドを網羅した一覧については、「サポートされるバインディング」を参照してください。 このシナリオのより完全な例については、「 Visual Studio を使用して Azure Storage に関数を接続する」を参照してください。
関数をローカルで実行する
Azure Functions Core Tools を使用して、ローカル開発コンピューターで Functions プロジェクトを実行できます。
F5 キーを押して Functions プロジェクトをデバッグすると、ローカルの Functions ホスト (func.exe
) がローカル ポート (通常は 7071) でリッスンを開始します。 呼び出し可能な関数エンドポイントが出力に書き込まれるので、それらのエンドポイントを関数のテストに使用できます。 詳細については、「 Core Tools を使用して Azure Functions をローカルに開発する」を参照してください。 Visual Studio から初めて関数を起動すると、これらのツールをインストールするよう求めるメッセージが表示されます。
重要
Core Tools のバージョン 4.0.6517 以降、インプロセス モデル プロジェクトでは、Microsoft.NET.Sdk.Functions
のバージョン 4.5.0 以降を参照する必要があります。 以前のバージョンを使用している場合は、 func start
コマンドによってエラーが生成されます。
Visual Studio でデバッグ モードで関数を開始するには、次の手順を実行します。
F5 キーを押します。 メッセージが表示されたら、Visual Studio から Azure Functions Core Tools をダウンロードしてインストールする要求を受け入れます。 ツールが HTTP 要求を処理できるように、ファイアウォール例外を有効にする必要がある場合もあります。
プロジェクトの実行時に、デプロイされた関数をテストするのと同じ方法でコードをテストします。
Visual Studio をデバッグ モードで実行すると、想定どおりにブレークポイントにヒットします。
Visual Studio を使用するより詳細なテスト シナリオについては、この記事の後半の 「テスト関数」を参照してください。
Azure に発行する
Functions プロジェクトを Azure に発行すると、Visual Studio は zip デプロイ を使用してプロジェクト ファイルをデプロイします。 可能な場合は、[ パッケージ ファイルから実行 ] を選択して、プロジェクトが配置 (.zip) パッケージで実行されるようにする必要もあります。 詳しくは、「Azure でパッケージ ファイルから関数を実行する」をご覧ください。
Web 配置 (msdeploy
) を使用して Functions にデプロイしないでください。
Azure の関数アプリにプロジェクトを発行するには、次の手順に従います。
ソリューション エクスプローラーで、プロジェクトを右クリックし、[発行] を選択します。
[ 発行 ] ページで、次の選択を行います。
- [ターゲット] で [Azure] を選択し、[次へ] を選択します。
- [特定のターゲット] で、[Azure Function App] を選択し、[次へ] を選択します。
- Functions インスタンスで、[新規作成] を選択します。
次の表に示されている値を使用して、新しいインスタンスを作成します。
設定 値 説明 名前 グローバルに一意の名前 名前は、新しい関数アプリを一意に識別する必要があります。 推奨される名前をそのまま使用するか、新しい名前を入力します。 有効な文字は、 a-z
、0-9
、および-
です。サブスクリプション名 サブスクリプションの名前 関数アプリは、Azure サブスクリプションに作成されます。 既定のサブスクリプションをそのまま使用するか、一覧から別のサブスクリプションを選択します。 リソース グループ リソース グループの名前 関数アプリはリソース グループに作成されます。 [新規作成] を選択して、新しいリソース グループを作成します。 一覧から既存のリソース グループを選択することもできます。 プランの種類 Flex Consumption Flex Consumption プランで実行されている関数アプリにプロジェクトを発行する場合、関数アプリの実行に対してのみ支払う場合があります。 その他のホスティング プランでは、コストが高くなる可能性があります。 重要:
Flex 従量課金プランを作成するときは、まず App Service プラン を選択してから 、Flex Consumption を再選択してダイアログの問題をクリアする必要があります。オペレーティング システム リナックス Flex 従量課金プランには現在、Linux が必要です。 場所 アプリ サービスの場所 Flex 従量課金プランでサポートされている Azure リージョン内の場所を選択します。 サポートされていないリージョンが選択されている場合、[ 作成 ] ボタンは淡色表示されます。 インスタンス メモリ サイズ 2048 アプリが実行される 仮想マシン インスタンスのメモリ サイズ は、Flex 従量課金プランに固有です。 Azure Storage 汎用ストレージ アカウント Functions ランタイムにはストレージ アカウントが必要です。 [新規] を選択して汎用ストレージ アカウントを構成します。 ストレージ アカウントの要件を満たす既存のアカウントを使用することもできます。 Application Insights Application Insights のインスタンス 関数アプリの Application Insights 統合を有効にする必要があります。 新規または既存の Log Analytics ワークスペースで、[新規作成] を選択して新しいインスタンスを作成します。 既存のインスタンスを使用することもできます。 [作成] を選択して、関数アプリとその関連リソースを Azure で作成します。 リソース作成の状態はウィンドウの左下に表示されます。
完了 を選択します。 [ 発行プロファイルの作成の進行状況 ] ウィンドウが表示されます。 プロファイルが作成されたら、[ 閉じる] を選択します。
[発行プロファイル] ページで、[ 発行 ] を選択して、プロジェクト ファイルを含むパッケージを Azure の新しい関数アプリにデプロイします。
デプロイが完了すると、Azure の関数アプリのルート URL が発行プロファイル ページに表示されます。
発行プロファイル ページで、[ ホスティング ] セクションに移動します。 省略記号 (...) を選択し、[ Azure portal で開く] を選択します。 新しい関数アプリの Azure リソースが Azure portal で開きます。
Function App の設定
Visual Studio では、プロジェクトの発行時にアプリ設定が自動的にアップロードされることはありません。 local.settings.json ファイルに設定を追加する場合は、Azure の関数アプリにも設定を追加する必要があります。
必要な設定を Azure の関数アプリにアップロードする最も簡単な方法は、Visual Studio でそれらを管理することです。 発行プロファイル ページで、[ ホスティング ] セクションに移動します。 省略記号 (...) を選択し、[ Azure App Service 設定の管理] を選択します。
選択すると、関数アプリの [アプリケーション設定 ] ダイアログが開きます。 このダイアログを使用して、アプリケーション設定を追加したり、既存の設定を変更したりできます。
各設定の ローカル 値は local.settings.json ファイル内の値であり、 Remote 値は Azure の関数アプリの値です。
- アプリ設定を作成するには、[ 設定の追加] を選択します。
- [ローカル] フィールドから [リモート] フィールドに設定値をコピーするには、[ローカルから値を挿入] を選択します。
[OK] を選択すると、保留中の変更がローカル設定ファイルと関数アプリに書き込まれます。
注
既定では、 local.settings.json ファイルはソース管理にチェックインされません。 その結果、ソース管理からローカルの Functions プロジェクトを複製した場合、プロジェクトには local.settings.json ファイルがありません。 アプリケーション設定ダイアログが想定どおりに動作するように、プロジェクト ルートに local.settings.json ファイルを手動で作成する必要があります。
以下のいずれかの方法を使用して、アプリケーション設定を管理することもできます。
- Azure Portal を使用します。
-
Azure Functions Core Tools の
--publish-local-settings
発行オプションを使用します。 - Azure CLI を使用します。
リモート デバッグ
関数アプリをリモートでデバッグするには、プロジェクトのデバッグ構成を発行する必要があります。 また、Azure の関数アプリでリモート デバッグを有効にする必要もあります。
このセクションでは、関数アプリへのデバッグ構成が公開されていることを前提としています。
リモート デバッグに関する考慮事項
- 運用環境のサービスでは、リモート デバッグはお勧めしません。
- リモート デバッグを使用するには、Premium または App Service プランで関数アプリをホストする必要があります。
- リモート デバッグは現在、Windows で C# アプリを実行する場合にのみサポートされています。
- Visual Studio で [マイ コードのみ] 機能を有効にしている場合は、オフにします。 手順については、「 マイ コードのみを有効または無効にする」を参照してください。
- リモート デバッグを使用する場合は、ブレークポイントで長い停止を避けます。 プロセスが数分間以上停止されると、Azure は応答しないプロセスとして処理し、シャットダウンします。
- デバッグ中に、サーバーは Visual Studio にデータを送信します。これは帯域幅の料金に影響を与える可能性があります。 帯域幅レートの詳細については、「 料金計算ツール」を参照してください。
- リモート デバッグは、48 時間後に関数アプリで自動的にオフになります。 その後、リモート デバッグをオンに戻す必要があります。
デバッガーをアタッチする
分離されたワーカー プロセス アプリをデバッグするときは、現在、リモート デバッガーを別の .NET プロセスにアタッチする必要があります。 その他のいくつかの構成手順も必要です。
Functions ホストとは別のプロセスで実行されている関数アプリにリモート デバッガーをアタッチするには、次の手順を実行します。
発行プロファイル ページで、[ ホスティング ] セクションに移動します。 省略記号 (...) を選択し、デバッガーをアタッチを選択します。
Visual Studio は関数アプリに接続し、まだ有効にしていない場合はリモート デバッグを有効にします。
注
リモート デバッガーはホスト プロセスに接続できないため、エラー メッセージが表示されることがあります。 いずれの場合も、ローカル デバッガーはブレークポイントにアクセスしたり、変数を検査したり、コードをステップ実行したりする方法を提供できません。
Visual Studio の [デバッグ ] メニューで、[ プロセスにアタッチ] を選択します。
[ プロセスにアタッチ ] ダイアログで、次の手順を実行します。
- [ 接続の種類] の横にある Microsoft Azure App Services を選択します。
- [ 接続ターゲット] の横にある [検索] を選択 します。
[Azure プロセスへのアタッチ] ダイアログで、関数アプリを検索して選択し、[OK] を選択します。
メッセージが表示されたら、ローカル ファイアウォール経由で Visual Studio へのアクセスを許可します。
[ プロセスにアタッチ ] ダイアログボックスに戻り、[ すべてのユーザーのプロセスを表示] を選択します。 [dotnet.exe] を選択し、[アタッチ] を選択します。
操作が完了すると、分離されたワーカー プロセスで実行されている C# クラス ライブラリ コードにアタッチされます。 この時点で、関数アプリを通常どおりにデバッグできます。
Functions ホストでインプロセスで実行されている関数アプリにリモート デバッガーをアタッチするには、次の手順を実行します。
発行プロファイル ページで、[ ホスティング ] セクションに移動します。 省略記号 (...) を選択し、デバッガーをアタッチを選択します。
Visual Studio は関数アプリに接続し、まだ有効にしていない場合はリモート デバッグを有効にします。 また、アプリのホスト プロセスにデバッガーを見つけてアタッチします。 この時点で、関数アプリを通常どおりにデバッグできます。
デバッグが完了したら、 リモート デバッグをオフにする必要があります。
リモート デバッグをオフにする
コードのリモート デバッグが完了したら、 Azure portal でリモート デバッグをオフにする必要があります。 リモート デバッグは、忘れた場合に備えて、48 時間後に自動的にオフになります。
発行プロファイル ページで、[ ホスティング ] セクションに移動します。 省略記号 (...) を選択し、[ Azure portal で開く] を選択します。 Azure portal が開き、プロジェクトのデプロイ対象の関数アプリが表示されます。
関数アプリで、[ 設定]>[構成] を選択し、[ 全般設定 ] タブに移動します。 [リモート デバッグ] の横にある [オフ] を選択します。 [ 保存] を選択し、[ 続行] を選択します。
関数アプリの再起動後、リモート プロセスにリモート接続できなくなります。 Azure portal でこの同じタブを使用して、Visual Studio の外部でリモート デバッグを有効にすることができます。
モニター機能
関数を監視する推奨される方法は、関数アプリと Application Insights を統合することです。 この統合は、Visual Studio の発行中に関数アプリを作成するときに有効にする必要があります。
何らかの理由で発行中に統合が設定されていない場合でも、Azure で関数アプリの Application Insights 統合 を有効にする必要があります。
監視に Application Insights を使用する方法の詳細については、「 Azure Functions での実行の監視」を参照してください。
テスト関数
このセクションでは、.NET 用のオープンソース単体テスト ツールである xUnit を使用してテストできる C# インプロセス モデル プロジェクトを作成する方法について説明します。
手順 1: 設定
次の手順に従って、テストをサポートするために必要なアプリ プロジェクトと関数を含む環境を構成します。
Visual Studio で、 Functions という名前の Azure Functions プロジェクトを作成します。
テンプレートから HTTP 関数を作成します。
- ソリューション エクスプローラーで、Functions プロジェクトを右クリックし、[追加>新しい Azure 関数] を選択します。
- [ 新しい項目の追加 ] ダイアログで、[ Azure 関数] を選択し、[ 追加] を選択します。
- [Http トリガー] を選択し、[追加] を選択します。
- 新しいクラス MyHttpTrigger の名前を変更します。
テンプレートからタイマー関数を作成します。
- ソリューション エクスプローラーで、Functions プロジェクトを右クリックし、[追加>新しい Azure 関数] を選択します。
- [ 新しい項目の追加 ] ダイアログで、[ Azure 関数] を選択し、[ 追加] を選択します。
- [タイマー トリガー] を選択し、[追加] を選択します。
- 新しいクラス MyTimerTrigger の名前を変更します。
ソリューションで xUnit テスト アプリ を作成します。
- ソリューション エクスプローラーで、Functions プロジェクトを含むソリューションを右クリックし、[ 追加>新しいプロジェクト] を選択します。
- xUnit テスト プロジェクト テンプレートを選択し、[次へ] を選択します。
- プロジェクトに Functions.Tests という名前を付けます。
Functions.Tests プロジェクトから既定のテスト ファイルを削除します。
NuGet を使用して、テスト アプリから Microsoft.AspNetCore.Mvc への参照を追加します。 パッケージ マネージャー コンソールを使用することも、次の手順を実行することもできます。
- ソリューション エクスプローラーでFunctions.Tests プロジェクトを右クリックし、[NuGet パッケージの管理] を選択します。
- Microsoft.AspNetCore.Mvc を検索してインストールします。
Functions.Tests アプリで、Functions アプリへの参照を追加します。
- ソリューション エクスプローラーでFunctions.Tests プロジェクトを右クリックし、>を選択します。
- Functions プロジェクトを選択し、[OK] を選択します。
手順 2: テスト クラスを作成する
このセクションでは、自動テストの実行に使用するクラスを作成します。
各関数は、メッセージ ログを処理するために ILogger
の実装を受け取ります。 一部のテストでは、メッセージがログに記録されないか、ログ記録の実装方法は関係ありません。 他のテストでは、ログに記録されたメッセージを評価して、テストに合格するかどうかを判断する必要があります。
という名前の
NullScope
プロジェクトにクラスを作成し、次のコードを追加します。 このクラスはモック スコープを提供します。 後の手順では、このスコープを使用するILogger
の実装を作成します。using System; namespace Functions.Tests { public class NullScope : IDisposable { public static NullScope Instance { get; } = new NullScope(); private NullScope() { } public void Dispose() { } } }
という名前の
ListLogger
プロジェクトにクラスを作成し、次のコードを追加します。 このクラスは、テスト中に評価するメッセージの内部リストを保持します。 必要なILogger
インターフェイスを実装するために、クラスはNullScope
クラスのモック スコープを使用します。 テスト ケースは、モック スコープをListLogger
クラスに渡します。using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; namespace Functions.Tests { public class ListLogger : ILogger { public IList<string> Logs; public IDisposable BeginScope<TState>(TState state) => NullScope.Instance; public bool IsEnabled(LogLevel logLevel) => false; public ListLogger() { this.Logs = new List<string>(); } public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) { string message = formatter(state, exception); this.Logs.Add(message); } } }
ListLogger
クラスは、ILogger
インターフェイスによってコントラクト化された次のメンバーを実装します。-
BeginScope
: スコープによって、ログ記録にコンテキストが追加されます。 この場合、テストは、テストが機能できるように、NullScope
クラスの静的インスタンスを指します。 -
IsEnabled
: 既定値のfalse
が指定されています。 -
Log
: このメソッドは、指定されたformatter
関数を使用してメッセージの書式設定を行います。 次に、結果のテキストをLogs
コレクションに追加します。
Logs
コレクションはList<string>
のインスタンスであり、コンストラクターで初期化されます。-
LoggerTypes.csという名前のコード ファイルを Functions.Tests プロジェクトに作成し、次のコードを追加します。
namespace Functions.Tests { public enum LoggerTypes { Null, List } }
この列挙型は、テストで使用されるロガーの種類を指定します。
という名前の
TestFactory
プロジェクトにクラスを作成し、次のコードを追加します。using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Internal; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Primitives; using System.Collections.Generic; namespace Functions.Tests { public class TestFactory { public static IEnumerable<object[]> Data() { return new List<object[]> { new object[] { "name", "Bernardo" }, new object[] { "name", "Ananya" }, new object[] { "name", "Vlad" } }; } private static Dictionary<string, StringValues> CreateDictionary(string key, string value) { var qs = new Dictionary<string, StringValues> { { key, value } }; return qs; } public static HttpRequest CreateHttpRequest(string queryStringKey, string queryStringValue) { var context = new DefaultHttpContext(); var request = context.Request; request.Query = new QueryCollection(CreateDictionary(queryStringKey, queryStringValue)); return request; } public static ILogger CreateLogger(LoggerTypes type = LoggerTypes.Null) { ILogger logger; if (type == LoggerTypes.List) { logger = new ListLogger(); } else { logger = NullLoggerFactory.Instance.CreateLogger("Null Logger"); } return logger; } } }
TestFactory
クラスは、次のメンバーを実装します。-
Data
: このプロパティは、サンプル データの IEnumerable コレクションを返します。 キーと値のペアは、クエリ文字列に渡される値を表します。 -
CreateDictionary
: このメソッドは、キーと値のペアを引数として受け入れます。 クエリ文字列値を表すDictionary
のインスタンスを作成するために使用されるQueryCollection
の新しいインスタンスが返されます。 -
CreateHttpRequest
: このメソッドは、指定されたクエリ文字列パラメーターを使用して初期化される HTTP 要求を作成します。 -
CreateLogger
: このメソッドは、テストに使用されるILogger
の実装を返します。ILogger
実装は、指定したロガーの種類によって異なります。 リストの種類が指定されている場合、ListLogger
インスタンスは、テストで評価に使用できるログに記録されたメッセージを追跡します。
-
という名前の
FunctionsTests
プロジェクトにクラスを作成し、次のコードを追加します。using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Xunit; namespace Functions.Tests { public class FunctionsTests { private readonly ILogger logger = TestFactory.CreateLogger(); [Fact] public async void Http_trigger_should_return_known_string() { var request = TestFactory.CreateHttpRequest("name", "Bernardo"); var response = (OkObjectResult)await MyHttpTrigger.Run(request, logger); Assert.Equal("Hello, Bernardo. This HTTP triggered function executed successfully.", response.Value); } [Theory] [MemberData(nameof(TestFactory.Data), MemberType = typeof(TestFactory))] public async void Http_trigger_should_return_known_string_from_member_data(string queryStringKey, string queryStringValue) { var request = TestFactory.CreateHttpRequest(queryStringKey, queryStringValue); var response = (OkObjectResult)await MyHttpTrigger.Run(request, logger); Assert.Equal($"Hello, {queryStringValue}. This HTTP triggered function executed successfully.", response.Value); } [Fact] public void Timer_should_log_message() { var logger = (ListLogger)TestFactory.CreateLogger(LoggerTypes.List); new MyTimerTrigger().Run(null, logger); var msg = logger.Logs[0]; Assert.Contains("C# Timer trigger function executed at", msg); } } }
このクラスは、次のメンバーを実装します。
-
Http_trigger_should_return_known_string
: このテストでは、クエリ文字列値name=Bernardo
を使用して、HTTP 関数への要求を作成します。 このテストでは、予想される応答が返されることを確認します。 -
Http_trigger_should_return_string_from_member_data
: このテストでは、xUnit 属性を使用して、HTTP 関数にサンプル データを提供します。 -
Timer_should_log_message
: このテストでは、ListLogger
のインスタンスを作成し、タイマー関数に渡します。 関数の実行後、ログがチェックされ、予期されるメッセージが存在することを確認します。
-
手順 3: テストを実行する
Visual Studio でテストを実行するには、[表示]>[テスト エクスプローラー] を選択します。 テスト エクスプローラーで、[実行] >[すべてのテストを表示で実行] を選択します。
手順 4: テストをデバッグする
テストをデバッグするには、テストにブレークポイントを設定します。 テスト エクスプローラーで、[実行>Debug Last Run] を選択します。