演習 - Visual Studio を使用して Azure 関数をローカルで作成してテストする

完了

Visual Studio は、Azure 関数アプリを作成してテストするための優れた環境です。 Azure 関数をローカルで開発し、正しく動作することを確認してから、クラウドにデプロイできます。

高級腕時計のオンライン Web サイトのシナリオには、腕時計のモデル番号が指定されたら、関数から腕時計の詳細情報を返す要件があります。 返される必要があるデータには、製造元、ケース背面の種類 (無地、透明、または刻印)、ベゼル、文字盤のスタイル、ケースの仕上げ加工、宝石の数などがあります。

この演習では、Visual Studio を使用して、この関数のバージョンをローカルに実装してテストします。

この演習を開始する前に、Visual Studio 2022 と、Web およびクラウド ワークロード拡張機能 ASP.NET Web 開発とAzure 開発がインストールされていることを確認します。

Azure 関数アプリを作成する

Azure Functions テンプレートを使用して Azure Function App を作成します。

  1. Visual Studio インストーラーを起動し、Visual Studio 2022 のスタート ページで [変更] を選択します。

  2. ASP.NET と Web 開発とAzure 開発が選択され、使用可能であることを確認し ([ダウンロード中にインストール] を選択しない場合)、[閉じる] を選択します。

    asp dot net と Azure 開発ワークロードが強調表示されている Visual Studio 2022 のスクリーンショット。

  3. Visual Studio 2022 のスタート ページで、[起動] を選択します

  4. [ 作業の開始 ] メニューで、[ 新しいプロジェクトの作成] を選択します。 [ 新しいプロジェクトの作成] ページが表示されます。

  5. Azure Functions テンプレートを検索またはスクロールし、[次へ] を選択します。

    Azure Functions テンプレートが強調表示された Visual Studio 2022 の [新しいプロジェクトの作成] ページのスクリーンショット。

  6. [ 新しいプロジェクトの構成] ページが表示されます。 次の値を入力します。

    フィールド
    プロジェクト名 WatchPortalFunction
    場所 フォルダーを参照するか、ローカル コンピューターにフォルダーを作成して、プロジェクトを保存する場所を選びます。
    ソリューション名 WatchPortalFunction を受け入れます (既定値)。
    ソリューションとプロジェクトを同じディレクトリに配置する オフ (選択しない)。 この設定により、このモジュールの正しいフォルダー構造が保証されます。

    [作成] が強調表示された [新しいプロジェクトの構成] ページのスクリーンショット。

  7. [ 次へ] を選択します。

  8. [ 追加情報] ページが表示されます。

  9. 次の値を選択します。

    フィールド
    Dotnet バージョン *.NET 6.0 (長期的なサポート)
    関数トリガー Http トリガー
    ランタイム ストレージ アカウントに Azurite を使用する (AzureWebJobsStorage) チェック
    Docker を有効にする オフ
    承認レベル 匿名

    Visual Studio の通知に更新の準備が完了したことを示す場合は、[更新] を選択 します

  10. 作成を選択します。

    HTTP トリガーが強調表示されている Azure Functions トリガーを示すスクリーンショット。

    Visual Studio によって、WatchPortalFunction プロジェクトが作成され、コード エディター ウィンドウに関数アプリのソース コード ファイル Function1.cs が表示されます。 このファイルには、Function1 という名前のクラスのコードが含まれています。

    次のコード例に示すように、Function1 クラスに Http トリガー テンプレートの定型コードが含まれています。 Run メソッドには、[FunctionName ("Function1")] 属性で注釈が付けられています。 前のユニットで、Run メソッドの定型パラメーターが、関数をトリガーした要求の詳細を含む HttpRequest オブジェクトと、トレース情報を記録するトレース ログ エントリであることを学習しました。

    namespace WatchPortalFunction
    {
        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");
            }
        }
    }
    

