Visual Studio を使用してローカルで簡単な Azure 関数を作成してテストする

完了

ユーザーは Azure portal 内から Azure 関数を記述、デバッグ、デプロイすることができます。 ただし、実稼働、ステージング、またはテスト環境で関数を直接記述するのは適さない場合があります。 たとえば、Azure Functions 用の自動単体テストを記述したり、Azure 内の関数アプリに対する Azure 関数のオンデマンド デプロイを使用したりする場合です。 通常、開発者は、Azure portal によって提供される環境ではなく、コード エディターや開発ツールを使用することを好みます。 Visual Studio を使用すると、1 つのプロジェクトで他のコードとサービスを使用して、Azure Functions コードの開発と管理を行えます。

オンラインの高級腕時計のシナリオでは、開発者は既に Visual Studio 2022 に慣れ親しんでいます。 そのため、Azure Functions を作成するための主要な開発環境として Visual Studio を使用することにします。 さらに、Visual Studio では、Azure にデプロイする前にローカルで関数をテストするための優れた環境が提供されています。

このユニットでは、ローカル コンピューターで Azure 関数を構築およびテストするために、Visual Studio で使用できるツールの使用方法について説明します。

重要

この記事では、ランタイムを使用してインプロセスで実行される .NET クラス ライブラリ関数をサポートしています。 C# 関数では、アウトプロセスを実行したり、Functions ランタイムから分離したりすることもできます。 分離ワーカー プロセス モデルは、現在のバージョンの Functions ランタイムで非 LTS バージョンの .NET および.NET Framework アプリを実行する唯一の方法です。 詳細については、.NET 分離ワーカー プロセス関数に関する記事を参照してください。

Visual Studio インストールを変更する

まず、開発環境に必要な Web とクラウドのツールを使用して、Visual Studio を設定しましょう。

  1. Visual Studio 2022 をローカルにインストールして、Visual Studio インストーラーを開き、Visual Studio Community 2022[変更] を選択します。

    [変更] が強調表示されている Visual Studio インストーラーのスクリーンショット。

  2. [変更中 - Visual Studio] ページが表示されます。

    Visual Studio Community 2022 の変更の [ワークロード] タブのスクリーンショット。[ASP.NET および Web 開発] と [Azure 開発] が強調表示されています。

  3. [ワークロード] タブで、[ASP.NET および Web 開発][Azure 開発] のチェックボックスを選択し、[変更] を選択します。

  4. 確認ダイアログで、[はい] を選択します。 [Visual Studio インストーラー] ページが表示され、パッケージのインストール状況が表示されます。

Visual Studio 用の Azure Functions ツール拡張機能

Azure Functions ツールは、ローカル開発環境で Azure Functions を作成、テスト、およびデプロイすることができる Visual Studio の拡張機能です。 新しい Azure 関数アプリをすばやく作成するため、この拡張機能では、関数をビルドして Visual Studio から Azure に直接デプロイするためのテンプレートが提供されます。

Visual Studio 2022 には、Azure Functions と Web ジョブツールの拡張機能が含まれています。

Azure Function App

関数アプリでは、1 つ以上の関数がホストされます。 関数コードの環境とランタイムが提供されます。

関数は、アプリから直接呼び出されるのではなく、イベントによってトリガーされます。 Azure 関数アプリ内の各関数をトリガーするイベントの種類を指定します。 使用可能なイベントは次のとおりです。

  • BLOB トリガー。 この種類の関数は、Azure Blob Storage 内でファイルがアップロードまたは変更されると実行されます。
  • イベント ハブ トリガー。 Event Hubs トリガーは、イベント ハブがメッセージを受信すると関数を実行します。
  • Azure Cosmos DB のトリガー。 このトリガーは、Azure Cosmos DB データベースでドキュメントが追加または変更されると実行されます。 このトリガーを使用して、Azure Cosmos DB と他のサービスを統合することができます。 たとえば、顧客の注文を表すドキュメントがデータベースに追加されたら、トリガーを使用して処理のためのキューに注文のコピーを送信できます。
  • HTTP トリガー。 HTTP トリガーは、Web アプリで HTTP 要求が発生すると関数を実行します。 このトリガーを使用して、Webhook に応答することもできます。 Webhook は、Web サイトでホストされているアイテムが変更されたときに発生するコールバックです。 たとえば、GitHub リポジトリ内のアイテムが変更されたらリポジトリからの Webhook によってトリガーされる関数を作成できます。
  • キュー トリガー。 このトリガーにより、Azure Storage キューに新しいアイテムが追加されると関数が起動されます。
  • Service Bus キュー トリガー。 このトリガーにより、Azure Service Bus キューに新しいアイテムが追加されると関数が実行されます。
  • Service Bus トピック トリガー。 このトリガーは、Service Bus トピックへの新しいメッセージの到着に応答して関数を実行します。
  • タイマー トリガー。 このイベントにより、定義したスケジュールに従って定期的に関数が実行されます。

使用可能な Azure 関数トリガーを示すスクリーンショット (HTTP トリガーが強調表示されている)。

次の表は、特定のバージョンの Functions と共に使用できる最上位レベルの .NET Core と .NET Framework を示しています。

Functions ランタイムのバージョン インプロセス 分離ワーカー プロセス
Functions 4.x .NET 6.0 .NET 6.0
.NET 7.0
.NET 8.0
.NET Framework 4.8
Functions 1.x .NET Framework 4.8 N/A

Azure 関数アプリでは、管理情報、コード、およびログが Azure ストレージに格納されます。 このデータを保持するには、ストレージ アカウントを作成します。 ストレージ アカウントでは、Azure Blob、Queue、File、Table Storage をサポートする必要があります。この目的のためには、一般的な Azure ストレージ アカウントを使用します。 前述のダイアログを使用して、関数に使用するストレージ アカウントを指定します。

