チュートリアル: Azure Functions の概要Tutorial: Getting started with Azure Functions

このラボでは、Visual Studio for Mac を使用して Azure Functions のビルドを開始する方法を学習します。In this lab, you'll learn how to get started building Azure Functions using Visual Studio for Mac. Azure Functions 開発者が使用できるバインドとトリガーの多くの種類の 1 つを表す、Azure ストレージ テーブルとの統合も行います。You'll also integrate with Azure storage tables, which represent one of the many kinds of bindings and triggers available to Azure Functions developers.

目的Objectives

  • ローカルの Azure Functions を作成およびデバッグするCreate and debug local Azure Functions
  • Web および Azure ストレージ リソースを統合するIntegrate with web and Azure storage resources
  • 複数の Azure Functions に関連するワークフローを編成するOrchestrate a workflow involving multiple Azure Functions

必要条件Requirements

  • Visual Studio for Mac 7.5 以上。Visual Studio for Mac 7.5 or higher.
  • Azure サブスクリプション (https://azure.com/free から無料で入手可能)。An Azure subscription (available free from https://azure.com/free).

演習 1:Azure Functions プロジェクトの作成Exercise 1: Creating an Azure Functions project

  1. Visual Studio for Mac を起動します。Launch Visual Studio for Mac.

  2. [ファイル]、[新しいソリューション] の順に選択します。Select File > New Solution.

  3. [クラウド]、[全般] カテゴリから、 [Azure Functions] テンプレートを選択します。From the Cloud > General category, select the Azure Functions template. Azure Functions をホストする .NET クラス ライブラリを作成する場合は、C# を使用します。You will use C# to create a .NET class library that hosts Azure Functions. [次へ] をクリックします。Click Next.

    Azure Functions テンプレートの選択

  4. [プロジェクト名]"AzureFunctionsLab" に設定して、 [作成] をクリックします。Set the Project Name to "AzureFunctionsLab" and click Create.

    Azure Functions プロジェクトの名前付けと作成

  5. [ソリューション] ウィンドウ でノードを展開します。Expand the nodes in the Solution Window. 既定のプロジェクト テンプレートには、さまざまな Azure WebJobs パッケージと、Newtonsoft.Json パッケージへの NuGet 参照が含まれています。The default project template includes NuGet references to a variety of Azure WebJobs packages, as well as the Newtonsoft.Json package.

    次の 3 つのファイルもあります。- ホストのグローバル構成オプションを記述するための host.json - サービス設定を構成するための local.settings.jsonThere are also three files: - host.json for describing the global configuration options for the host - local.settings.json for configuring service settings. - プロジェクト テンプレートでは、既定の HttpTrigger も作成します。- The project template also creates a default HttpTrigger. このラボの目的上、プロジェクトから HttpTrigger.cs ファイルを削除する必要があります。For the sake of this lab, you should delete the HttpTrigger.cs file from the project.

    local.settings.json を開きます。Open local.settings.json. 既定では、2 つの空の接続文字列設定が示されます。It defaults to having two empty connection string settings.

    local.settings.json ファイルが表示されている [ソリューション] ウィンドウ

演習 2:Azure ストレージ アカウントの作成Exercise 2: Creating an Azure storage account

  1. https://portal.azure.com で Azure アカウントにログオンします。Log on to your Azure account at https://portal.azure.com.

  2. [お気に入り] セクションで、画面の左側にある [ストレージ アカウント] を選択します。Under the Favorites section, located on the left of the screen, select Storage Accounts:

    ストレージ アカウント項目が表示されている、Azure Portal の [お気に入り] セクション

  3. 次のように、 [追加] を選択して新しいストレージ アカウントを作成します。Select Add to create a new storage account:

    新しいストレージ アカウントを追加するためのボタン

  4. [名前] にグローバルに一意の名前を入力し、それを [リソース グループ] で再利用します。Enter a globally unique name for the Name and reuse it for the Resource group. その他のすべての項目は既定値のままでかまいません。You can keep all the other items as their default.

    新しいストレージ アカウントの詳細

  5. [作成] をクリックします。Click Create. ストレージ アカウントの作成には数分かかる場合があります。It might take a few minutes to create the storage account. 正常に作成された場合は、通知が表示されます。You'll get a notification once it has been successfully created.

    展開が成功したことを示す通知

  6. 通知の [リソースに移動] ボタンを選択します。Select the Go to resource button from the notification.

  7. [アクセス キー] タブを選択します。Select the Access keys tab.

    アクセス キーの設定

  8. 最初の [接続文字列] をコピーします。Copy the first Connection String. この文字列は、後で Azure Storage と Azure Functions を統合する際に使用されます。This string is used to integrate Azure storage with your Azure Functions later on.

    キー 1 の情報

  9. Visual Studio for Mac に戻り、local.settings.jsonAzureWebJobsStorage 設定として完全な接続文字列を貼り付けます。Return to Visual Studio for Mac and paste the full connection string in as the AzureWebJobsStorage setting in local.settings.json. これで、リソースへのアクセスを必要とする、関数の属性の設定名を参照することができます。Now you can reference the name of the setting in attributes for functions that need access to its resources.

    接続キーが入力されたローカル設定ファイル

例 3:Azure Function の作成とデバッグExample 3: Creating and debugging an Azure Function

  1. これで、一部のコードの追加を開始する準備ができました。You're now ready to start adding some code. .NET クラス ライブラリで作業を行う場合は、Azure Functions が静的メソッドとして追加されます。When working with a .NET class library, Azure Functions are added as static methods. [ソリューション] ウィンドウ で、 [AzureFunctions] プロジェクト ノードを右クリックし、 [追加]、[関数の追加] の順に選択します。From the Solution Window, right-click the AzureFunctions project node and select Add > Add Function:

    [関数の追加] オプション

  2. [新しい Azure Functions] ダイアログで、Generic Webhook テンプレートを選択します。In the New Azure Functions dialog, select the Generic webhook template. 次のように、名前Add に設定し、 [OK] をクリックして関数を作成します。Set the Name to Add and click Ok to create your function:

    [新しい Azure Functions] ダイアログ

  3. 新しいファイルの先頭に、以下の using ディレクティブを追加します。At the top of the new file, add the using directives below:

    using Microsoft.Azure.WebJobs.Extensions.Http;
    using System.Web;
    using Microsoft.WindowsAzure.Storage.Table;
    
  4. 既存の Run メソッドを削除し、Azure Function としてクラスに以下のメソッドを追加します。Remove the existing Run method and add the method below to the class as your Azure Function:

    [FunctionName("Add")]
    public static int Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)]
    HttpRequestMessage req,
    TraceWriter log)
    {
        int x = 1;
        int y = 2;
    
        return x + y;
    }
    
  5. ここで、メソッドの定義を 1 つずつ説明していきます。Let's walk through the method definition piece by piece.

    最初に表示されるのは FunctionName 属性で、このメソッドを Azure Function としてマークします。The first thing you'll see is the FunctionName attribute that marks this method as an Azure Function. この属性は関数のパブリック名を指定します。The attribute designates the public name of the function. 属性名が、実際のメソッド名と一致する必要はありません。The attribute name doesn't need to match the actual method name.

    FunctionName 属性が強調表示されている新しい run メソッド

  6. 次に、メソッドは、必須である public static メソッドとしてマークされます。Next, the method is marked as a public static method, which is required. また、戻り値が int であることがわかります。メソッド属性を使用して特に指定されていない限り、Azure Function の非 void 戻り値はテキストとしてクライアントに返されます。You'll also notice that the return value is an int. Unless otherwise specified using method attributes, any non-void return value of an Azure Function is returned to the client as text. 既定では、XML として返されますが、JSON に変更することができます。この操作は、ラボで後から行います。By default it's returned as XML, but can be changed to JSON, which you'll do later on in the lab.

    メソッドの初期化が強調表示されている新しい run メソッド

  7. 最初のパラメーターは HttpTrigger 属性でマークされています。これは、このメソッドが HTTP 要求で呼び出されることを示します。The first parameter is marked with the HttpTrigger attribute, which indicates that this method is invoked by an HTTP request. この属性はメソッドの承認レベルと、サポートされる動詞 (ここでは "GET" のみ) も指定します。The attribute also specifies the authorization level of the method, as well as the verbs it supports (only "GET" in this case). 必要に応じて、Route を定義することもできます。これにより、メソッドへのパスがオーバーライドされ、パスから自動的に変数を抽出する手段が提供されます。You may also optionally define a Route that overrides the path to the method and offers a way to automatically extract variables from the path. ここでは Route が null であるため、このメソッドへのパスは既定で /api/Add になります。Since the Route is null here, the path to this method will default to /api/Add.

    パラメーターが強調表示されている新しい run メソッド

  8. メソッドに対する最後のパラメーターは TraceWriter で、これを使用して診断とエラーのメッセージをログに記録できます。The final parameter to the method is a TraceWriter that can be used to log messages for diagnostics and errors.

    TraceWriter が強調表示されている新しい run メソッド

  9. 行の余白をクリックして、メソッドの return 行にブレークポイントを設定します。Set a breakpoint on the return line of the method by clicking in the margin of the line:

    return 行に設定されたブレークポイント

  10. F5 キーを押すか、 [実行]、[デバッグの開始] の順に選択して、デバッグ セッションでプロジェクトをビルドして実行します。Build and run the project in a debug session by pressing F5 or selecting Run > Start Debugging. [実行] ボタンをクリックすることもできます。You could alternatively click the Run button. これらのオプションではすべて同じタスクが実行されます。These options all perform the same task. このラボの残りの部分では F5 キーを押しますが、一番使いやすい方法を使用できます。The rest of this lab references F5, but you can use the method you find most comfortable.

    プロジェクトをビルドして実行する

  11. プロジェクトを実行すると、端末アプリケーションが自動的に開きます。Running the project will automatically open the Terminal application.

  12. このプロジェクトでは、メソッドの属性と、この記事の後半で説明するファイル規則に基づいて、Azure Functions の検出プロセスを実行します。The project goes through a process of detecting Azure Functions based on method attributes and a file convention that is covered later in this article. この場合、単一の Azure Function が検出され、1 つのジョブ関数が "生成" されます。In this case, it detects a single Azure Function and "generates" 1 job function.

    端末での Azure Function の出力

  13. Azure Functions ホストは、スタートアップ メッセージの一番下に HTTP トリガー API の URL を出力します。At the bottom of the startup messages, the Azure Functions host prints the URLs of any HTTP trigger APIs. これは 1 つだけである必要があります。There should only be one. その URL をコピーし、新しいブラウザー タブで貼り付けます。Copy that URL and paste it in a new browser tab.

    Azure Function API の URL

  14. ブレークポイントはすぐにトリガーされます。The breakpoint should trigger immediately. Web 要求が関数にルーティングされ、デバッグできるようになりました。The web request has been routed to the function and can now be debugged. x 変数にポインタを合わせると、その値が表示されます。Mouse over the x variable to see its value.

    トリガーされたブレークポイント

  15. 以前に追加するために使用したのと同じ方法を使って、ブレークポイントを削除します (余白をクリックするか、行を選択して F9 キーを押す)。Remove the breakpoint using the same method used to add it earlier (click on the margin or select the line and press F9).

  16. F5 キーを押して実行を続行します。Press F5 to continue running.

  17. ブラウザーで、メソッドの XML 結果がレンダリングされます。In the browser, the XML result of the method will be rendered. 期待どおりに、ハードコーディングされた加算演算で妥当な合計が生成されます。As expected, the hardcoded addition operation produces a plausible sum. Safari で "3" のみが表示されている場合は、Safari、[環境設定]、[詳細] の順に移動し、 [メニュー バーに開発メニューを表示] チェック ボックスをオンにしてページを再度読み込みます。Note, if you only see "3" in Safari, go to Safari > Preferences > Advanced and tick the "Show Develop menu in menu bar" checkbox and reload the page.

  18. Visual Studio for Mac で、 [停止] ボタンをクリックしてデバッグ セッションを終了します。In Visual Studio for Mac, click the Stop button to end the debug session. 新しい変更が確実に選択されるように、必ずデバッグ セッションを再開 (停止してから実行) してください。To ensure that new changes are picked up, don't forget to restart (stop and then run) the debugging session.

    デバッグの停止オプション

  19. Run メソッドで、xy の定義を次のコードに置き換えます。In the Run method, replace the x and y definitions with the code below. このコードは URL のクエリ文字列から値を抽出し、指定されたパラメーターに基づいて、加算演算を動的に実行できるようにします。This code extracts values from the URL's query string so that the addition operation can be performed dynamically based on the provided parameters.

    var query = HttpUtility.ParseQueryString(req.RequestUri.Query);
    
    int x = int.Parse(query["x"]);
    
    int y = int.Parse(query["y"]);
    
    return x + y;
    
  20. アプリケーションを実行します。Run the application.

  21. ブラウザー ウィンドウに戻り、文字列 /?x=2&y=3 を URL に追加します。Return to the browser window and append the string /?x=2&y=3 to the URL. これで URL 全体は http://localhost:7071/api/Add?x=2&y=3 になるはずです。The whole URL should now be http://localhost:7071/api/Add?x=2&y=3. 新しい URL に移動します。Navigate to the new URL.

  22. この時点で、結果に新しいパラメーターが反映されるはずです。This time the result should reflect the new parameters. プロジェクトを異なる値で自由に実行してください。Feel free to run the project with different values. エラー チェックが行われていないため、パラメーターが無効であるか欠落している場合、エラーがスローされることに注意してください。Note that there isn't any error checking, so invalid or missing parameters will throw an error.

  23. デバッグ セッションを停止します。Stop the debugging session.

