Azure Functions をローカルでコーディングしてテストする

Azure Functions の開発やテストは、Azure Portal で行うことができますが、多くの開発者は、ローカル開発エクスペリエンスを好みます。 Functions を使用すると、ローカル コンピューター上で簡単に、お気に入りのコード エディターや開発ツールを使用して、関数を作成し、テストすることができます。 ローカル関数はライブ Azure サービスに接続できるため、完全な Functions ランタイムを使用してローカル コンピューター上で関数をデバッグすることができます。

この記事には、ご希望の言語に対応した特定の開発環境へのリンクがあります。 また、ローカル開発に関する共有ガイダンスもいくつかあります。たとえば、local.settings.json ファイルに対する操作などです。

ローカル開発環境

ローカル コンピューター上で関数を開発する方法は、言語とツールの設定によって異なります。 ローカル開発をサポートする環境を次の表に示します。

環境 言語 説明
Visual Studio Code C# (インプロセス)
C# (分離ワーカー プロセス)
JavaScript
PowerShell
Python
VS Code 用の Azure Functions 拡張は、VS Code に対して Functions サポートを追加します。 Core Tools が必要です。 Core Tools のバージョン 2.x を使用した場合は、Linux、macOS、および Windows 上での開発がサポートされます。 詳細については、「Create your first function using Visual Studio Code」 (Visual Studio Code を使用して最初の関数を作成する) を参照してください。
コマンド プロンプトまたはターミナル C# (インプロセス)
C# (分離ワーカー プロセス)
JavaScript
PowerShell
Python
Azure Functions Core Tools は、関数を作成するためのコア ランタイムとテンプレートを提供しており、これにより、ローカル開発が可能です。 バージョン 2.x では、Linux、macOS、および Windows 上での開発がサポートされています。 すべての環境は、ローカル Functions ランタイムとして、Core Tools を利用します。
Visual Studio C# (インプロセス)
C# (分離ワーカー プロセス)
Azure Functions Tools は、Visual Studio 2019 以降の Visual StudioAzure 開発ワークロードに含まれています。 クラス ライブラリの関数をコンパイルして .dll を Azure に発行できます。 ローカル テスト用の Core Tools が含まれています。 詳細については、「Develop Azure Functions using Visual Studio」(Visual Studio を使用して Azure Functions を開発する) を参照してください。
Maven (各種) Java Maven アーキタイプは、Java 関数の開発を可能にする Core Tools をサポートしています。 バージョン 2.x では、Linux、macOS、および Windows 上での開発がサポートされています。 詳細については、「Create your first function with Java and Maven」(Java および Maven を使用して、最初の関数を作成する) を参照してください。 EclipseIntelliJ IDEA を使った開発もサポートされます。

Note

Azure portal での関数コードの編集には制限があるため、関数をローカルで開発し、コード プロジェクトを Azure の関数アプリに発行する必要があります。 詳細については、「Azure portal での開発の制限事項」をご覧ください。

これらの各ローカル開発環境では、関数アプリ プロジェクトを作成し、事前定義の関数テンプレートを使用して新しい関数を作成できます。 各環境では、Core Tools が使用されています。そのため、マシン上の実際の Functions ランタイムに対して、その他のアプリの場合と同様に関数をテストしたり、デバッグしたりできます。 また、これらのどの環境からでも、関数アプリ プロジェクトを Azure に発行できます。

ローカル プロジェクト ファイル

Functions プロジェクト ディレクトリでは、言語に関係なく、次のファイルがプロジェクトのルート フォルダーに含まれます。

ファイル名 説明
host.json 詳細については、「host.json のリファレンス」を参照してください。
local.settings.json アプリ設定など、ローカルで実行する場合に Core Tools によって使用される設定。 詳細については、「ローカル設定ファイル」を参照してください。
.gitignore local.settings.json ファイルが誤って Git リポジトリに発行されないようにします。 詳細については、「ローカル設定ファイル」を参照してください。
.vscode\extensions.json Visual Studio Code でプロジェクト フォルダーを開く際に使用される設定ファイル。

プロジェクト内の他のファイルは、言語と特定の関数によって異なります。 詳細については、使用している言語の開発者ガイドを参照してください。

ローカル設定ファイル

local.settings.json ファイルには、アプリの設定、およびローカルの開発ツールによって使用される設定が格納されます。 local.settings.json ファイル内の設定は、プロジェクトをローカルで実行している場合にのみ使用されます。 プロジェクトを Azure に発行するときは、関数アプリのアプリ設定にも必要な設定を必ず追加してください。

