このクイック スタートでは、Azure Developer コマンド ライン ツールを使用して、HTTP 要求に応答する関数エンドポイントを含むスケーラブルな Web API を構築します。 コードをローカルでテストした後、Azure Functions の Flex 従量課金プランで実行して作成した新しいサーバーレス関数アプリにデプロイします。
プロジェクト ソースでは、Azure へのコードのデプロイを簡略化するために Azure Developer CLI (azd) が使用されます。 このデプロイは、セキュリティで保護されたスケーラブルな Azure Functions デプロイの最新のベスト プラクティスに従います。
既定では、Flex 従量課金プランは 従量課金 制の課金モデルに従います。つまり、このクイック スタートを完了すると、Azure アカウントで数 USD セント以下の小さなコストが発生します。
Prerequisites
アクティブなサブスクリプションが含まれる Azure アカウント。 無料でアカウントを作成できます。
-
Java 17 Developer Kit
- 別のサポートされているバージョンの Java を使用する場合は、プロジェクトの pom.xml ファイルを更新する必要があります。
-
JAVA_HOME環境変数は、Java Development Kit (JDK) の正しいバージョンのインストール場所に設定する必要があります。
- Apache Maven 3.8.x
- JSON ペイロードを含む要求を関数エンドポイントに送信するための 安全な HTTP テスト ツール。 この記事では、
curlを使用します。
プロジェクトを初期化する
azd init コマンドを使用して、テンプレートからローカル Azure Functions コード プロジェクトを作成します。
ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の
azd initコマンドを実行します。azd init --template functions-quickstart-dotnet-azd -e httpendpoint-dotnetこのコマンドは、 テンプレート リポジトリ からプロジェクト ファイルをプルし、現在のフォルダー内のプロジェクトを初期化します。
-eフラグでは、現在の環境の名前が設定されます。azdでは、環境はアプリの一意のデプロイ コンテキストを維持し、複数を定義できます。 これは、Azure で作成するリソース グループの名前でも使用されます。次のコマンドを実行して、
httpアプリ フォルダーに移動します。cd http次の JSON データを含む フォルダーにlocal.settings.jsonという名前のファイルを作成します。
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated" } }このファイルは、ローカルで実行する場合に必要です。
ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の
azd initコマンドを実行します。azd init --template azure-functions-java-flex-consumption-azd -e httpendpoint-javaこのコマンドは、 テンプレート リポジトリ からプロジェクト ファイルをプルし、現在のフォルダー内のプロジェクトを初期化します。
-eフラグでは、現在の環境の名前が設定されます。azdでは、環境はアプリの一意のデプロイ コンテキストを維持し、複数を定義できます。 これは、Azure で作成するリソース グループの名前でも使用されます。次のコマンドを実行して、
httpアプリ フォルダーに移動します。cd http次の JSON データを含む フォルダーにlocal.settings.jsonという名前のファイルを作成します。
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "java" } }このファイルは、ローカルで実行する場合に必要です。
ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の
azd initコマンドを実行します。azd init --template functions-quickstart-javascript-azd -e httpendpoint-jsこのコマンドは、 テンプレート リポジトリ からプロジェクト ファイルをプルし、ルート フォルダー内のプロジェクトを初期化します。
-eフラグでは、現在の環境の名前が設定されます。azdでは、環境はアプリの一意のデプロイ コンテキストを維持し、複数を定義できます。 これは、Azure で作成するリソース グループの名前でも使用されます。次の JSON データを含む local.settings.json という名前のファイルをルート フォルダーに作成します。
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "node" } }このファイルは、ローカルで実行する場合に必要です。
ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の
azd initコマンドを実行します。azd init --template functions-quickstart-powershell-azd -e httpendpoint-psこのコマンドは、 テンプレート リポジトリ からプロジェクト ファイルをプルし、ルート フォルダー内のプロジェクトを初期化します。
-eフラグでは、現在の環境の名前が設定されます。azdでは、環境はアプリの一意のデプロイ コンテキストを維持し、複数を定義できます。 これは、Azure で作成するリソース グループの名前でも使用されます。次のコマンドを実行して、
srcアプリ フォルダーに移動します。cd src次の JSON データを含む フォルダーにlocal.settings.jsonという名前のファイルを作成します。
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "powershell", "FUNCTIONS_WORKER_RUNTIME_VERSION": "7.2" } }このファイルは、ローカルで実行する場合に必要です。
ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の
azd initコマンドを実行します。azd init --template functions-quickstart-typescript-azd -e httpendpoint-tsこのコマンドは、 テンプレート リポジトリ からプロジェクト ファイルをプルし、ルート フォルダー内のプロジェクトを初期化します。
-eフラグでは、現在の環境の名前が設定されます。azdでは、環境はアプリの一意のデプロイ コンテキストを維持し、複数を定義できます。 環境名は、Azure で作成するリソース グループの名前にも使用されます。次の JSON データを含む local.settings.json という名前のファイルをルート フォルダーに作成します。
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "node" } }このファイルは、ローカルで実行する場合に必要です。
ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の
azd initコマンドを実行します。azd init --template functions-quickstart-python-http-azd -e httpendpoint-pyこのコマンドは、 テンプレート リポジトリ からプロジェクト ファイルをプルし、ルート フォルダー内のプロジェクトを初期化します。
-eフラグでは、現在の環境の名前が設定されます。azdでは、環境はアプリの一意のデプロイ コンテキストを維持し、複数を定義できます。 環境名は、Azure で作成するリソース グループの名前にも使用されます。次の JSON データを含む local.settings.json という名前のファイルをルート フォルダーに作成します。
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "python" } }このファイルは、ローカルで実行する場合に必要です。
仮想環境を作成してアクティブにする
ルート フォルダーで、次のコマンドを実行して、.venv という名前の仮想環境を作成してアクティブにします。
python3 -m venv .venv
source .venv/bin/activate
Python で Venv パッケージが Linux ディストリビューションにインストールされない場合は、次のコマンドを実行します。
sudo apt-get install python3-venv
ローカル環境で実行する
ターミナルまたはコマンド プロンプトでアプリ フォルダーから次のコマンドを実行します。
func startmvn clean package mvn azure-functions:runnpm install func startnpm install npm startFunctions ホストがローカル プロジェクト フォルダーで起動すると、HTTP によってトリガーされる関数の URL エンドポイントがターミナル出力に書き込まれます。
Note
ローカルで実行する場合、アクセス キーの承認は適用されないため、返される関数の URL にはアクセス キーの値が含まれていないため、関数を呼び出すために必要ありません。
ブラウザーで、
httpgetエンドポイントに移動します。この URL は次のようになります。新しいターミナルまたはコマンド プロンプト ウィンドウから、次の
curlコマンドを実行して、JSON ペイロードを含む POST 要求をhttppostエンドポイントに送信します。curl -i http://localhost:7071/api/httppost -H "Content-Type: text/json" -d @testdata.jsoncurl -i http://localhost:7071/api/httppost -H "Content-Type: text/json" -d "@src/functions/testdata.json"このコマンドにより、
testdata.jsonプロジェクト ファイルから JSON ペイロード データが読み取られます。 両方の HTTP 要求の例はtest.httpプロジェクト ファイルにあります。完了したら、ターミナル ウィンドウで Ctrl + C キーを押して、
func.exeホスト プロセスを停止します。
-
deactivateを実行して仮想環境をシャットダウンします。
コードの確認 (省略可能)
2 つの HTTP トリガー関数エンドポイントを定義するコードを確認できます。
[Function("httpget")]
public IActionResult Run([HttpTrigger(AuthorizationLevel.Function, "get")]
HttpRequest req,
string name)
{
var returnValue = string.IsNullOrEmpty(name)
? "Hello, World."
: $"Hello, {name}.";
_logger.LogInformation($"C# HTTP trigger function processed a request for {returnValue}.");
return new OkObjectResult(returnValue);
}
@FunctionName("httpget")
public HttpResponseMessage run(
@HttpTrigger(
name = "req",
methods = {HttpMethod.GET},
authLevel = AuthorizationLevel.FUNCTION)
HttpRequestMessage<Optional<String>> request,
final ExecutionContext context) {
context.getLogger().info("Java HTTP trigger processed a request.");
// Parse query parameter
String name = Optional.ofNullable(request.getQueryParameters().get("name")).orElse("World");
return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
}
const { app } = require('@azure/functions');
app.http('httpget', {
methods: ['GET'],
authLevel: 'function',
handler: async (request, context) => {
context.log(`Http function processed request for url "${request.url}"`);
const name = request.query.get('name') || await request.text() || 'world';
return { body: `Hello, ${name}!` };
}
});
import { app, HttpRequest, HttpResponseInit, InvocationContext } from "@azure/functions";
export async function httpGetFunction(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
context.log(`Http function processed request for url "${request.url}"`);
const name = request.query.get('name') || await request.text() || 'world';
return { body: `Hello, ${name}!` };
};
app.http('httpget', {
methods: ['GET'],
authLevel: 'function',
handler: httpGetFunction
});
この function.json ファイルにより、httpget 関数が定義されます。
{
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "Request",
"methods": [
"get"
],
"route": "httpget"
},
{
"type": "http",
"direction": "out",
"name": "Response"
}
]
}
この run.ps1 ファイルでは、関数コードが実装されます。
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
$name = $Request.Query.name
$body = "This HTTP triggered function executed successfully. Pass a name in the query string 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
})
@app.route(route="httpget", methods=["GET"])
def http_get(req: func.HttpRequest) -> func.HttpResponse:
name = req.params.get("name", "World")
logging.info(f"Processing GET request. Name: {name}")
return func.HttpResponse(f"Hello, {name}!")
完全なテンプレート プロジェクト は、ここで確認できます。
完全なテンプレート プロジェクト は、ここで確認できます。
完全なテンプレート プロジェクト は、ここで確認できます。
完全なテンプレート プロジェクト は、ここで確認できます。
完全なテンプレート プロジェクト は、ここで確認できます。
完全なテンプレート プロジェクト は、ここで確認できます。
関数をローカルで検証したら、Azure に発行します。
Azure に配置する
このプロジェクトは、azd up コマンドを使用して、Azure の Flex 従量課金プランの新しい関数アプリにこのプロジェクトをデプロイするように構成されています。
Tip
このプロジェクトには、ベスト プラクティスに従って Flex 従量課金プランへの安全なデプロイを作成するために使用する Bicep ファイルのセット (azd フォルダー内) が含まれています。
次のコマンドを実行し、
azdで必要な Azure リソースを Azure に作成し、コード プロジェクトを新しい関数アプリにデプロイします。azd upルート フォルダーには、
azure.yamlに必要なazd定義ファイルが含まれています。まだサインインしていない場合は、Azure アカウントで認証するように求められます。
プロンプトが表示されたら、次の必須のデプロイ パラメーターを指定します。
Parameter Description Azure サブスクリプション リソースが作成されるサブスクリプション。 Azure の場所 新しい Azure リソースを含むリソース グループを作成する Azure リージョン。 現在、Flex 従量課金プランをサポートしているリージョンのみが表示されます。 vnetEnabled False を選択します。 True に設定すると、デプロイによって新しい仮想ネットワークに関数アプリが作成されます。 azd upコマンドは、Bicep 構成ファイルでこれらのプロンプトに対する応答を使用して、次のデプロイ タスクを完了します。次の必要な Azure リソースを作成して構成します (
azd provisionと同等)。- Flex 従量課金プランと関数アプリ
- Azure Storage (必須) と Application Insights (推奨)
- アカウントのアクセス ポリシーとロール
- マネージド ID を使用したサービス間接続 (格納されている接続文字列の代わり)
- (オプション)関数アプリとその他の Azure リソースの両方を安全に実行するための仮想ネットワーク
コードをパッケージ化し、デプロイ コンテナーにデプロイします (
azd deployと同等)。 その後、アプリが起動し、デプロイされたパッケージで実行されます。
コマンドが正常に完了した後、作成したリソースへのリンクが表示されます。
Azure 上の関数を呼び出す
HTTP テスト ツールを使用するか、ブラウザー (GET 要求の場合) から URL に HTTP 要求を行うことで、Azure で関数エンドポイントを呼び出すようになりました。 関数が Azure で実行されると、アクセス キーの承認が適用され、要求に関数アクセス キーを指定する必要があります。
Core Tools を使用して、Azure で実行されている関数の URL エンドポイントを取得できます。
ローカル ターミナルまたはコマンド プロンプトで、次のコマンドを実行して URL エンドポイント値を取得します。
$APP_NAME = azd env get-value AZURE_FUNCTION_NAME func azure functionapp list-functions $APP_NAME --show-keysazd env get-valueコマンドでは、ローカル環境から関数アプリ名が取得されます。--show-keysでfunc azure functionapp list-functionsオプションを使用すると、返される呼び出し URL: 各エンドポイントの値に関数レベルのアクセス キーが含まれます。前と同様に、HTTP テスト ツールを使用して、Azure で実行されている関数アプリでこれらの URL を検証します。
コードを再デプロイする
azd up コマンドを必要な回数実行して、Azure リソースをプロビジョニングし、コード更新プログラムを関数アプリにデプロイします。
Note
デプロイされたコード ファイルは常に最新のデプロイ パッケージによって上書きされます。
azd プロンプトに対する最初の応答と、azd によって生成された環境変数は、名前付き環境にローカルに格納されます。
azd env get-values コマンドを使用して、Azure リソースの作成時に使用した環境内のすべての変数を確認します。
リソースをクリーンアップする
関数アプリと関連リソースの操作が完了したら、次のコマンドを使用して関数アプリとその関連リソースを Azure から削除し、それ以上のコストが発生しないようにします。
azd down --no-prompt
Note
--no-prompt オプションは、確認なしでリソース グループを削除するように azd に指示します。
このコマンドは、ローカル コード プロジェクトには影響しません。