演習 4:function.json の操作Exercise 4: Working with function.json

  1. 前の演習では、ライブラリに定義されている Azure Function のジョブ関数が Visual Studio for Mac で生成されたことを示しました。In an earlier exercise, it was mentioned that Visual Studio for Mac "generated" a job function for the Azure Function defined in the library. これは、Azure Functions で実際に実行時にメソッド属性が使用されるのではなく、コンパイル時のファイル システム規則を使用して、Azure Functions を利用可能にする場所と方法を構成するためです。This is because Azure Functions doesn't actually use the method attributes at runtime, but rather uses a compile-time file system convention to configure where and how Azure Functions are made available. [ソリューション] ウィンドウ で、プロジェクト ノードを右クリックし、 [Finder で表示] を選択します。From the Solution Window, right-click on your project node and select Reveal in Finder.

    [Finder で表示] メニュー オプション

  2. bin/Debug/netstandard2.0 に到達するまで、ファイル システムを下に移動します。Navigate down the file system until you reach bin/Debug/netstandard2.0. Add という名前のフォルダーがあるはずです。There should be a folder named Add. このフォルダーは、C# コードの関数名属性に対応するように作成されています。This folder was created to correspond with the function name attribute in the C# code. Add フォルダーを展開して、単一の function.json ファイルを表示します。Expand the Add folder to reveal a single function.json file. このファイルは、Azure Function のホストと管理のためにランタイムによって使用されます。This file is used by the runtime to host and manage the Azure Function. コンパイル時サポートのないその他の言語モデル (C# スクリプトや JavaScript など) の場合は、これらのフォルダーを手動で作成して管理する必要があります。For other language models without compile-time support (such as C# script or JavaScript), these folders must be manually created and maintained. C# 開発者向けには、ビルド時に属性メタデータから自動的に生成されます。For C# developers, they are automatically generated from attribute metadata upon build. function.json を右クリックして選択し、Visual Studio で開きます。Right-click on function.json and select to open it in Visual Studio.

    ファイル ディレクトリの function.json

  3. このチュートリアルの前の手順を実行している場合は、C# 属性の基本的な知識があるはずです。Given the previous steps of this tutorial, you should have a basic understanding of C# attributes. それを考えれば、この JSON は見慣れたものです。Taking that into account, this JSON should look familiar. ただし、前の演習では説明されていない項目がいくつかあります。However, there are a few items that were not covered in earlier exercises. たとえば、binding にはそれぞれ direction が設定されている必要があります。For example, each binding must have its direction set. お察しのとおり、 "in" はパラメーターが入力されていることを意味し、 "out" はパラメーターが戻り値 ( $return 経由)、またはメソッドに対する out パラメーターであることを示します。As you might infer, "in" means that the parameter is input, whereas "out" indicates that the parameter is either a return value (via $return) or an out parameter to the method. アセンブリ内には、scriptFile (この最終的な場所に対して相対的) および entryPoint メソッド (パブリックまたは静的) を指定する必要もあります。You also need to specify the scriptFile (relative to this final location) and the entryPoint method (public and static) within the assembly. 次のいくつかの手順では、このモデルを使用してカスタム関数パスを追加するため、このファイルの内容をクリップボードにコピーします。In the next few steps you'll add a custom function path using this model, so copy the contents of this file to the clipboard.

    Visual Studio for Mac で開かれた function.json ファイル

  4. [ソリューション] ウィンドウ で、 [AzureFunctionsLab] プロジェクト ノードを右クリックし、 [追加] 、[新しいフォルダー] の順に選択します。In the Solution Window, right-click the AzureFunctionsLab project node and select Add > New Folder. 新しいフォルダーに Adder という名前を付けます。Name the new folder Adder. 既定の規則では、このフォルダーの名前で、api/Adder などの API へのパスが定義されます。By default convention, the name of this folder will define the path to the API, such as api/Adder.

    [新しいフォルダー] オプション

  5. Adder フォルダーを右クリックし、 [追加]、[新しいファイル] の順に選択します。Right-click the Adder folder and select Add > New File.

    [新しいファイル] オプション

  6. [Web] カテゴリ、 [空の JSON ファイル] テンプレートの順に選択します。Select the Web category and the Empty JSON File template. [名前]function に設定して、 [新規] をクリックします。Set the Name to function and click New.

    [空の JSON ファイル] オプション

  7. (手順 3 の) その他の function.json の内容を、新しく作成されたファイルの既定の内容に貼り付けて置き換えます。Paste the contents of the other function.json (from step 3) in to replace the default contents of the newly created file.

  8. json ファイルの先頭から、次の行を削除します。Remove the following lines from the top of the json file:

    "configurationSource":"attributes",
    "generatedBy":"Microsoft.NET.Sdk.Functions-1.0.13",
    
  9. 最初のバインドの末尾 ( "name": "req" 行の後) に、以下のプロパティを追加します。At the end of the first binding (after the "name": "req" line), add the properties below. 前の行には必ずコンマを含めてください。Don't forget to include a comma on the previous line. このプロパティによって既定のルートがオーバーライドされ、パスから int パラメーターが抽出され、x および y という名前のメソッド パラメーターに配置されるようになります。This property overrides the default root such that it will now extract int parameters from the path and place them into method parameters that are named x and y.

    "direction": "in",
    "route": "Adder/{x:int?}/{y:int?}"
    
  10. 最初のバインドの下に別のバインドを追加します。Add another binding underneath the first. このバインドは関数の戻り値を処理します。This binding handles the return value of the function. 前の行には必ずコンマを含めてください。Don't forget to include a comma on the previous line:

    {
    "name": "$return",
    "type": "http",
    "direction": "out"
    }
    
  11. また、以下に示すように、 "Add2" というメソッドを使用するように、ファイルの末尾の entryPoint プロパティを更新します。Also update the entryPoint property at the bottom of the file to use a method called "Add2", such as shown below. これは、api/Adder... というパスが、任意の名前 (ここでは Add2) を持つ適切なメソッドにマップできたことを示すためのもです。This is to illustrate that the path api/Adder... could map to an appropriate method with any name (Add2 here).

    "entryPoint": "<project-name>.<function-class-name>.Add2"
    
  12. 最終的な function.json ファイルは、次の json のようになります。Your final function.json file should look like the following json:

    {
    "bindings": [
        {
        "type": "httpTrigger",
        "methods": [
            "get"
        ],
        "authLevel": "function",
        "direction": "in",
        "name": "req",
        "route": "Adder/{x:int?}/{y:int?}"
        },
        {
        "name": "$return",
        "type": "http",
        "direction": "out"
        }
    ],
    "disabled": false,
    "scriptFile": "../bin/AzureFunctionsProject.dll",
    "entryPoint": "AzureFunctionsProject.Add.Add2"
    }
    
  13. このすべての作業を完了するために必要な最後の 1 つの手順は、このファイルを、変更のたびに出力ディレクトリの同じ相対パスにコピーするよう Visual Studio for Mac に指示することです。The one final step required to make this all work is to instruct Visual Studio for Mac to copy this file to the same relative path in the output directory every time it changes. ファイルを選択した状態で、右側のバーから [プロパティ] タブを選び、 [出力ディレクトリにコピー][新しい場合はコピーする] を選択します。With the file selected, choose the properties tab from the right-hand bar, and for Copy to output directory select Copy if newer:

    json ファイルの [プロパティ] オプション

  14. 予期される関数を実行するために、Add.csRun メソッド (属性を含む) を次のメソッドに置き換えます。In Add.cs, replace the Run method (including the attribute) with the following method to fulfill the expected function. 属性が使用されないことと、xy の明示的なパラメーターを持つことを除けば、Run と非常に似ています。It's very similar to Run, except that it uses no attributes and has explicit parameters for x and y.

    public static int Add2(
        HttpRequestMessage req,
        int x,
        int y,
        TraceWriter log)
    {
        return x + y;
    }
    
  15. F5 キーを押し、プロジェクトをビルドして実行します。Press F5 to build and run the project.

  16. ビルドが完了し、プラットフォームがスピンアップすると、新しく追加されたメソッドにマップされる要求に対して使用可能な 2 番目のルートがあることが示されます。As the build completes and platform spins up, it will now indicate that there is a second route available for requests that maps to the newly added method:

    http 関数の URL

  17. ブラウザー ウィンドウに戻り、 http://localhost:7071/api/Adder/3/5 に移動します。Return the browser window and navigate to http://localhost:7071/api/Adder/3/5.

  18. この時点でメソッドが再び動作し、パスからパラメーターがプルされ、合計が生成されます。This time the method works once again, pulling parameters from the path and producing a sum.

  19. Visual Studio for Mac に戻り、デバッグ セッションを終了します。Return to Visual Studio for Mac and end the debugging session.