WatchInfo Azure 関数を作成する

  1. [表示] メニューの [ソリューション エクスプローラー] を選択します。 ソリューション エクスプローラー ウィンドウで WatchPortalFunction Azure Functions プロジェクトを右クリックし、コンテキスト メニューで [追加>新しい Azure 関数] を選択します。

    ソリューション エクスプローラー ウィンドウのスクリーンショット。ユーザーが [Add -> New Azure Function]\(新しい Azure 関数の追加\) を選択しました。

  2. [ 新しい項目の追加 - WatchPortalFunction ] ウィンドウで、[ Azure 関数] を選択します。 [ 名前 ] フィールドに 「WatchInfo.cs」と入力し、[ 追加] を選択します。

    [新しい項目の追加] ウィンドウのスクリーンショット。Azure 関数テンプレートが選択され、新しい関数に WatchInfo.cs という名前が付けられます。

  3. [ 新しい Azure 関数 - WatchInfo ] ウィンドウで、[ Http トリガー] を選択します。 [ 承認レベル ] ドロップダウン リストで [ 匿名] を選択し、[ 追加] を選択します。

    [新しい Azure 関数] ウィンドウのスクリーンショット。匿名アクセス権を持つ Http トリガーが選択されています。

    Visual Studio によって、新しい関数が作成され、Run メソッドに [FunctionName("WatchInfo")] 属性で注釈が付けられます。

  4. Run 関数の本体で、log.LogInformation 行の後のコードを削除します。 結果は次のようになります。

    namespace WatchPortalFunction
    {
        public static class WatchInfo
        {
            [FunctionName("WatchInfo")]
            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.");
            }
        }
    }
    
  5. Run メソッドの本文 (log.LogInformation 行の後) に次のコードを追加します。

    // Retrieve the model id from the query string
    string model = req.Query["model"];
    
    // If the user specified a model id, find the details of the model of watch
    if (model != null)
    {
        // Use dummy data for this example
        dynamic watchinfo = new { Manufacturer = "abc", CaseType = "Solid", Bezel = "Titanium", Dial = "Roman", CaseFinish = "Silver", Jewels = 15 };
    
        return (ActionResult)new OkObjectResult($"Watch Details: {watchinfo.Manufacturer}, {watchinfo.CaseType}, {watchinfo.Bezel}, {watchinfo.Dial}, {watchinfo.CaseFinish}, {watchinfo.Jewels}");
    }
    return new BadRequestObjectResult("Please provide a watch model in the query string");
    

    このコードでは、HTTP 要求のクエリ文字列から model パラメーターを読み取り、その腕時計モデルの詳細を返します。 このコード例では、watchinfo 値に関係なく返される、ダミーの model データを作成しました。 関数からこれらの詳細を含む応答が返されます。 または、HTTP 要求にクエリ文字列が含まれていない場合、関数はエラー メッセージを返します。 実際の例では、model 値を使用して正しい watchinfo を検索して返します。

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

  1. コマンド バーで、 デバッグ>デバッグの開始を選択します。

    Visual Studio で Azure 関数アプリがビルドされ、Azure Functions Runtime が開始されます。 [出力] ウィンドウが開き、ランタイムの起動時にメッセージが表示されます。 ランタイムの準備が整うと、HTTP 関数の一覧と、各関数をトリガーするために使用できる URL が表示されます。

    Azure Functions ランタイム ウィンドウのスクリーンショット。ランタイムは Azure Function App を起動し、'Function1' と 'WatchInfo' Azure Functions の URL を表示します。

  2. Web ブラウザーを開き、ランタイム ウィンドウに表示される URL を入力します。 既定の URL は http://localhost:7071/api/WatchInfo?model=abc なので、この演習ではこれを使用します。 この要求によって WatchInfo 関数がトリガーされ、クエリ文字列パラメータとしてモデル abc が渡されます。 Web ブラウザーには、関数によって生成されたダミーの詳細が表示されます。

    WatchInfo Azure 関数をトリガーする Web ブラウザーのスクリーンショット。この関数は、指定された URL のクエリ文字列で指定されたモデルのダミーの詳細を返します。

  3. URL http://localhost:7071/api/WatchInfo を入力します。 この要求にはクエリ文字列が含まれていません。 トリガーからエラー応答が返され、Web ブラウザーに Please provide a watch model in the query string というメッセージが表示されます。

  4. Web ブラウザーを閉じますが、Azure 関数アプリは実行したままにします。

  5. Visual Studio で、クエリ文字列からモデルを取得するコード行にブレークポイントを設定します。

    クエリ文字列からモデルを読み取るステートメントのブレークポイントを示す Visual Studio のスクリーンショット。

  6. Web ブラウザーを再起動し、クエリ文字列なしで URL http://localhost:7071/api/WatchInfo を入力します。

    Visual Studio により、実行が一時停止されているブレークポイントでコードが強調表示されます。

  7. Visual Studio で、ブレークポイントでステートメントをステップ オーバーするには、 F10 キーを押します。

  8. [デバッガー] ウィンドウの [自動変数] タブで、model変数がnullされていることを確認します。 クエリ文字列にモデル パラメータが含まれていないため、変数にこの値が表示されます。

    モデル変数の値を示す Visual Studio デバッガーのスクリーンショット。

  9. もう一度 F10 キーを押し、 BadRequestObjectResult オブジェクトを返すステートメントにコントロールがジャンプすることを確認します。

  10. メソッドの実行を続けて Web ブラウザーに戻すには、 F5 キーを押します。 同じエラー メッセージが表示されます。

  11. Web ブラウザーで、クエリ文字列と model パラメーターを含む URL を入力します。 デバッガーで関数をステップ実行し、モデルが正しく取得されることを確認します。 model 変数にパラメーターの値が設定され、モデルの詳細が OkObjectResult オブジェクトとして返されます。

  12. メニュー バーで[デバッグ]>[デバッグの停止]を選択します。

この演習では、Visual Studio の Azure Functions ツール拡張機能により、使い慣れたツールを使用してコードのビルドとデバッグが可能になるため、Azure 関数アプリの作成エクスペリエンスがどのように簡素化されるかを確認しました。