重要

local.settings.json には接続文字列などのシークレットが含まれている場合があるため、リモート リポジトリには絶対に格納しないようにしてください。 Functions をサポートするツールを使用すると、local.settings.json ファイル内の設定を、プロジェクトをデプロイしている関数アプリのアプリ設定と同期できます。

ローカル設定ファイルの構造は次のとおりです。

{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "<language worker>",
    "AzureWebJobsStorage": "<connection-string>",
    "MyBindingConnection": "<binding-connection-string>",
    "AzureWebJobs.HttpExample.Disabled": "true"
  },
  "Host": {
    "LocalHttpPort": 7071,
    "CORS": "*",
    "CORSCredentials": false
  },
  "ConnectionStrings": {
    "SQLConnectionString": "<sqlclient-connection-string>"
  }
}

これらの設定は、プロジェクトをローカルで実行する場合にサポートされます。

設定 説明
IsEncrypted この設定を true にすると、すべての値がローカル コンピューターのキーを使用して暗号化されます。 func settings コマンドと共に使用されます。 既定値は false です。 サービス接続文字列など、シークレットが local.settings.json に含まれている場合、それをローカル コンピューター上で暗号化することができます。 実行時には、ホストが設定の暗号化を自動的に解除します。 ローカルで暗号化された設定の読み取りを試す前に、func settings decrypt コマンドを使用してください。
Values プロジェクトをローカルで実行するときに使用されるアプリケーション設定のコレクションです。 これらのキーと値 (文字列と文字列) のペアは、AzureWebJobsStorage など、Azure 内の関数アプリでのアプリケーション設定に対応します。 多くのトリガーおよびバインドには、ConnectionConnection など、接続文字列アプリ設定を参照するプロパティがあります。 これらのプロパティでは、Values 配列にアプリケーション設定を定義する必要があります。 よく使用される設定の一覧については、後ろの表を参照してください。
値は、JSON オブジェクトまたは配列ではなく文字列である必要があります。 設定名に、2 つの連続する下線 (:) を含めることはできません。コロン (__) も含めないようにしてください。 二重下線文字はランタイムによって予約されています。また、コロンは依存関係の挿入をサポートするために予約されています。
Host このセクションの設定により、ローカルでプロジェクトを実行するときの Functions ホスト プロセスをカスタマイズできます。 これらの設定は、Azure でプロジェクトを実行するときにも適用される、host.json 設定とは別のものです。
LocalHttpPort ローカルの Functions ホストの実行時に使用される既定のポートを設定します (func host startfunc run)。 --port コマンド ライン オプションは、この設定より優先されます。 たとえば、Visual Studio IDE で実行する場合、[プロジェクトのプロパティ] の [デバッグ] ウィンドウに移動し、"アプリケーション引数" フィールドから入力できる host start --port <your-port-number> コマンドに、ポート番号を明示的に指定することで、ポート番号を変更できます。
CORS クロス オリジン リソース共有 (CORS) で許可されるオリジンを定義します。 スペースなしのコンマ区切りのリストでオリジンを指定します。 ワイルドカード値 (*) がサポートされており、これによって任意のオリジンからの要求を許可できます。
CORSCredentials true に設定すると、withCredentials 要求が許可されます。
ConnectionStrings コレクション。 関数のバインディングで使用される接続文字列にこのコレクションを使用しないでください。 このコレクションは、Entity Framework など、構成ファイルの ConnectionStrings セクションから接続文字列を取得するのが一般的なフレームワークでのみ使用されます。 このオブジェクト内の接続文字列は、System.Data.SqlClient のプロバイダーの種類と共に、環境に追加されます。 他のアプリ設定では、このコレクション内の項目は Azure に発行されません。 ご自分の関数アプリの設定の Connection strings コレクションに、これらの値を明示的に追加する必要があります。 関数コードで SqlConnection を作成する場合は、接続文字列の値を他の接続と共に、ポータル内のアプリケーション設定に格納する必要があります。

次のアプリケーション設定は、ローカルでの実行時に Values 配列に含めることができます。