演習 5:Azure ストレージ テーブルの操作Exercise 5: Working with Azure storage tables

多くの場合、ビルドするサービスは、これまでビルドしたものよりはるかに複雑で、実行にはかなりの時間またはインフラストラクチャが必要になることがあります。Often, the service you build might be much more complex than what we have built so far and require a significant amount of time and/or infrastructure to execute. その場合、リソースが利用可能になったときに処理のためキューに入れられた要求を受け入れることが効果的な場合があります。これは Azure Functions でサポートされています。In that case, you might find it effective to accept requests that are queued for processing when the resources become available, which Azure Functions provides support for. それ以外の場合は、一元的にデータを格納します。In other cases, you’ll want to store data centrally. Azure Storage のテーブルで、この操作をすばやく行うことができます。Azure Storage tables let you do that quickly.

  1. 以下のクラスを Add.cs に追加します。Add the class below to Add.cs. これは名前空間の中に記述すべきですが、ここでは既存のクラスの外に記述します。It should go inside the namespace, but outside the existing class.

    public class TableRow : TableEntity
    {
        public int X { get; set; }
        public int Y { get; set; }
        public int Sum { get; set; }
    }
    
  2. Add クラス内で、次のコードを追加して別の関数を導入します。Within the Add class, add the code below to introduce another function. これは HTTP 応答を伴わないという点で、これまでとは異なることに注意してください。Note that this one is unique so far in that it doesn't involve an HTTP response. 最終行は、パラメーターと合計だけでなく、後で簡単に取得できるようにする一部のキー情報 (PartitionKeyRowKey) が入力された新しい TableRow を返します。The final line returns a new TableRow populated with some key information that will make it easy to retrieve later on (PartitionKey and RowKey), as well as its parameters and sum. また、メソッド内のコードでは、関数がいつ実行されるかをより簡単に把握できるように TraceWriter が使用されます。The code within the method also uses the TraceWriter to make it easier to know when the function runs.

    [FunctionName("Process")]
    [return: Table("Results")]
    public static TableRow Process(
        [HttpTrigger(AuthorizationLevel.Function, "get",
            Route = "Process/{x:int}/{y:int}")]
        HttpRequestMessage req,
        int x,
        int y,
        TraceWriter log)
    {
        log.Info($"Processing {x} + {y}");
    
        return new TableRow()
        {
            PartitionKey = "sums",
            RowKey = $"{x}_{y}",
            X = x,
            Y = y,
            Sum = x + y
        };
    }
    
  3. F5 キーを押し、プロジェクトをビルドして実行します。Press F5 to build and run the project.

  4. ブラウザー タブで、 http://localhost:7071/api/Process/4/6 に移動します。In the browser tab, navigate to http://localhost:7071/api/Process/4/6. これにより別のメッセージがキューに入れられ、最終的には別の行がテーブルに追加されます。This will put another message into the queue, which should eventually result in another row being added to the table.

  5. 端末 に戻り、4 + 6 の受信要求を監視します。Return to Terminal and watch for the incoming request for 4 + 6.

    追加要求を示す端末出力

  6. ブラウザーに戻り、同じ URL への要求を更新します。Return to the browser to refresh the request to the same URL. この時点で、Process メソッドの後にエラーが表示されます。This time you'll see an error after the Process method. これは、コードが、既に存在するパーティションと行キーの組み合わせを使用して、Azure Table Storage テーブルに行を追加しようとしているためです。This is because the code is attempting to add a row to the Azure Table Storage table using a partition and row key combination that already exists.

    System.Private.CoreLib: Exception while executing function: Process. Microsoft.Azure.WebJobs.Host: Error while handling parameter $return after function returned:. Microsoft.Azure.WebJobs.Host: The specified entity already exists.
    
  7. デバッグ セッションを終了します。End the debugging session.

  8. エラーを軽減するには、TraceWriter パラメーターの直前のメソッド定義に次のパラメーターを追加します。To mitigate the error, add the following parameter to the method definition immediately before the TraceWriter parameter. このパラメーターは、結果を格納するために使用していた PartitionKeyResults テーブルから TableRow の取得を試みるよう Azure Functions プラットフォームに指示します。This parameter instructs the Azure Functions platform to attempt to retrieve a TableRow from the Results table on the PartitionKey we've been using to store results. ただし、本当の魔法のいくつかは、まったく同じメソッドの他の x および y パラメーターに基づいて RowKey が動的に生成されていることに気付いたときに起こります。However, some of the real magic comes into play when you notice that the RowKey is being dynamically generated based on the other x and y parameters for the very same method. その行が既に存在する場合、開発者に必要な追加作業が行われずにメソッドが開始されたときに、tableRow に含まれます。If that row already exists, then tableRow will have it when the method begins with no extra work required by the developer. 行が存在しない場合は、null だけとなります。If the row doesn't exist, then it'll just be null. このような効率性により、開発者はインフラストラクチャではなく、重要なビジネス ロジックに集中することができます。This sort of efficiency enables developers to focus on the important business logic and not the infrastructure.

    [Table("Results", "sums", "{x}_{y}")]
    TableRow tableRow,
    
  9. メソッドの先頭に次のコードを追加します。Add the code below to the beginning of the method. tableRow が null でない場合、演算結果は既に要求されており、すぐに返すことができます。If tableRow isn't null, then we already have the results for the operation being requested and can return it immediately. それ以外の場合、関数は以前のとおりに続行します。Otherwise, the function continues as before. これはデータを返す最も堅牢な方法でないかもしれませんが、わずかなコードで複数のスケーラブル層にわたる非常に洗練された演算を編成できることを示しています。While this may not be the most robust way to return the data, it illustrates the point that you can orchestrate incredibly sophisticated operations across multiple scalable tiers with very little code.

    if (tableRow != null)
    {
        log.Info($"{x} + {y} already exists");
        return null;
    }
    
  10. F5 キーを押し、プロジェクトをビルドして実行します。Press F5 to build and run the project.

  11. ブラウザー タブで、 http://localhost:7071/api/Process/4/6 の URL を更新します。In the browser tab, refresh the URL at http://localhost:7071/api/Process/4/6. このレコードのテーブル行は存在するため、エラーなしですぐに返されます。Since the table row for this record exists, it should return immediately and without error. HTTP 出力はないため、端末で出力を確認できます。Since there is no HTTP output, you can see the output in Terminal.

    テーブル行が既に存在することを示す端末出力

  12. URL を更新し、 http://localhost:7071/api/Process/5/7 など、まだテストされていない組み合わせを反映させます。Update the URL to reflect a combination not yet tested, such as http://localhost:7071/api/Process/5/7. テーブル行が (予期したとおりに) 見つからなかったことを示す、端末のメッセージに注意してください。Note the message in Terminal, which indicates that the table row was not found (as expected).

    新しいプロセスを示す端末出力

  13. Visual Studio for Mac に戻り、デバッグ セッションを終了します。Return to Visual Studio for Mac and end the debugging session.

まとめSummary

このラボでは、Visual Studio for Mac で Azure Functions のビルドを開始する方法を学習しました。In this lab, you've learned how to get started building Azure Functions with Visual Studio for Mac.