次の方法で共有


クイック スタート: Azure Functions を使用してスケーラブルな Web API を構築する

このクイック スタートでは、Azure Developer コマンド ライン ツールを使用して、HTTP 要求に応答する関数エンドポイントを含むスケーラブルな Web API を構築します。 コードをローカルでテストした後、Azure Functions の Flex 従量課金プランで実行して作成した新しいサーバーレス関数アプリにデプロイします。

プロジェクト ソースでは、Azure へのコードのデプロイを簡略化するために Azure Developer CLI (azd) が使用されます。 このデプロイは、セキュリティで保護されたスケーラブルな Azure Functions デプロイの最新のベスト プラクティスに従います。

既定では、Flex 従量課金プランは 従量課金 制の課金モデルに従います。つまり、このクイック スタートを完了すると、Azure アカウントで数 USD セント以下の小さなコストが発生します。

Prerequisites

  • JSON ペイロードを含む要求を関数エンドポイントに送信するための 安全な HTTP テスト ツール。 この記事では、curl を使用します。

プロジェクトを初期化する

azd init コマンドを使用して、テンプレートからローカル Azure Functions コード プロジェクトを作成します。

  1. ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の azd init コマンドを実行します。

    azd init --template functions-quickstart-dotnet-azd -e httpendpoint-dotnet
    

    このコマンドは、 テンプレート リポジトリ からプロジェクト ファイルをプルし、現在のフォルダー内のプロジェクトを初期化します。 -e フラグでは、現在の環境の名前が設定されます。 azdでは、環境はアプリの一意のデプロイ コンテキストを維持し、複数を定義できます。 これは、Azure で作成するリソース グループの名前でも使用されます。

  2. 次のコマンドを実行して、http アプリ フォルダーに移動します。

    cd http
    
  3. 次の JSON データを含む フォルダーにlocal.settings.jsonという名前のファイルを作成します。

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
        }
    }
    

    このファイルは、ローカルで実行する場合に必要です。

  1. ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の azd init コマンドを実行します。

    azd init --template azure-functions-java-flex-consumption-azd -e httpendpoint-java 
    

    このコマンドは、 テンプレート リポジトリ からプロジェクト ファイルをプルし、現在のフォルダー内のプロジェクトを初期化します。 -e フラグでは、現在の環境の名前が設定されます。 azdでは、環境はアプリの一意のデプロイ コンテキストを維持し、複数を定義できます。 これは、Azure で作成するリソース グループの名前でも使用されます。

  2. 次のコマンドを実行して、http アプリ フォルダーに移動します。

    cd http
    
  3. 次の JSON データを含む フォルダーにlocal.settings.jsonという名前のファイルを作成します。

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "java"
        }
    }
    

    このファイルは、ローカルで実行する場合に必要です。

  1. ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の azd init コマンドを実行します。

    azd init --template functions-quickstart-javascript-azd -e httpendpoint-js
    

    このコマンドは、 テンプレート リポジトリ からプロジェクト ファイルをプルし、ルート フォルダー内のプロジェクトを初期化します。 -e フラグでは、現在の環境の名前が設定されます。 azdでは、環境はアプリの一意のデプロイ コンテキストを維持し、複数を定義できます。 これは、Azure で作成するリソース グループの名前でも使用されます。

  2. 次の JSON データを含む local.settings.json という名前のファイルをルート フォルダーに作成します。

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "node"
        }
    }
    

    このファイルは、ローカルで実行する場合に必要です。

  1. ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の azd init コマンドを実行します。

    azd init --template functions-quickstart-powershell-azd -e httpendpoint-ps
    

    このコマンドは、 テンプレート リポジトリ からプロジェクト ファイルをプルし、ルート フォルダー内のプロジェクトを初期化します。 -e フラグでは、現在の環境の名前が設定されます。 azdでは、環境はアプリの一意のデプロイ コンテキストを維持し、複数を定義できます。 これは、Azure で作成するリソース グループの名前でも使用されます。

  2. 次のコマンドを実行して、src アプリ フォルダーに移動します。

    cd src
    
  3. 次の JSON データを含む フォルダーにlocal.settings.jsonという名前のファイルを作成します。

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "powershell",
            "FUNCTIONS_WORKER_RUNTIME_VERSION": "7.2"
        }
    }
    

    このファイルは、ローカルで実行する場合に必要です。

  1. ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の azd init コマンドを実行します。

    azd init --template functions-quickstart-typescript-azd -e httpendpoint-ts
    

    このコマンドは、 テンプレート リポジトリ からプロジェクト ファイルをプルし、ルート フォルダー内のプロジェクトを初期化します。 -e フラグでは、現在の環境の名前が設定されます。 azdでは、環境はアプリの一意のデプロイ コンテキストを維持し、複数を定義できます。 環境名は、Azure で作成するリソース グループの名前にも使用されます。

  2. 次の JSON データを含む local.settings.json という名前のファイルをルート フォルダーに作成します。

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "node"
        }
    }
    

    このファイルは、ローカルで実行する場合に必要です。

  1. ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の azd init コマンドを実行します。

    azd init --template functions-quickstart-python-http-azd -e httpendpoint-py
    

    このコマンドは、 テンプレート リポジトリ からプロジェクト ファイルをプルし、ルート フォルダー内のプロジェクトを初期化します。 -e フラグでは、現在の環境の名前が設定されます。 azdでは、環境はアプリの一意のデプロイ コンテキストを維持し、複数を定義できます。 環境名は、Azure で作成するリソース グループの名前にも使用されます。

  2. 次の 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

