Visual Studio を使用する Azure Functions の開発

Visual Studio で、C# クラス ライブラリ関数を開発して、テストし、Azure にデプロイすることができます。 Azure Functions を初めて使用する場合は、「Azure Functions の概要」を参照してください。

Visual Studio には、関数の開発時の利点として次のようなことがあります。

  • ローカル開発用コンピューターで関数を編集、作成、および実行できます。
  • Azure Functions プロジェクトを Azure に直接発行し、必要に応じて Azure リソースを作成します。
  • C# 属性を使用して、C# コードで直接、関数のバインドを宣言できます。
  • コンパイル済み C# 関数を開発およびデプロイできます。 コンパイル済み関数では、C# スクリプト ベースの関数より優れたコールド スタート パフォーマンスが得られます。
  • Visual Studio 開発のすべての利点を得ながら、C# で関数をコーディングできます。

この記事では、Visual Studio を使って C# クラス ライブラリ関数を開発して Azure に発行する方法に関する詳細情報を提供します。 この記事を読む前に、Visual Studio 用の関数のクイックスタートに関するページを完了することをお勧めします。

特に明記されていない限り、ここで示す手順と例は Visual Studio 2019 のものです。

前提条件

  • Azure Functions Tools。 Azure Function Tools を追加するには、Visual Studio のインストールに Azure 開発 ワークロードを含めます。 Azure Functions Tools は、Visual Studio 2017 以降の Azure 開発ワークロードで使用できます。

  • Azure Storage アカウントなど、他の必要なリソースは、発行プロセス中にサブスクリプションに作成されます。

  • Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。

注意

Visual Studio 2017 では、Azure 開発ワークロードによって Azure Functions Tools が別個の拡張機能としてインストールされます。 Visual Studio 2017 のインストールを更新する場合、Azure Functions Tools の最新バージョンを使用していることを確認してください。 以下のセクションでは、Visual Studio 2017 の Azure Functions Tools 拡張機能を確認し、必要に応じて更新する方法について説明します。

Visual Studio 2019 を使用している場合は、これらのセクションをスキップします。

Visual Studio 2017 でツールのバージョンを確認する

  1. [ツール] メニューの [拡張機能と更新プログラム] を選択します。 [インストール済み] > [ツール] メニューを展開し、 [Azure Functions と Web ジョブ ツール] を選択します。

    Functions ツールのバージョンを確認する

  2. インストールされている [バージョン] をメモし、このバージョンを リリース ノートに記載されている最新バージョンと比較します。

  3. インストールされているバージョンが古い場合は、次のセクションの説明に従って Visual Studio でツールを更新します。

Visual Studio 2017 のツールを更新する

  1. [拡張機能と更新プログラム] ダイアログで、 [更新プログラム] > [Visual Studio Marketplace] を展開し、 [Azure Functions と Web ジョブ ツール][更新] の順に選択します。

    Functions ツールのバージョンを更新する

  2. ツールの更新プログラムがダウンロードされたら、 [閉じる] を選択し、Visual Studio を閉じて、VSIX インストーラーを使用してツールの更新をトリガーします。

  3. VSIX インストーラーで、 [変更] を選択してツールを更新します。

  4. 更新が完了したら、 [閉じる] を選択して Visual Studio を再起動します。

注意

Visual Studio 2019 以降では、Azure Functions ツールの拡張機能が Visual Studio の一部として更新されます。

Azure Functions プロジェクトを作成する