設定 説明
AzureWebJobsStorage ストレージ アカウント接続文字列、または
UseDevelopmentStorage=true
Azure ストレージ アカウントの接続文字列を含みます。 HTTP 以外のトリガーを使用する場合には必須です。 詳しくは、AzureWebJobsStorage のリファレンスを参照してください。
Azurite エミュレーターがローカルにインストールされ、AzureWebJobsStorageUseDevelopmentStorage=true に設定すると、Core Tools でエミュレーターが使用されます。 詳細については、ローカル ストレージ エミュレーターに関するページを参照してください。
AzureWebJobs.<FUNCTION_NAME>.Disabled true|false ローカルで実行しているときに関数を無効にするには、"AzureWebJobs.<FUNCTION_NAME>.Disabled": "true" をコレクションに追加します。<FUNCTION_NAME> は関数の名前です。 詳細については、Azure Functions で関数を無効にする方法に関する記事を参照してください。
FUNCTIONS_WORKER_RUNTIME dotnet
dotnet-isolated
node
java
powershell
python
Functions ランタイムのターゲット言語を示します。 バージョン 2.x 以上の Functions ランタイムで必須です。 この設定は、お客様のプロジェクト用に Core Tools によって生成されます。 詳細については、FUNCTIONS_WORKER_RUNTIME のリファレンスを参照してください。
FUNCTIONS_WORKER_RUNTIME_VERSION ~7 ローカルでの実行時に PowerShell 7 を使用することを示します。 設定されていない場合は、PowerShell Core 6 が使用されます。 この設定は、ローカルでの実行時にのみ使用されます。 Azure で実行する場合、PowerShell ランタイムのバージョンは、powerShellVersion サイト構成設定によって決まります。これは、ポータルで設定できます。

設定を同期する

関数をローカルで開発する場合、アプリで必要なローカル設定は、コードがデプロイされる関数アプリのアプリ設定にも存在する必要があります。 場合によっては、関数アプリからローカル プロジェクトに現在の設定をダウンロードする必要もあります。 Azure portal でアプリ設定を手動で構成できますが、次のツールを使用すると、アプリ設定をプロジェクトのローカル設定と同期することもできます。

トリガーとバインド

関数をローカルで開発する場合は、トリガーとバインドの動作を考慮する必要があります。 HTTP トリガーの場合は、http://localhost/ を使用して、ローカル コンピューターで HTTP エンドポイントを簡単に呼び出せます。 HTTP 以外のトリガー関数の場合、ローカルで実行するためのオプションがいくつかあります。

  • ローカル開発時にバインディングをテストする最も簡単な方法は、ライブ Azure サービスを対象とする接続文字列を使用することです。 local.settings.json ファイルの Values 配列に適切な接続文字列設定を追加することで、ライブ サービスをターゲットにすることができます。 これを行うと、テスト中のローカル実行がライブ サービス データに影響します。 このため、開発とテスト中に使用する個別のサービスを設定し、運用環境では異なるサービスに切り替える方法をご検討ください。
  • ストレージ ベースのトリガーの場合は、ローカル ストレージ エミュレーターを使用できます。
  • 特別な管理者エンドポイントを使用して、HTTP 以外のトリガー関数を手動で実行できます。 詳細については、「HTTP によってトリガーされない関数を手動で実行する」を参照してください。

ローカル テスト中は、Core Tools (func.exe) によって提供されるホストをローカルで実行している必要があります。 詳細については、「Azure Functions Core Tools」を参照してください。

ローカル ストレージ エミュレーター

ローカル開発時に、リモート ストレージ サービスに接続しなくても、Azure Storage バインド (Queue Storage、Blob Storage、Table Storage) で関数をテストするときに、ローカル Azurite エミュレーター を使用できます。 Azurite は Visual Studio Code および Visual Studio と統合されており、npm を使用してコマンド プロンプトから実行することもできます。 詳細については、ローカルでの Azure Storage の開発に Azurite エミュレーターを使用する方法に関するページを参照してください。

local.settings.json ファイルのValuesコレクション内の次の設定は、既定の AzureWebJobsStorage の接続に Azurite を使用するようにローカル Functions ホストに指示します。

"AzureWebJobsStorage": "UseDevelopmentStorage=true"

この設定値を使用すると、AzureWebJobsStorage を接続として使用するすべての Azure Storage トリガーまたはバインドが、ローカルで実行されている場合に Azurite に接続されます。 ローカル実行中にストレージ エミュレーションを使用する場合は、次の考慮事項に留意してください。

  • Azurite がインストールされ、実行されている必要があります。
  • Azure に発行する前に、Azure サービスへの実際のストレージ接続を使用してテストする必要があります。
  • プロジェクトを発行するときは、AzureWebJobsStorage 設定を UseDevelopmentStorage=true として発行しないでください。 Azure では、AzureWebJobsStorage 設定は常に、関数アプリで使用されるストレージ アカウントの接続文字列である必要があります。 詳細については、AzureWebJobsStorageを参照してください。

次のステップ