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

Azure Portal では Azure Functions の開発用およびテスト用ツールの完全なセットが提供されていますが、多くの開発者はローカルでの開発を選択します。 Azure Functions では、お気に入りのコード エディターとローカル開発ツールを使用して、ローカル コンピューターで簡単に関数を開発し、テストできます。 独自の関数を使用して Azure でイベントをトリガーし、ローカル コンピューターで C# 関数や JavaScript 関数をデバッグできます。

Visual Studio C# の開発者は、Azure Functions を Visual Studio 2017 に統合することもできます。

Azure Functions Core Tools のインストール

Azure Functions Core Tools は、ローカル バージョンの Azure Functions ランタイムで、ローカルの開発コンピューターで実行できます。 エミュレーターまたはシミュレーターではありません。 Azure で Functions を実行するランタイムと同じです。 Azure Functions Core Tools には 2 つのバージョンがあります。1 つはランタイムのバージョン 1.x 用、もう 1 つはバージョン 2.x 用です。 両方のバージョンは npm パッケージとして用意されています。

注意

いずれかのバージョンをインストールする前に、npm を含む NodeJS をインストールする必要があります。 2x バージョンのツールの場合、Node.js 8.5 以降のバージョンのみがサポートされています。

バージョン 1.x ランタイム

元のバージョンのツールは、Functions 1.x ランタイムを使用します。 このバージョンは .NET Framework を使用し、Windows コンピューターでのみサポートされます。 次のコマンドを使用して、バージョン 1.x ツールをインストールします。

npm install -g azure-functions-core-tools

バージョン 2.x ランタイム

バージョン 2.x のツールは、.NET Core 上に構築されている Azure Functions ランタイム 2.x を使用します。 このバージョンは、.NET Core 2.x がサポートするすべてのプラットフォームでサポートされています。 クロスプラットフォーム開発時、または Functions ランタイム 2.x が必要なときに、このバージョンを使用します。

重要

Azure Functions Core Tools をインストールする前に、.NET Core 2.0 をインストールします。

Azure Functions ランタイム 2.0 はプレビュー段階であり、現在のところ、Azure Functions のすべての機能はサポートされていません。 詳細については、「Azure Functions runtime 2.0 known issues」(Azure Functions ランタイム 2.0 の既知の問題) を参照してください

次のコマンドを使用して、バージョン 2.0 ツールをインストールします。

npm install -g azure-functions-core-tools@core

Ubuntu にインストールする場合は、次のように sudo を使用します。

sudo npm install -g azure-functions-core-tools@core

macOS および Linux 上にインストールする場合、次のように unsafe-perm フラグを含める必要があります。

sudo npm install -g azure-functions-core-tools@core --unsafe-perm true

Azure Functions Core Tools の実行

Azure Functions Core Tools で追加されるコマンドのエイリアスを次に示します。

  • func
  • azfun
  • azurefunctions

これらすべてのエイリアスは、func が例に示されている場所で使用できます。

func init MyFunctionProj

ローカル関数プロジェクトを作成する

ローカルで実行中の場合、Functions プロジェクトは、host.json ファイルと local.settings.json ファイルが含まれるディレクトリです。 このディレクトリは、Azure の関数アプリに相当します。 Azure Functions のフォルダー構造の詳細については、Azure Functions の開発者向けガイドを参照してください。

ターミナル ウィンドウまたはコマンド プロンプトで、次のコマンドを実行してプロジェクトおよびローカルの Git リポジトリを作成します。

func init MyFunctionProj

出力は次のテキストのようになります。

Writing .gitignore
Writing host.json
Writing local.settings.json
Created launch.json
Initialized empty Git repository in D:/Code/Playground/MyFunctionProj/.git/

ローカル Git リポジトリを使用せずにプロジェクトを作成する場合は、--no-source-control [-n] オプションを使用します。

ローカル設定ファイル

local.settings.json ファイルには、アプリの設定、接続文字列、および Azure Functions Core Tools の設定が格納されます。 その構造を次に示します。