ローカル環境で実行する

  1. ターミナルまたはコマンド プロンプトでアプリ フォルダーから次のコマンドを実行します。

    func start
    
    mvn clean package
    mvn azure-functions:run
    
    npm install
    func start  
    
    npm install
    npm start  
    

    Functions ホストがローカル プロジェクト フォルダーで起動すると、HTTP によってトリガーされる関数の URL エンドポイントがターミナル出力に書き込まれます。

    Note

    ローカルで実行する場合、アクセス キーの承認は適用されないため、返される関数の URL にはアクセス キーの値が含まれていないため、関数を呼び出すために必要ありません。

  2. ブラウザーで、 httpget エンドポイントに移動します。この URL は次のようになります。

    http://localhost:7071/api/httpget

  3. 新しいターミナルまたはコマンド プロンプト ウィンドウから、次の curl コマンドを実行して、JSON ペイロードを含む POST 要求を httppost エンドポイントに送信します。

    curl -i http://localhost:7071/api/httppost -H "Content-Type: text/json" -d @testdata.json
    
    curl -i http://localhost:7071/api/httppost -H "Content-Type: text/json" -d "@src/functions/testdata.json"
    

    このコマンドにより、testdata.json プロジェクト ファイルから JSON ペイロード データが読み取られます。 両方の HTTP 要求の例は test.http プロジェクト ファイルにあります。

  4. 完了したら、ターミナル ウィンドウで Ctrl + C キーを押して、func.exe ホスト プロセスを停止します。

  1. 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 フォルダー内) が含まれています。

  1. 次のコマンドを実行し、azd で必要な Azure リソースを Azure に作成し、コード プロジェクトを新しい関数アプリにデプロイします。

    azd up
    

    ルート フォルダーには、azure.yaml に必要な azd 定義ファイルが含まれています。

    まだサインインしていない場合は、Azure アカウントで認証するように求められます。

  2. プロンプトが表示されたら、次の必須のデプロイ パラメーターを指定します。

    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 エンドポイントを取得できます。

  1. ローカル ターミナルまたはコマンド プロンプトで、次のコマンドを実行して URL エンドポイント値を取得します。

    SET APP_NAME=$(azd env get-value AZURE_FUNCTION_NAME)
    func azure functionapp list-functions $APP_NAME --show-keys
    
    $APP_NAME = azd env get-value AZURE_FUNCTION_NAME
    func azure functionapp list-functions $APP_NAME --show-keys
    

    azd env get-value コマンドでは、ローカル環境から関数アプリ名が取得されます。 --show-keysfunc azure functionapp list-functions オプションを使用すると、返される呼び出し URL: 各エンドポイントの値に関数レベルのアクセス キーが含まれます。

  2. 前と同様に、HTTP テスト ツールを使用して、Azure で実行されている関数アプリでこれらの URL を検証します。

コードを再デプロイする

azd up コマンドを必要な回数実行して、Azure リソースをプロビジョニングし、コード更新プログラムを関数アプリにデプロイします。

Note

デプロイされたコード ファイルは常に最新のデプロイ パッケージによって上書きされます。

azd プロンプトに対する最初の応答と、azd によって生成された環境変数は、名前付き環境にローカルに格納されます。 azd env get-values コマンドを使用して、Azure リソースの作成時に使用した環境内のすべての変数を確認します。

リソースをクリーンアップする

関数アプリと関連リソースの操作が完了したら、次のコマンドを使用して関数アプリとその関連リソースを Azure から削除し、それ以上のコストが発生しないようにします。

azd down --no-prompt

Note

--no-prompt オプションは、確認なしでリソース グループを削除するように azd に指示します。

このコマンドは、ローカル コード プロジェクトには影響しません。