Azure Functions でコードをオンデマンドで実行する

完了

関数アプリを作成したので、関数をビルド、構成、実行する方法について確認しましょう。 次の演習では関数を実行するので、このユニットのタスクを完了する必要はありません。

トリガー

関数はイベント駆動型です。つまり、イベントに応答して実行されるということです。 関数を開始するイベントの種類を、トリガーと呼びます。 各関数は、トリガーを 1 つだけ使って構成する必要があります。

関数の実行をトリガーするには、HTTP 要求、スケジュール タイマー、次の Azure サービスからのイベントを使います。

Azure サービス トリガーの説明
Blob Storage 新しい、または更新された BLOB が検出されたときに関数を開始します。
Azure Cosmos DB 挿入および更新が検出されたときに関数を開始します。
Event Grid Event Grid からイベントを受信したときに関数を開始します。
Event Hubs Event Hubs からイベントを受信したときに関数を開始します。
Queue Storage キューで新しい項目を受け取ったときに関数を開始します。 キュー メッセージは、関数への入力として提供されます。
Service Bus Service Bus キューからのメッセージに応答して関数を開始します。

バインド

バインドは、データとサービスを関数に接続するための宣言型の方法です。 バインドによって、さまざまなデータ ソースとやりとりされます。つまり、データ ソースに接続して、接続を管理するために、自分で関数にコードを記述する必要はないということです。 ユーザーの代わりに、プラットフォームによってその複雑さがバインド コードの一部として処理されます。 各バインドには方向があります。コードは、入力バインドからデータを読み取り、出力バインドにデータを書き込みます。 各関数には、関数によって処理された入出力データを管理するために、0 個またはそれ以上のバインドを割り当てることができます。

トリガーとは、何らかのコードの実行を開始する機能を持つ入力バインドの一種です。

Azure には、各種のストレージ サービスとメッセージング サービスに接続するために、多数のバインドが用意されています。

サンプル バインドを定義する

入力バインド (トリガー) と出力バインドで関数を構成する例を見てみましょう。 Azure Queue Storage に新しいメッセージが表示されるたびに Azure Table Storage に新しい行を書き込むとします。 このシナリオは、Azure Queue Storage トリガーと Azure Table storage の出力バインドを使用して実装できます。

次のスニペットは、このシナリオの function.json ファイルです。

{
  "bindings": [
    {
      "name": "order",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "myqueue-items",
      "connection": "MY_STORAGE_ACCT_APP_SETTING"
    },
    {
      "name": "$return",
      "type": "table",
      "direction": "out",
      "tableName": "outTable",
      "connection": "MY_TABLE_STORAGE_ACCT_APP_SETTING"
    }
  ]
}

今回の JSON 構成では、メッセージが myqueue-items という名前のキューに追加されると関数がトリガーされるように指定します。 次に、関数の戻り値が Azure Table Storage の outTable テーブルに書き込まれます。

PowerShell 関数の場合、出力バインディングは Push-OutputBinding コマンドレットを使用して明示的に書き込まれます。

この例は、関数にバインディングを構成する方法を単純に示しています。 SendGrid バインディングを使って出力先をメールに変更することや、アーキテクチャ内の他のコンポーネントに通知するイベントを Service Bus に設定することができます。 複数の出力バインディングを用意して、さまざまなサービスにデータをプッシュすることもできます。

ヒント

Azure portal で function.json の内容を表示および編集するには、[ホーム] ページから関数アプリを選択し、右側のペインで [JSON ビュー] を選択します。 [リソース JSON] ビューには、Resource ID と編集可能な JSON コードが表示されます。 JSON ビューを閉じるには、ペインの右上隅にある [X] を選択します。

Functions でサポートされているすべての言語が、関数の定義に function.json ファイルを使うわけではありません。

Azure portal で関数を作成する

Azure Functions には、特定の種類のトリガーに基づく定義済みの関数テンプレートが用意されています。 選んだ言語でこれらのテンプレートを使うと、初めての関数を簡単に作成できます。

このモジュールは、Functions がサポートするすべての言語でサポートされているわけではありません。また、ポータル自体も Functions がサポートするすべての言語で関数を作成することをサポートしているわけではありません。

サポートされている言語で function.json ファイルを使って関数を定義する場合、Azure portal でこれらの関数を直接作成および編集できます。 これらのポータルでサポートされている言語には、JavaScript、PowerShell、Python、C# スクリプト (.csx) などがあります。 コード自体に直接関数を定義する言語は、ポータルの外部で開発し、Azure にデプロイする必要があります。 これらのポータル以外でサポートされている言語には、C#、Java、Python (v2 プログラミング モデル)、JavaScript/TypeScript (Node.js v4 プログラミング モデル) などがあります。

関数テンプレート

