演習 - 入力バインディングと出力バインディングの種類を確認する
この演習では、HTTP 要求を受信すると実行され、メッセージを返すことで各要求に応答する関数を作成します。
何をビルドするかを示す次の概要図を参照してください。
パラメーター req
は "トリガー バインディング" であり、パラメーター res
は "出力バインディング" です。 これらのパラメーターは、"要求" と "応答" の省略形と考えるとわかりやすくなります。
Function App を作成する
このモジュールで使用できる関数アプリを作成しましょう。 関数アプリを使用すると、リソースの管理、デプロイ、および共有を容易にするための論理ユニットとして関数をグループ化できます。
サンドボックスのアクティブ化に使ったアカウントを使って、Azure portal にサインインします。
リソース メニューで、または [ホーム] ページから、[リソースの作成] を選択します。 [リソースの作成] ウィンドウが表示されます。
[リソースの作成] メニューの [計算] を選択し、結果の一覧で [関数アプリ] を選択します。 [サービスとマーケットプレースの検索] ウィンドウで「Function App」を検索することが必要になる場合があります。
[従量課金] を選択し、[選択] ボタンを選択します。 [関数アプリの作成] ウィンドウが表示されます。
[基本] タブで、各設定に対して次の値を入力します。
設定 値 説明 プロジェクトの詳細 サブスクリプション コンシェルジェ サブスクリプション この演習に使用する Azure サブスクリプション。 リソース グループ ドロップダウン リストから、 [サンドボックス リソース グループ名] を選択しますサンドボックスのリソース グループ。 インスタンスの詳細 関数アプリ名 "グローバルに一意な名前" を入力します この名前が、新しい関数アプリを示します。 有効な文字は、 a-z
、0-9
、および-
です。ランタイム スタック ドロップダウン リストから、[Node.js] を選択します。 このモジュールのサンプル コードは、JavaScript で記述されています。 Version "既定値" をそのまま使用します。 この演習では既定値で十分です。 リージョン ドロップダウン リストから、[場所] を選択します 最寄りのリージョンを選択します。 他のすべてのオプションについては、既定値をそのまま使用します。 [確認と作成] を選択して設定を検証し、[作成] を選択して関数アプリをプロビジョニングし、デプロイします。
デプロイには時間がかかることがあります。 アカウント名の横にあるグローバル コントロールで、[通知] アイコンを選択し、[デプロイに成功しました] メッセージを監視します。
関数のデプロイが完了したら、[リソースに移動] を選択します。 関数アプリの [概要] ペインが表示されます。
サンドボックスのアクティブ化に使ったのと同じアカウントを使って、Azure portal にサインインします。
リソース メニューで、または [ホーム] ページから、[リソースの作成] を選択します。 [リソースの作成] ウィンドウが表示されます。
[リソースの作成] メニューの [計算] を選択し、結果の一覧で [関数アプリ] を選択します。 [サービスとマーケットプレースの検索] ウィンドウで「Function App」を検索することが必要になる場合があります。
[従量課金] を選択し、[選択] ボタンを選択します。 [関数アプリの作成] ウィンドウが表示されます。
[基本] タブで、各設定に対して次の値を入力します。
設定 値 説明 プロジェクトの詳細 サブスクリプション コンシェルジェ サブスクリプション この演習に使用する Azure サブスクリプション。 リソース グループ ドロップダウン リストから、 [サンドボックス リソース グループ名] を選択しますサンドボックスのリソース グループ。 インスタンスの詳細 関数アプリ名 "グローバルに一意な名前" を入力します この名前が、新しい関数アプリを示します。 有効な文字は、 a-z
、0-9
、および-
です。ランタイム スタック ドロップダウン リストから [PowerShell Core] を選択します。 このモジュールのサンプル コードは、PowerShell で記述されています。 Version "既定値" をそのまま使用します。 この演習では既定値で十分です。 リージョン ドロップダウン リストから、[場所] を選択します 最寄りのリージョンを選択します。 他のすべてのオプションについては、既定値をそのまま使用します。 [確認と作成] を選択して入力を検証し、[作成] を選択して関数アプリをプロビジョニングし、デプロイします。
デプロイには時間がかかることがあります。 アカウント名の横にあるグローバル コントロールで、[通知] アイコンを選択し、[デプロイに成功しました] メッセージを監視します。
関数のデプロイが完了したら、[リソースに移動] を選択します。 関数アプリの [概要] ペインが表示されます。
ヒント
Azure portal で目的の関数アプリが見つからない場合は、Azure portal でお気に入りに関数アプリを追加する方法を確認してください。
関数を作成する
関数アプリを用意できたので、ここでは関数を作成しましょう。 各関数には、それをアクティブにするトリガーがあります。 このモジュールでは、定義済みのテンプレートを使用して HTTP トリガーを定義します。
[概要] ページの [関数] タブの [Azure portal で作成] で [関数を作成] ボタンを選択します。
[関数の作成] ペインが表示されます。
[テンプレートの選択] セクションで、[HTTP トリガー] テンプレートを選択し、[次へ] を選択します。
[テンプレートの詳細] セクションで次の設定を確認します。
[関数名] テキスト ボックスでは、既定の名前 HttpTrigger1 をそのまま使用します。 作成する関数には、Azure によって、一意の名前が自動的に作成されます。 異なる名前を選択することもできますが、わかりやすい名前を使用するようにしてください。
[承認レベル] テキスト ボックスでは、既定値 [関数] をそのまま使用します。 承認レベルによって、関数を実行するために要求で提示する必要があるキーが決まります。 "関数" の承認レベルには、関数固有のキーが必要です。このキーは関数作成後に確認できます。
[作成] を選択します ご利用の関数アプリにトリガー関数が伝達されると、その "関数アプリ" の[関数] ペインが開き、HttpTrigger1 が一覧表示されます。
コマンド バーで、[関数の URL の取得] を選択します。 [関数の URL の取得] ダイアログ ボックスが表示されます。
ドロップダウン リストで [既定値 (関数キー)] を選択し、URL の最後にある [クリップボードにコピー] アイコンを選択してから、[OK] を選択してダイアログを閉じます。
ブラウザーの新しいタブのアドレス バーに、コピーした関数の URL を貼り付けます。 Enter キーを押して、ブラウザーで要求を実行します。 関数アプリの初期化のため、応答には数分かかる場合があります。 タイムアウト エラーが発生した場合は、更新して要求を再送信します。
関数が応答すると、次の例のような出力がブラウザーに表示されます。
This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.
次のクエリ文字列
&name=Joe
を URL の末尾に追加します。 結果の URL は次の例のようになります。https://example.azurewebsites.net/api/HttpTrigger1?code=AbCdEfGhIjKlMnOpQrStUvWxYz==&name=Joe
Enter キーを押して、ブラウザーで要求を実行します。 関数が応答すると、次の例のような出力がブラウザーに表示されます。
Hello, Joe. This HTTP triggered function executed successfully.
ここまでの演習からわかるように、関数を作成するときにトリガーを定義する必要があります。 関数ごとにトリガーが 1 つあります。 この例では HTTP トリガーを使用しています。つまり、この関数は HTTP 要求を受信すると起動します。 次のスクリーンショットに JavaScript で示されているテンプレートの既定の実装では、クエリ文字列または要求の本文内にあったパラメーター name の値が返されます。 クエリ文字列が指定されていない場合、関数は呼び出し元に対して名前値を指定するよう求めるメッセージで応答します。
Azure portal の [関数] メニューで、[Code + Test](コードとテスト) を選択します。
関数の [コードとテスト] ペインが表示され、index.js ファイルの内容が表示されます。 関数の既定の JavaScript コードは、次の例のようになります。
module.exports = async function (context, req) { context.log('JavaScript HTTP trigger function processed a request.'); const name = (req.query.name || (req.body && req.body.name)); const responseMessage = name ? "Hello, " + name + ". This HTTP triggered function executed successfully." : "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."; context.res = { // status: 200, /* Defaults to 200 */ body: responseMessage }; }
では、関数のもう 1 つのファイルである function.json 構成ファイルを簡単に見てみましょう。 このファイルにアクセスするには、コード ブロックの上にあるファイルパスのドロップダウン リストから function.json を選択します。 次の JSON の一覧に、この構成データが示されています。
{ "bindings": [ { "authLevel": "function", "type": "httpTrigger", "direction": "in", "name": "req", "methods": [ "get", "post" ] }, { "type": "http", "direction": "out", "name": "res" } ] }
この関数には、種類が
httpTrigger
である req という名前の "トリガー バインディング" と、種類がhttp
である res という名前の出力バインディングが含まれています。
この関数の前述のコードで、req パラメーターを介して着信 HTTP 要求のペイロードにアクセスすることを確認しました。 同様に、res パラメーターを設定して HTTP 応答を送信しました。 このようにバインディングを使用すると、面倒な作業の一部が自動的に行われます。
関数アプリを用意できたので、次に関数を作成しましょう。 各関数には、それをアクティブにするトリガーがあります。 このモジュールでは、テンプレートを使用して HTTP トリガーを作成します。
[概要] ページの [関数] タブの [Azure portal で作成] で [関数を作成] ボタンを選択します。
[関数の作成] ペインが表示されます。
[テンプレートの選択] セクションで、[HTTP トリガー] テンプレートを選択し、[次へ] を選択します。
[テンプレートの詳細] セクションで次の設定を確認します。
[作成] を選択します "関数" の [HttpTrigger1] ペインが表示されます。
コマンド バーで、[関数の URL の取得] を選択します。 [関数の URL の取得] ダイアログ ボックスが表示されます。
ドロップダウン リストで [既定値 (関数キー)] を選択し、URL の最後にある [クリップボードにコピー] アイコンを選択してから、[OK] を選択してダイアログ ボックスを閉じます。
ブラウザーの新しいタブのアドレス バーに、コピーした関数の URL を貼り付けます。 Enter キーを押して、ブラウザーで要求を実行します。 関数アプリの初期化のため、応答には数分かかる場合があります。 タイムアウト エラーが発生した場合は、更新して要求を再送信します。
関数が応答すると、次の例のような出力がブラウザーに表示されます。
This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.
URL の末尾にクエリ文字列
&name=Joe
を追加します。 結果の URL は次の例のようになります。https://example.azurewebsites.net/api/HttpTrigger1?code=AbCdEfGhIjKlMnOpQrStUvWxYz==&name=Joe
Enter キーを押して、ブラウザーで要求を実行します。 関数が応答すると、次の例のような出力がブラウザーに表示されます。
Hello, Joe. This HTTP triggered function executed successfully.
ここまでの演習からわかるように、関数を作成するときにトリガーを定義する必要があります。 関数ごとにトリガーが 1 つあります。 この例では HTTP トリガーを使用しています。つまり、この関数は HTTP 要求を受信すると起動します。 次のスクリーンショットに PowerShell で示されているテンプレートの既定の実装では、
Push-OutputBinding
コマンドレットを使用して、クエリ文字列または要求の本文に含まれていたパラメーター名の値で応答されます。 文字列が指定されていない場合、関数により、呼び出し元に対して名前値を指定するよう求めるメッセージで応答が行われます。[関数] メニューで、[Code + Test](コードとテスト) を選択します。 関数の [コードとテスト] ペインが表示され、run.ps1 ファイルの内容が表示されます。
関数の既定の PowerShell コードは、次の例のようになります。
using namespace System.Net # Input bindings are passed in via param block. param($Request, $TriggerMetadata) # Write to the Azure Functions log stream. Write-Host "PowerShell HTTP trigger function processed a request." # Interact with query parameters or the body of the request. $name = $Request.Query.Name if (-not $name) { $name = $Request.Body.Name } $body = "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response." if ($name) { $body = "Hello, $name. This HTTP triggered function executed successfully." } # Associate values to output bindings by calling 'Push-OutputBinding'. Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{ StatusCode = [HttpStatusCode]::OK Body = $body })
では、関数のもう 1 つのファイルである function.json 構成ファイルを簡単に見てみましょう。 このファイルに開くには、ファイルパスのドロップダウン リストから function.json を選択します。 次の JSON の一覧に、この構成データが示されています。
{ "bindings": [ { "authLevel": "function", "type": "httpTrigger", "direction": "in", "name": "Request", "methods": [ "get", "post" ] }, { "type": "http", "direction": "out", "name": "Response" } ] }
ご覧のように、この関数には、
httpTrigger
型の Request という名前のトリガー バインディングと、http
型の Response という名前の出力バインディングが含まれています。 この関数の前述のコードで、Request パラメーターを介して着信 HTTP 要求のペイロードにアクセスする方法を確認しました。 同様に、Response パラメーターを設定して HTTP 応答を送信しました。 このようにバインディングを使用すると、面倒な作業の一部が自動的に行われます。
バインディングの種類を確認する
[関数] メニューで、[コードとテスト] を選択します。 関数の [統合] ペインが表示されます。
次の図に示すように、トリガーと出力バインディングは既に定義されていることに注意してください。 統合ビューは、ご利用の画面の幅と高さに最適なサイズに調整されます。 画面の幅が十分であれば、同じ情報を横方向に表示することもできます。
また、"複数の" トリガーを追加できないこともわかります。 関数のトリガーを変更するには、トリガーを削除して新しいトリガーを作成する必要があります。 ただし、[入力] および [出力] セクションでは複数のバインディングを追加できるため、要求で、複数の入力値を受け取り、複数の出力値を返すことができます。
[入力] ボックスで、[入力の追加] を選択します。 [入力の作成] ペインが表示されます。 [バインドの種類] のドロップダウン リストを選択すると、使用できるすべての入力バインディングの種類の一覧が表示されます。
少し時間をとって、ソリューションでこれらの各入力バインディングを使用する方法について考えてみましょう。
このモジュールの後半で入力バインディングを追加しますが、ここでは [キャンセル] を選択してこのウィンドウを閉じます。
[出力] ボックスで [出力の追加] を選択します。 [出力の作成] ペインが表示されます。 [バインドの種類] のドロップダウン リストを選択すると、使用できるすべての出力バインドの種類の一覧が表示されます。
ご覧のように、出力バインディングの種類は複数あります。 このモジュールの後半で出力バインディングを追加しますが、ここでは [キャンセル] を選択してこのウィンドウを閉じます。
[関数] メニューで、[コードとテスト] を選択します。 関数の [統合] ペインが表示されます。
次の図に示すように、トリガーと出力バインディングは既に定義されていることに注意してください。 統合ビューは、ご利用の画面の幅と高さに最適なサイズに調整されます。 画面の幅が十分ではない場合は、同じ情報を垂直方向に表示できます。
また、"複数の" トリガーを追加できないこともわかります。 関数のトリガーを変更するには、トリガーを削除して新しいトリガーを作成する必要があります。 ただし、[入力] および [出力] セクションでは複数のバインディングを追加できるため、関数で、複数の入力値を受け取り、複数の出力値を返すことができます。
[入力] ボックスで、[入力の追加] を選択します。 [入力の作成] ペインが表示されます。 [バインドの種類] のドロップダウン リストを選択すると、使用できるすべての入力バインディングの種類の一覧が表示されます。
少し時間をとって、ソリューションでこれらの各入力バインディングを使用する方法について考えてみましょう。 選択できる方法は多数あります。
このモジュールの後半で入力バインディングを追加しますが、ここでは [キャンセル] を選択してこのウィンドウを閉じます。
[出力] ボックスで [出力の追加] を選択します。 [出力の作成] ペインが表示されます。 [バインドの種類] のドロップダウン リストを選択すると、使用できるすべての出力バインドの種類の一覧が表示されます。
ご覧のように、出力バインディングの種類は複数あります。 このモジュールの後半で出力バインディングを追加しますが、ここでは [キャンセル] を選択してこのウィンドウを閉じます。
ここまで、関数アプリを作成し、関数を追加する方法を学習しました。 HTTP 要求が行われたときに実行されるシンプルな関数の実際の動作を確認しました。 また、Azure portal と、関数で使用できる入力および出力バインディングの種類も確認しました。 次のユニットでは、入力バインディングを使用してデータベースからテキストを読み取ります。