Visual Studio の Azure Functions プロジェクト テンプレートを使用すると、Azure の関数アプリに発行できる C# クラス ライブラリ プロジェクトを作成できます。 関数アプリを使用すると、リソースの管理、デプロイ、スケーリング、および共有を容易にするための論理ユニットとして関数をグループ化できます。

  1. Visual Studio メニューで、 [ファイル] > [新規] > [プロジェクト] を選択します。

  2. [新しいプロジェクトの作成] の検索ボックスに「functions」と入力し、Azure Functions テンプレートを選択してから、 [次へ] を選択します。

  3. [新しいプロジェクトの構成] で、プロジェクトの プロジェクト名 を入力し、 [作成] を選択します。 関数アプリ名は、C# 名前空間として有効である必要があります。そのため、アンダースコア、ハイフン、その他の英数字以外の文字は使用しないでください。

  4. [新しい Azure Functions アプリケーションの作成] 設定で、次の表の値を使用します。

    設定 説明
    .NET のバージョン .NET Core 3 (LTS) この値により、Azure Functions ランタイムのバージョン 3.x でインプロセスを実行する関数プロジェクトが作成されます。 Azure Functions 1.x では、.NET Framework がサポートされます。 詳細については、「Azure Functions ランタイム バージョンをターゲットにする方法」をご覧ください。
    関数テンプレート HTTP トリガー この値は、HTTP 要求によってトリガーされる関数を作成します。
    ストレージ アカウント (AzureWebJobsStorage) ストレージ エミュレーター Azure の関数アプリにはストレージ アカウントが必要であるため、プロジェクトを Azure に発行する際に割り当てられるか、作成されます。 HTTP トリガーによって、Azure Storage アカウントの接続文字列が使用されることはありません。その他のすべてのトリガーの種類には、有効な Azure Storage アカウントの接続文字列が必要です。
    承認レベル Anonymous 作成される関数を、すべてのクライアントがキーを使用せずにトリガーできます。 この承認設定により、新しい関数のテストが容易になります。 キーと承認の詳細については、「承認キー」と HTTP と Webhook のバインドに関するページをご覧ください。

    Azure Functions プロジェクトの設定

    [承認レベル][匿名] に設定していることを確認します。 関数 の既定のレベルを選択した場合、関数エンドポイントにアクセスする要求で、関数キーを提示する必要があります。

  5. [作成] を選択して、関数プロジェクトと HTTP トリガー関数を作成します。

Azure Functions プロジェクトを作成した後、プロジェクト テンプレートを使用して C# プロジェクトを作成し、Microsoft.NET.Sdk.Functions NuGet パッケージをインストールし、ターゲット フレームワークを設定します。 新しいプロジェクトには次のファイルが含まれます。

  • host.json:Functions のホストを構成できます。 これらの設定は、ローカルでの実行時と Azure での実行時の両方に適用されます。 詳細については、host.json のリファレンスを参照してください。

  • local.settings.json:関数をローカルで実行するときに使用される設定を保持します。 Azure で実行している場合、これらの設定は使用されません。 詳細については、「ローカル設定ファイル」を参照してください。

    重要

    local.settings.json ファイルにはシークレットを含めることができるため、それをプロジェクト ソース管理から除外する必要があります。 このファイルの [出力ディレクトリにコピー] 設定が [新しい場合はコピーする] に設定されていることを確認します。

詳細については、「関数クラス ライブラリ プロジェクト」を参照してください。

ローカル設定

Azure の関数アプリで実行する場合、関数に必要な設定はアプリ設定に安全に保存されます。 ローカル開発中は、これらの設定はその代わりに local.settings.json ファイルの Values オブジェクトに追加されます。 local.settings.json ファイルには、ローカルの開発ツールによって使用される設定も格納されます。

local.settings.json には接続文字列などのシークレットが含まれている場合があるため、リモート リポジトリには絶対に格納しないようにしてください。 ローカル設定の詳細については、「ローカル設定ファイル」を参照してください。

プロジェクトを発行しても、Visual Studio では local.settings.json の設定が自動的にアップロードされません。 これらの設定が Azure の Function App にも確実に存在するようにするには、プロジェクトを発行した後にそれらをアップロードします。 詳細については、「Function App の設定」を参照してください。 ConnectionStrings コレクション内の値は発行されません。

コードを使用して、Function App の設定値を環境変数として読み取ることもできます。 詳細については、「環境変数」を参照してください。

ビルド出力設置を構成する

Azure Functions プロジェクトをビルドするときに、Functions ランタイムと共有されているアセンブリのコピーが 1 つだけ保持されるように、ビルド ツールによって出力が最適化されます。 その結果、可能な限り多くの領域を節約できるようにビルドが最適化されます。 ただし、プロジェクト アセンブリのより新しいバージョンに移行する場合、これらのアセンブリを保持する必要があることが、ビルド ツールに認識されない可能性があります。 これらのアセンブリが最適化プロセス中に保持されるようにするには、プロジェクト (.csproj) ファイルの FunctionsPreservedDependencies 要素を使用してこれらのアセンブリを指定できます。

  <ItemGroup>
    <FunctionsPreservedDependencies Include="Microsoft.AspNetCore.Http.dll" />
    <FunctionsPreservedDependencies Include="Microsoft.AspNetCore.Http.Extensions.dll" />
    <FunctionsPreservedDependencies Include="Microsoft.AspNetCore.Http.Features.dll" />
  </ItemGroup>