{
  "IsEncrypted": false,   
  "Values": {
    "AzureWebJobsStorage": "<connection string>", 
    "AzureWebJobsDashboard": "<connection string>" 
  },
  "Host": {
    "LocalHttpPort": 7071, 
    "CORS": "*" 
  },
  "ConnectionStrings": {
    "SQLConnectionString": "Value"
  }
}
設定 Description
IsEncrypted true に設定すると、すべての値がローカル コンピューターのキーを使用して暗号化されます。 func settings コマンドと共に使用されます。 既定値は false です。
Values ローカルで実行するときに使用されるアプリケーション設定のコレクションです。 AzureWebJobsStorageAzureWebJobsDashboard は例です。完全な一覧については、アプリの設定リファレンスに関するページを参照してください。
Host このセクションの設定により、ローカルで実行時の Functions ホスト プロセスをカスタマイズできます。
LocalHttpPort ローカルの Functions ホストの実行時に使用される既定のポートを設定します (func host startfunc run)。 --port コマンド ライン オプションは、この値に優先します。
CORS クロス オリジン リソース共有 (CORS) で許可されるオリジンを定義します。 スペースなしのコンマ区切りのリストでオリジンを指定します。 ワイルドカード値 (\*) がサポートされており、これによって任意のオリジンからの要求を許可できます。
ConnectionStrings 関数のデータベース接続文字列が含まれています。 このオブジェクト内の接続文字列は、System.Data.SqlClient のプロバイダーの種類と共に、環境に追加されます。

トリガーとバインディングのほとんどには、環境変数またはアプリ設定の名前にマップされた Connection プロパティが含まれています。 各接続プロパティについては、local.settings.json ファイルに定義されたアプリ設定である必要があります。

この設定は、コードの中で環境変数として読み込むこともできます。 C# の場合は、System.Environment.GetEnvironmentVariable またはConfigurationManager.AppSettings を使用します。 JavaScript では、process.env を使用します。 システム環境変数として指定されている設定は、local.settings.json ファイル内の値よりも優先されます。

local.settings.json ファイル内の設定は、ローカルで実行されている Functions ツールでのみ使用されます。 既定では、プロジェクトが Azure に発行されても、これらの設定は自動的に移行されません。 発行する際--publish-local-settings スイッチを使用して、これらの設定が Azure 内の関数アプリに追加されていることを確認してください。

有効なストレージ接続文字列が AzureWebJobsStorage に設定されていない場合は、次のエラー メッセージが表示されます。

local.settings.json に AzureWebJobsStorage の値がありません。 これは HTTP 以外のすべてのトリガーに必要です。 'func azure functionapp fetch-app-settings' を実行するか、local.settings.json で接続文字列を指定することができます。

注意

ローカルな開発では、Azure Functions ツールによる Azure ストレージ エミュレーターの使用はサポートされません。

アプリケーションの設定の構成

接続文字列の値を設定するには、次のいずれかのオプションを構成します。

  • Azure Storage Explorer で、接続文字列を入力します。
  • 次のコマンドのいずれかを使用します。

    func azure functionapp fetch-app-settings <FunctionAppName>
    
    func azure storage fetch-connection-string <StorageAccountName>
    

    どちらのコマンドも、最初に Azure にサインインする必要があります。

関数を作成する

関数を作成するには、次のコマンドを実行します。

func new

func new では、次の省略可能な引数がサポートされています。

引数 Description
--language -l テンプレート プログラミング言語。C#、F#、JavaScript など。
--template -t テンプレート名。
--name -n 関数名。

たとえば、JavaScript HTTP トリガーを作成するには、次を実行します。

func new --language JavaScript --template HttpTrigger --name MyHttpTrigger

キューによってトリガーされる関数を作成するには、次を実行します。

func new --language JavaScript --template QueueTrigger --name QueueTriggerJS

関数をローカルで実行する

Functions プロジェクトを実行するには、Functions ホストを実行します。 ホストによって、プロジェクトのすべての関数に対するトリガーが有効になります。

func host start

func host start では、次のオプションがサポートされています。

