次の方法で共有


クイック スタート: Azure Developer CLI を使用して関数を作成して Azure Functions にデプロイする

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

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

重要

Flex 従量課金プランは現在、プレビュー段階です。

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

前提条件

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    {
        "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 flexquickstart-ts
    

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

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

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

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

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

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

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

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

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

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

仮想環境を作成してアクティブにする

ルート フォルダーで、次のコマンドを実行して、.venv という名前の仮想環境を作成してアクティブにします。

python3 -m venv .venv
source .venv/bin/activate

お使いの Linux ディストリビューションに Python の venv パッケージがインストールされていなかった場合は、次のコマンドを実行します。

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 エンドポイントがターミナル出力に書き込まれます。

  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 provision コマンドを使用して、Flex 従量課金プランで関数アプリを、他の必要な Azure リソースと共に作成するように構成されています。

Note

このプロジェクトには、ベスト プラクティスに従った Flex 従量課金プランへの安全なデプロイを作成するために azd で使用される Bicep ファイルのセットが含まれています。

azd up および azd deploy コマンドは、現在、Java アプリではサポートされていません。

  1. プロジェクトのルート フォルダーで、次のコマンドを実行して、必要な Azure リソースを作成します。

    azd provision
    

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

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

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

    パラメーター 説明
    Azure サブスクリプション リソースが作成されるサブスクリプション。
    Azure の場所 新しい Azure リソースを含むリソース グループを作成する Azure リージョン。 現在、Flex 従量課金プランをサポートしているリージョンのみが表示されます。

    azd provision コマンドでは、Bicep 構成ファイルでこれらのプロンプトに対する応答を使用して、必要な Azure リソースを作成して構成します。

    • Flex 従量課金プランと関数アプリ
    • Azure Storage (必須) と Application Insights (推奨)
    • アカウントのアクセス ポリシーとロール
    • マネージド ID を使用したサービス間接続 (格納されている接続文字列の代わり)
    • 関数アプリとその他の Azure リソースの両方を安全に実行するための仮想ネットワーク

    コマンドが正常に完了した後、Azure のこの新しい関数アプリにプロジェクト コードをデプロイできます。

Azure に配置する

Core Tools を使用してコードをパッケージ化し、target 出力フォルダーから Azure にデプロイできます。

  1. target 出力フォルダー内の同等のアプリ フォルダーに移動します。

    cd http/target/azure-functions/contoso-functions
    

    このフォルダーには、コンパイル済みの Java 関数アプリのルートであることを示す host.json ファイルが必要です。

  2. Core Tools を使用して、コンパイル済みの Java コード プロジェクトを Azure の新しい関数アプリ リソースにデプロイするには、次のコマンドを実行します。

    APP_NAME=$(azd env get-value AZURE_FUNCTION_NAME)
    func azure functionapp publish $APP_NAME
    

    azd env get-value コマンドでは、ローカル環境から関数アプリ名を取得します。これは、func azure functionapp publish を使用したデプロイに必要です。 発行が正常に完了した後、Azure の HTTP トリガー エンドポイントへのリンクが表示されます。

Azure に配置する

このプロジェクトは、azd up コマンドを使用して、Azure の Flex 従量課金プランの新しい関数アプリにこのプロジェクトをデプロイするように構成されています。

ヒント

このプロジェクトには、ベスト プラクティスに従った Flex 従量課金プランへの安全なデプロイを作成するために azd で使用される Bicep ファイルのセットが含まれています。

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

    azd up
    

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

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

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

    パラメーター 説明
    Azure サブスクリプション リソースが作成されるサブスクリプション。
    Azure の場所 新しい Azure リソースを含むリソース グループを作成する Azure リージョン。 現在、Flex 従量課金プランをサポートしているリージョンのみが表示されます。

    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 コマンドでは、ローカル環境から関数アプリ名が取得されます。 func azure functionapp list-functions--show-keys オプションを使用することは、返される呼び出し 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 に指示します。

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