ローカル開発用のプロジェクトを構成する

Functions ランタイムでは内部的に Azure Storage アカウントを使用します。 HTTP と Webhook 以外のすべてのトリガーの種類について、Values.AzureWebJobsStorage キーを有効な Azure Storage アカウントの接続文字列に設定します。 Function App では、プロジェクトに必要な AzureWebJobsStorage 接続設定に Azure ストレージ エミュレーターを使用することもできます。 エミュレーターを使用するには、AzureWebJobsStorage の値を UseDevelopmentStorage=true に設定します。 この設定は、デプロイ前に実際のストレージ アカウント接続文字列に変更します。

ストレージ アカウントの接続文字列を設定するには、次のようにします。

  1. Visual Studio で、 [表示] > [Cloud Explorer] を選択します。

  2. Cloud Explorer[ストレージ アカウント] を展開し、お使いのストレージ アカウントを選択します。 [プロパティ] タブで、 [プライマリ接続文字列] の値をコピーします。

  3. プロジェクトで、local.settings.json ファイルを開き、コピーした接続文字列に AzureWebJobsStorage キーの値を設定します。

  4. 前の手順を繰り返し、関数に必要なその他のすべての接続について、Values 配列に一意のキーを追加します。

プロジェクトに関数を追加する

C# クラス ライブラリ関数では、関数で使用されるバインドはコードで属性を適用することで定義されます。 提供されているテンプレートから関数トリガーを作成する場合は、トリガー属性が適用されます。

  1. ソリューション エクスプローラー で、プロジェクト ノードを右クリックし、 [追加] > [新しいアイテム] の順に選択します。

  2. [Azure 関数] を選択し、クラスの [名前] を入力して [追加] を選択します。

  3. トリガーを選択し、バインドのプロパティを設定して、 [OK] を選択します。 次の例は、Queue storage トリガー関数を作成する場合の設定を示しています。

    Queue storage トリガー関数を作成する

    このトリガーの例では、QueueStorage という名前のキーと共に接続文字列を使用します。 この接続文字列の設定は、local.settings.json ファイルで定義します。

  4. 新しく追加されたクラスを確認します。 FunctionName 属性で属性が指定された静的 Run() メソッドを確認します。 この属性は、メソッドが関数のエントリ ポイントであることを示します。

    たとえば、次の C# クラスは基本的な Queue storage トリガー関数を表します。

    using System;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Host;
    using Microsoft.Extensions.Logging;
    
    namespace FunctionApp1
    {
        public static class Function1
        {
            [FunctionName("QueueTriggerCSharp")]
            public static void Run([QueueTrigger("myqueue-items", 
                Connection = "QueueStorage")]string myQueueItem, ILogger log)
            {
                log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
            }
        }
    }
    

バインド固有の属性は、エントリ ポイント メソッドに指定された各バインド パラメーターに適用されます。 属性ではパラメーターとしてバインド情報を取ります。 前の例では、Queue storage トリガー関数を示す QueueTrigger 属性が最初のパラメーターに適用されています。 キュー名および接続文字列の設定名は、パラメーターとして QueueTrigger 属性に渡されます。 詳細については、Azure Functions での Azure Queue ストレージのバインドに関する記事を参照してください。

上記の手順を使用して、複数の関数を Function App プロジェクトに追加します。 プロジェクト内の各関数で異なるトリガーを使用できますが、1 つの関数には 1 つのトリガーのみを使用する必要があります。 詳しくは、「Azure Functions でのトリガーとバインドの概念」をご覧ください。

バインドの追加