オプション Description
--port -p ローカル ポート。このポートでリッスンします。 既定値: 7071。
--debug <type> オプションは VSCodeVS です。
--cors CORS オリジンのコンマ区切りのリスト (スペースなし)。
--nodeDebugPort -n 使用するノード デバッガーのポート。 既定値: launch.json または 5858 の値。
--debugLevel -d コンソール トレース レベル (オフ、詳細、情報、警告、またはエラー)。 既定値: 情報。
--timeout -t Functions ホスト開始のタイムアウト (秒単位)。 既定値: 20 秒。
--useHttps https://localhost:{port} rather than to http://localhost:{port} にバインドします。 既定では、このオプションにより、信頼された証明書がコンピューターに作成されます。
--pause-on-error プロセスを終了する前に、追加入力を一時停止します。 統合開発環境 (IDE) から Azure Functions Core Tools を起動する場合に役立ちます。

Functions ホストの起動時、HTTP によってトリガーされる関数の URL が出力されます。

Found the following functions:
Host.Functions.MyHttpTrigger

ob host started
Http Function MyHttpTrigger: http://localhost:7071/api/MyHttpTrigger

VS Code または Visual Studio でのデバッグ

デバッガーをアタッチするには、--debug 引数を渡します。 JavaScript 関数をデバッグするには、Visual Studio Code を使用します。 C# 関数については、Visual Studio を使用します。

C# 関数をデバッグするには、--debug vs を使用します。 または、Azure Functions Visual Studio 2017 Tools を使用することもできます。

ホストを起動して、JavaScript のデバッグを設定するには、次を実行します。

func host start --debug vscode

その後、Visual Studio Code の [デバッグ] ビューで、[Attach to Azure Functions](Azure Functions にアタッチ) を選択します。 ブレークポイントをアタッチし、変数の調査をして、コードをステップ実行できます。

Visual Studio Code での JavaScript デバッグ

関数へのテスト データの受け渡し

func run <FunctionName> を使用して関数を直接呼び出し、関数の入力データを渡すこともできます。 このコマンドは、Azure Portal の [テスト] タブを使用して関数を実行するのと似ています。 このコマンドにより、Functions ホスト全体が起動します。

func run では、次のオプションがサポートされています。

オプション Description
--content -c インライン コンテンツ。
--debug -d 関数を実行する前に、デバッガーを、ホスト プロセスにアタッチします。
--timeout -t Functions ホストの準備が完了するまでの待機時間 (秒単位)。
--file -f コンテンツとして使用するファイル名。
--no-interactive 入力を促しません。 自動シナリオで便利です。

たとえば、HTTP によってトリガーされる関数を呼び出して、コンテンツ本文を渡すには、次のコマンドを実行します。

func run MyHttpTrigger -c '{\"name\": \"Azure\"}'

Azure に発行する

Azure で Functions プロジェクトを関数アプリに発行するには、publish コマンドを使用します。

func azure functionapp publish <FunctionAppName>

以下のオプションを使用できます。

オプション Description
--publish-local-settings -i local.settings.json の設定を Azure に発行し、設定が既に存在する場合は上書きを促します。
--overwrite-settings -y -i で使用する必要があります。 値が異なる場合は、Azure の AppSettings をローカル値で上書きします。 既定値は prompt です。

このコマンドは、Azure で既存の関数アプリに公開されるコマンドです。 <FunctionAppName> がサブスクリプションに存在しない場合は、エラーが発生します。 コマンド プロンプトまたはターミナル ウィンドウから Azure CLI を使用して、関数アプリを作成する方法については、「サーバーレス実行用の Function App を作成する」を参照してください。

publish コマンドは、Functions プロジェクト ディレクトリのコンテンツをアップロードします。 ローカルでファイルを削除する場合、publish コマンドではファイルは Azure から削除されません。 Azure 内のファイルは、Azure PortalKudu ツール を使用することで削除できます。

重要

Azure で関数アプリを作成すると、既定でバージョン 1.x の Function ランタイムが使用されます。 関数アプリでバージョン 2.x のランタイムを使用するには、アプリケーション設定 FUNCTIONS_EXTENSION_VERSION=beta を追加します。
次の Azure CLI コードを使用して、この設定を関数アプリに追加します。

az functionapp config appsettings set --name <function_app> \
--resource-group myResourceGroup \
--settings FUNCTIONS_EXTENSION_VERSION=beta   

次のステップ

Azure Functions Core Tools はオープン ソースであり、GitHub でホストされています
バグまたは機能要求を提出するには、GitHub の問題をオープンしてください。