関数では、特権操作または機密性の高い操作を実行できます。 HTTP 要求によってトリガーされる関数は、一般公開される可能性があります。 この関数を実行する機能を、選択したユーザーのグループに制限することが必要な場合があります。 関数をトリガーするために必要なアクセス権を指定することにより、関数を保護します。 HTTP 要求によってトリガーされる関数では、次の 3 つのレベルのアクセス権がサポートされています。

  • 匿名。 認証は必要なく、すべてのユーザーが関数をトリガーできます。
  • 関数。 HTTP 要求では、Azure Functions Runtime で要求を認可できるキーを指定する必要があります。 このキーを別に作成し、Azure portal を使用して保持することができます。
  • 管理者Function に似ています。 ユーザーは関数をトリガーする HTTP 要求でキーを指定する必要があります。 違いは、キーが "管理者" キーであることです。 このキーを使用すると、関数アプリ内の任意の関数にアクセスできます。 関数キーと同様に、このキーは個別に作成します。

HTTP 要求以外のイベントによってトリガーされる関数を作成する場合は、関数アプリがイベントをトリガーするリソースにアクセスするために必要な接続文字列とその他の詳細を指定する必要があります。 たとえば、Blob Storage イベントによってトリガーされる関数を作成している場合、対応する Blob Storage アカウントに対する接続文字列を指定する必要があります。

Azure 関数の構造

Azure 関数は静的クラスとして実装されます。 そのクラスでは、クラスのエントリ ポイントとして機能する Run という名前の静的な非同期メソッドが提供されます。

Run メソッドに渡すパラメーターでは、トリガーのコンテキストを指定します。 これが HTTP トリガーである場合、関数は HttpRequest オブジェクトを受け取ります。 このオブジェクトには、要求のヘッダーと本文が含まれています。 HTTP アプリで使用できるのと同じ手法を使用して、要求内のデータにアクセスできます。 この関数に適用される属性では、認可の要件 (ここでは Anonymous) と、関数が応答する HTTP 操作 (GETPOST) を指定します。

Visual Studio によって生成される次のコード例では、要求に対する URL の一部として提供されるクエリ文字列が調べられ、name という名前のパラメーターが検索されます。 また、コードでは、StreamReader を使用して要求の本文が逆シリアル化され、要求からやはり name という名前のプロパティの値の読み取りが試みられます。 クエリ文字列または要求の本文で name が見つかった場合、name 値が応答で返されます。 それ以外の場合、この関数は次のメッセージを含むエラー応答を生成します。クエリ文字列または要求本文で名前を渡してください

public static class Function1
{
    [FunctionName("Function1")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

        string name = req.Query["name"];

        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
        name = name ?? data?.name;

        return name != null
            ? (ActionResult)new OkObjectResult($"Hello, {name}")
            : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
    }
}

関数からは、出力データと結果を含む値が IActionResult オブジェクトでラップされて返されます。 この値は、要求に対する HTTP 応答の本文で返されます。

トリガーの種類が異なると、受け取る入力パラメーターと返される型も異なります。 次の例では、BLOB トリガーに対して生成されるコードを示します。 この例では、BLOB の内容が Stream オブジェクトを使用して返され、BLOB の名前も提供されます。 トリガーではデータは返されません。その目的は、指定された BLOB 内のデータを読み取って処理することです。

public static class Function2
{
    [FunctionName("Function2")]
    public static void Run([BlobTrigger("samples-workitems/{name}", Connection = "xxxxxxxxxxxxxxxxxxxxxxx")]Stream myBlob, string name, ILogger log)
    {
        log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
    }
}

すべての場合において、関数には ILogger パラメーターが渡されます。 関数ではこのパラメーターを使用してログ メッセージを書き込むことができ、関数アプリではそれが後で分析できるようにストレージに書き込まれます。

関数には、トリガーの種類、セキュリティ要件、その他の特定の情報要件を指定するメタデータも含まれています。 メタデータは、例で示すように、HttpTriggerBlobTrigger、または他のトリガー属性を使用して変更できます。 関数の前にある FunctionName 属性は、関数アプリによって使用される関数の識別子です。 この名前は、関数の名前と同じでなくてもかまいませんが、混乱を避けるために同じにするのが良い方法です。

Azure 関数アプリをローカルでテストする

ビジュアル デバッガーを使用して、Azure 関数アプリをローカルでビルドしてテストできます。 デバッガーを起動するには、F5 キーを押すか、[デバッグ] メニューの [デバッグの開始] を選択します。 関数ランタイムのローカル バージョンが開始されます。 自分の関数をテストに使用できるようになります。 この例では、HTTP イベントによってトリガーされる関数 Function1 をホストするランタイムを示します。 URL では、関数が現在アタッチされているエンドポイントが示されます。

Azure Functions Runtime を示すスクリーンショット: 例 1。

Web ブラウザーを開いてこの URL にアクセスすると、関数がトリガーされます。 次の図では、本文が含まれていない HTTP GET 要求によって生成される応答を示します。 関数から BadRequestObjectResult オブジェクトを返すコードによって生成されるメッセージを見ることができます。

Azure Functions Runtime を示すスクリーンショット。

name パラメーターを含むクエリ文字列を指定した場合、関数によって値が読み取られて処理されます。

Azure Functions Runtime を示すスクリーンショット: 例 2。

コードが実行されている間、[Functions Runtime](関数ランタイム) ウィンドウにトレース メッセージが表示されます。 ブレークポイントを設定し、関数内の制御のフローを確認する必要がある場合は、Visual Studio の標準的なデバッグ機能を使用できます。