トリガーと同じように、入力バインドと出力バインドも、バインド属性として関数に追加されます。 以下のように、関数にバインドを追加します。

  1. プロジェクトをローカル開発用に構成したことを確認します。

  2. 特定のバインディングに適した NuGet 拡張機能パッケージを追加します。

    詳細については、「Visual Studio を使用する C# クラス ライブラリ」を参照してください。 バインド固有の NuGet パッケージの要件については、バインドの参照記事で確認します。 たとえば、Event Hubs トリガーのパッケージ要件については、Event Hubs のバインドの参照記事を参照してください。

  3. バインドが必要なアプリ設定がある場合は、ローカル設定ファイルValues コレクションに追加します。

    この関数では、ローカルで実行するときにこれらの値を使用します。 関数が Azure の Function App で実行される場合は、Function App の設定が使用されます。

  4. 適切なバインド属性をメソッド シグネチャに追加します。 次の例では、キュー メッセージによって関数がトリガーされ、出力バインドによって、同じテキストの新しいキュー メッセージが別のキューに作成されます。

    public static class SimpleExampleWithOutput
    {
        [FunctionName("CopyQueueMessage")]
        public static void Run(
            [QueueTrigger("myqueue-items-source", Connection = "AzureWebJobsStorage")] string myQueueItem, 
            [Queue("myqueue-items-destination", Connection = "AzureWebJobsStorage")] out string myQueueItemCopy,
            ILogger log)
        {
            log.LogInformation($"CopyQueueMessage function processed: {myQueueItem}");
            myQueueItemCopy = myQueueItem;
        }
    }
    

    Queue Storage への接続は、AzureWebJobsStorage 設定から取得されます。 詳しくは、特定のバインドの参照記事をご覧ください。

この表は、Azure Functions のメジャー バージョンのランタイムでサポートされているバインディングを示しています。

種類 1.x 2.x 以降1 トリガー 入力 Output
Blob Storage
Azure Cosmos DB
Dapr3
Event Grid
Event Hubs
HTTP と Webhook
IoT Hub
Kafka2
Mobile Apps
Notification Hubs
Queue Storage
RabbitMQ2
SendGrid
Service Bus
SignalR
Table Storage
Timer
Twilio

1 バージョン 2.x ランタイム以降では、HTTP と Timer を除くすべてのバインドを登録する必要があります。 「バインディング拡張機能を登録する」を参照してください。

2 トリガーは従量課金プランでサポートされていません。 ランタイム駆動のトリガーが必要です。

3 Kubernetes、IoT Edge、およびその他の自己ホスト型モードでのみサポートされます。

関数のテスト

Azure Functions Core Tools を使用すると、ローカルの開発用コンピューター上で Azure Functions プロジェクトを実行できます。 詳細については、「Azure Functions Core Tools の操作」を参照してください。 Visual Studio から初めて関数を起動すると、これらのツールをインストールするよう求めるメッセージが表示されます。

Visual Studio で関数をテストするには:

  1. F5 キーを押す。 メッセージが表示されたら、Visual Studio からの要求に同意し、Azure Functions Core (CLI) ツールをダウンロードしてインストールします。 また、ツールで HTTP 要求を処理できるように、ファイアウォールの例外を有効にすることが必要になる場合もあります。

  2. プロジェクトを実行して、デプロイ済みの関数をテストする場合と同じようにコードをテストします。

    詳細については、「Azure Functions のコードをテストするための戦略」を参照してください。 Visual Studio をデバッグ モードで実行すると、想定どおりにブレークポイントにヒットします。

Azure に発行する

Visual Studio から発行する場合、次の 2 つのデプロイ方法のいずれかを使用します。