ポータルで最初の関数を作成するときに、定義済みのトリガーを関数に選択できます。 選択した内容に基づいて、入力データの受信時にイベント ログ エントリを作成するなど、既定のコードと構成情報が Azure によって生成されます。

[関数の追加] ペインからテンプレートを選択すると、最も一般的な開発環境、トリガー、依存関係に簡単にアクセスできます。 Azure portal で関数を作成する場合は、20 を超えるテンプレートから選択できます。 作成したコードは、さらにカスタマイズできます。

関数をテンプレートから作成すると、構成ファイル、function.json、ソース コード ファイル、index.js など、複数のファイルが作成されます。

[関数アプリ] メニューの [関数] カテゴリで [関数] を選択すると、関数アプリの関数を作成または編集できます。

関数アプリで作成した関数を選択すると、[関数] ペインが開きます。 [関数] メニューから [Code + Test](コードとテスト) を選ぶと、コマンド バー テストのアクションにアクセスして、コードをテストして実行する、変更を保存または破棄する、または発行された URL を取得することができます。 コマンド バーの [Test/Run](テスト/実行) を選択すると、要求にクエリ文字列と値を含めてユース ケースを実行できます。 コード ボックスの上にある関数のパスに、開いているファイルの名前が表示されます。 ドロップダウンから特定のファイル、たとえば function. json を選択して、テストまたは編集できます。

関数コードとテスト エディターに [Test/Run]\(テスト/実行\) の展開されたビューが表示され、メニュー オプションが強調表示されているスクリーンショット。

上の画像で、右側のペインに [入力][出力] のタブがあります。 [入力] タブを選択して、クエリ パラメーターを追加し、クエリ文字列の値を指定することで、関数をビルドしてテストできます。 [出力] タブには、要求の結果が表示されます。

Azure 関数をテストする

ポータルで関数を作成したら、テストする必要があります。 これには 2 つの方法があります。

  • ポータルでのテスト
  • 手動で実行する

Azure portal でテストする

ポータルにも、関数をテストするための便利な手段が用意されています。 上のスクリーンショットで、前述のようになります。 このペインで [実行]を選択すると、結果が [出力] タブに自動的に表示され、[ログ] ペインが開いて状態が表示されます。

関数を手動で実行する

構成されたトリガーを手動でトリガーすることによって、関数を開始できます。 たとえば、HTTP トリガーを使用している場合は、次のいずれかの HTTP テスト ツールを使用して、関数エンドポイント URL への HTTP 要求を開始できます。

注意事項

資格情報、シークレット、アクセス トークン、API キーなどの機密データがあるシナリオでは、必要なセキュリティ機能でデータを保護したうえで、ツールは必ずオフラインまたはローカルで動作し、データをクラウドに同期せず、オンライン アカウントにサインインする必要がないものを使用してください。 このようにすることで、機密データを一般に公開するリスクを軽減できます。

ポータルの関数定義ページから [関数の URL の取得] を選択すると、HTTP トリガーの URL エンドポイントを取得できます。

監視と Application Insights ダッシュボード

関数を監視する機能は、開発環境および本番環境にに対して重要です。 Azure portal から提供されている監視ダッシュボードは、Application Insights の統合を有効にしてオンにします。 [関数アプリ] メニューで、[設定] の下の [Application Insights] を選択し、[Application Insights を有効にする][適用] の順に選択します。 ダイアログ ボックスで [はい] を選択します。 Application Insights ダッシュボードを使用すると、Application Insights によって設定されたタイムスタンプ、結果コード、期間、操作 ID が表示され、関数操作の履歴を簡単に確認できます。

HTTP 関数の Application Insights ダッシュボードに関数の結果とそれに対応する HTTP 状態コードが表示され、[監視] メニュー項目が強調表示されているスクリーンショット。

[ストリーミング ログ] ペイン

Azure portal で Application Insights を有効にした後、関数をデバッグできるようにログ ステートメントを追加できます。 各言語の呼び出されたメソッドに "logging" オブジェクトが渡されます。これを使用して、テストの実行時に [Code + Test](コードとテスト) ペインの [ログ] ペインにログ情報を追加できます。

ハンドラーに渡される context オブジェクトに対して log メソッドを使って、自分のコードからログに書き込みます。 次の例では、既定のログ レベル (情報) に書き込んでいます。

context.log('Enter your logging statement here');

次の例に示すように、Write-Host コマンドレットを使ってコードからログに書き込みます。

Write-Host "Enter your logging statement here"

エラー、失敗、警告、異常

[関数] メニューの [調査] カテゴリからメトリックまたはオプションを使用すると、パフォーマンスの監視、失敗の診断、関数アプリを管理するための多数の定義済みブックの構成を行うことができます。 これは、コード内のコンパイル エラーや警告から、ロール別の使用状況統計まで、すべてを指します。