次の手順を使用して、プロジェクトを Azure の Function App に発行します。

  1. ソリューション エクスプローラー でプロジェクトを右クリックし、 [発行] を選択します。 [ターゲット][Azure] を選択し、 [次へ] を選択します。

  2. [特定のターゲット] で、 [Azure Function App (Windows)](Azure 関数アプリ (Windows)) を選択します。これで、Windows で動作する関数アプリが作成されます。

  3. [Function Instance](関数インスタンス) で、 [Create a new Azure Function](新しい Azure 関数の作成) を選択します。

    新しい関数アプリ インスタンスの作成

  4. 次の表に示されている値を使用して、新しいインスタンスを作成します。

    設定 説明
    名前 グローバルに一意の名前 新しい関数アプリを一意に識別する名前。 この名前をそのまま使用するか、新しい名前を入力します。 有効な文字は、a-z0-9- です。
    サブスクリプション 該当するサブスクリプション 使用する Azure サブスクリプション。 このサブスクリプションを承諾するか、ドロップダウン リストから新しいものを選択します。
    リソース グループ リソース グループの名前 関数アプリを作成するリソース グループ。 ドロップダウン リストから既存のリソース グループを選択するか、または [新規] を選択して新しいリソース グループを作成します。
    プランの種類 従量課金 従量課金プランで実行される関数アプリにプロジェクトを発行する場合は、関数アプリの実行に対してのみお支払いください。 他のホスティング プランでは、コストが高くなります。
    場所 App Service の場所 最寄りの リージョンまたは関数がアクセスする他のサービスの近くのリージョン内の [場所] を選択します。
    Azure Storage 汎用ストレージ アカウント Functions Runtime には Azure Storage アカウントが必須です。 [新規] を選択して汎用ストレージ アカウントを構成します。 または、ストレージ アカウントの要件を満たす既存のアカウントを選択することもできます。

    [App Service の作成] ダイアログ

  5. [作成] を選択して、関数アプリとその関連リソースを Azure で作成します。 リソース作成のステータスがウィンドウの左下に表示されます。

  6. [Functions instance](関数インスタンス) に戻り、 [Run from package file](パッケージ ファイルから実行する) がオンになっていることを確認します。 関数アプリは、Zip Deploy を使用して、Run-From-Package モードが有効な状態でデプロイされます。 これは、パフォーマンスが向上するため、関数プロジェクトの推奨されるデプロイ方法です。

    プロファイル作成の完了

  7. [完了] を選択し、[発行] ページで [発行] を選択して、プロジェクト ファイルを含むパッケージを Azure の新しい関数アプリにデプロイします。

    デプロイが完了すると、 [発行] タブに Azure の関数アプリのルート URL が表示されます。

  8. [発行] タブで、 [Cloud Explorer で管理する] を選択します。 これにより、Cloud Explorer で新しい関数アプリ Azure リソースが開かれます。

    発行成功のメッセージ

    Cloud Explorer を使用すると、Visual Studio でサイトのコンテンツを表示し、関数アプリを開始および停止し、Azure の関数アプリ リソースを直接および Azure portal で参照できます。

Function App の設定

プロジェクトを発行しても、Visual Studio ではこれらの設定が自動的にアップロードされないため、local.settings.json に追加したすべての設定は、Azure の Function App にも追加する必要があります。

Azure の Function App に必要な設定をアップロードする最も簡単な方法は、プロジェクトが正常に発行された後に表示される [Azure App Service の設定を管理する] リンクを選択することです。

[発行] ウィンドウの設定

このリンクを選択すると、Function App の [アプリケーションの設定] ダイアログが表示され、ここで新しいアプリケーション設定を追加したり、既存の設定を変更したりできます。

アプリケーションの設定

[ローカル] には local.settings.json ファイルの設定値が表示され、 [リモート] には Azure の Function App の現在の設定値が表示されます。 新しいアプリ設定を作成するには、 [設定の追加] を選択します。 [ローカルから値を挿入する] リンクを使用して、設定値を [リモート] フィールドにコピーします。 [OK] を選択すると、保留中の変更がローカル設定ファイルと Function App に書き込まれます。

注意

既定では、local.settings.json ファイルはソース管理にチェックインされません。 これは、ソース管理からローカル関数プロジェクトを複製するときに、プロジェクトに local.settings.json ファイルがないことを意味します。 この場合、 [アプリケーション設定] ダイアログが期待どおりに動作するように、プロジェクトのルートに local.settings.json ファイルを手動で作成する必要があります。

以下のいずれかの方法を使用して、アプリケーション設定を管理することもできます。

関数の監視

関数の実行を監視するための推奨される方法は、Function App を Azure Application Insights と統合することです。 Azure Portal で Function App を作成する場合、この統合は、既定で自動的に行われます。 ただし、Visual Studio の発行中に Function App を作成する場合は、Azure で Function App の統合は実行されません。 Application Insights を関数アプリに接続する方法については、「Application Insights との統合を有効にする」を参照してください。

Application Insights を使用した監視の詳細については、「Azure Functions を監視する」を参照してください。

次のステップ

Azure Functions Core Tools の詳細については、「Azure Functions Core Tools の操作」を参照してください。

.NET クラス ライブラリとしての関数の開発の詳細については、「Azure Functions C# 開発者向けリファレンス」を参照してください。 この記事は、Azure Functions でサポートされる各種バインドを宣言するための属性の使用例にもリンクしています。