クイックスタート: コマンド ラインから Azure に Java 関数を作成する

この記事では、コマンドライン ツールを使用して、HTTP 要求に応答する Java 関数を作成します。 コードをローカルでテストした後、Azure Functions のサーバーレス環境にデプロイします。

Maven が好みの開発ツールでない場合は、Java 開発者向けの同様のチュートリアルを確認してください。

このクイックスタートを完了すると、ご利用の Azure アカウントでわずかな (数セント未満の) コストが発生します。

ローカル環境を構成する

開始する前に、次の項目を用意する必要があります。

前提条件のチェック

  • ターミナルまたはコマンド ウィンドウで func --version を実行して、Azure Functions Core Tools のバージョンが 4.x であることを確認します。

  • az --version を実行して、Azure CLI バージョンが 2.4 以降であることを確認します。

  • az login を実行して Azure にサインインし、アクティブなサブスクリプションを確認します。

ローカル関数プロジェクトを作成する

Azure Functions における関数プロジェクトとは、それぞれが特定のトリガーに応答する個別の関数を 1 つまたは複数含んだコンテナーです。 プロジェクト内のすべての関数は、同じローカル構成とホスティング構成を共有します。 このセクションでは、関数を 1 つだけ含んだ関数プロジェクトを作成します。

  1. 空のフォルダーで次のコマンドを実行して、Maven アーキタイプから Functions プロジェクトを生成します。

    mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=8
    

    重要

    • Java 11 で関数を実行する場合は、-DjavaVersion=11 を使用します。 詳細については、「Java のバージョン」を参照してください。
    • この記事の作業を行うには、JAVA_HOME 環境変数を、適切なバージョンの JDK のインストール場所に設定する必要があります。
  2. Maven により、デプロイ時にプロジェクトの生成を終了するための値の入力が求められます。
    入力を求められたら、次の値を入力します。

    Prompt 説明
    groupId com.fabrikam Java のパッケージ命名規則に従って、すべてのプロジェクトにわたって対象のプロジェクトを一意に識別する値。
    artifactId fabrikam-functions バージョン番号のない、jar の名前である値。
    version 1.0-SNAPSHOT 既定値を選択します。
    package com.fabrikam 生成された関数コードの Java パッケージである値。 既定値を使用します。
  3. Y」と入力するか、Enter キーを押して確認します。

    Maven により、artifactId という名前の新しいフォルダーにプロジェクト ファイルが作成されます (この例では fabrikam-functions)。

  4. プロジェクト フォルダーに移動します。

    cd fabrikam-functions
    

    このフォルダーにはプロジェクト用の各種ファイルが格納されています。たとえば、local.settings.jsonhost.json といった名前の構成ファイルです。 local.settings.json には Azure からダウンロードしたシークレットを含めることができるため、このファイルは既定で .gitignore ファイルによってソース管理から除外されます。

(省略可) ファイルの内容を確認する

先に「関数をローカルで実行する」に進み、ファイルの内容は後から確認してもかまいません。

Function.java

Function.java には、run メソッドが含まれています。これは、トリガー動作を定義する HttpTrigger 注釈で装飾された HttpRequestMessage 内の request 変数で要求データを受け取ります。

/**
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License. See License.txt in the project root for
 * license information.
 */

package com.functions;

import com.microsoft.azure.functions.ExecutionContext;
import com.microsoft.azure.functions.HttpMethod;
import com.microsoft.azure.functions.HttpRequestMessage;
import com.microsoft.azure.functions.HttpResponseMessage;
import com.microsoft.azure.functions.HttpStatus;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;

import java.util.Optional;

/**
 * Azure Functions with HTTP Trigger.
 */
public class Function {
    /**
     * This function listens at endpoint "/api/HttpExample". Two ways to invoke it using "curl" command in bash:
     * 1. curl -d "HTTP Body" {your host}/api/HttpExample
     * 2. curl "{your host}/api/HttpExample?name=HTTP%20Query"
     */
    @FunctionName("HttpExample")
    public HttpResponseMessage run(
            @HttpTrigger(
                name = "req",
                methods = {HttpMethod.GET, HttpMethod.POST},
                authLevel = AuthorizationLevel.ANONYMOUS)
                HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {
        context.getLogger().info("Java HTTP trigger processed a request.");

        // Parse query parameter
        final String query = request.getQueryParameters().get("name");
        final String name = request.getBody().orElse(query);

        if (name == null) {
            return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query string or in the request body").build();
        } else {
            return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
        }
    }
}

応答メッセージは、HttpResponseMessage.Builder API によって生成されます。

pom.xml

アプリをホストするために作成された Azure リソースの設定は、生成された pom.xml ファイル内の com.microsoft.azure という groupId を持つプラグインの configuration 要素で定義されます。 たとえば、次の構成要素では、Maven ベースのデプロイに対して、westus リージョンの java-functions-group リソース グループに関数アプリを作成することを指示しています。 関数アプリ自体は、java-functions-app-service-plan プラン (既定では、サーバーレスの従量課金プラン) でホストされている Windows 上で実行されます。

<plugin>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-functions-maven-plugin</artifactId>
    <version>${azure.functions.maven.plugin.version}</version>
    <configuration>
        <!-- function app name -->
        <appName>${functionAppName}</appName>
        <!-- function app resource group -->
        <resourceGroup>${functionResourceGroup}</resourceGroup>
        <!-- function app service plan name -->
        <appServicePlanName>java-functions-app-service-plan</appServicePlanName>
        <!-- function app region-->
        <!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details#supported-regions for all valid values -->
        <region>${functionAppRegion}</region>
        <!-- function pricingTier, default to be consumption if not specified -->
        <!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details#supported-pricing-tiers for all valid values -->
        <!-- <pricingTier></pricingTier> -->

        <!-- Whether to disable application insights, default is false -->
        <!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details for all valid configurations for application insights-->
        <!-- <disableAppInsights></disableAppInsights> -->
        <runtime>
            <!-- runtime os, could be windows, linux or docker-->
            <os>windows</os>
            <javaVersion>8</javaVersion>
            <!-- for docker function, please set the following parameters -->
            <!-- <image>[hub-user/]repo-name[:tag]</image> -->
            <!-- <serverId></serverId> -->
            <!-- <registryUrl></registryUrl>  -->
        </runtime>
        <appSettings>
            <property>
                <name>FUNCTIONS_EXTENSION_VERSION</name>
                <value>~3</value>
            </property>
        </appSettings>
    </configuration>
    <executions>
        <execution>
            <id>package-functions</id>
            <goals>
                <goal>package</goal>
            </goals>
        </execution>
    </executions>
</plugin>

これらの設定を変更して、Azure でのリソースの作成方法を制御できます。たとえば、初期デプロイの前に runtime.oswindows から linux に変更することができます。 Maven プラグインでサポートされている設定の完全な一覧については、構成の詳細に関するページを参照してください。

FunctionTest.java

このアーキタイプでは、関数の単体テストも生成されます。 関数を変更してバインドを追加したり、新しい関数をプロジェクトに追加したりする場合は、FunctionTest.java ファイル内のテストも変更する必要があります。

関数をローカルで実行する

  1. LocalFunctionProj フォルダーから、ローカルの Azure Functions ランタイム ホストを起動して関数を実行します。

    mvn clean package
    mvn azure-functions:run
    

    出力の最後の方に、次の行があります。

     ...
    
     Now listening on: http://0.0.0.0:7071
     Application started. Press Ctrl+C to shut down.
    
     Http Functions:
    
             HttpExample: [GET,POST] http://localhost:7071/api/HttpExample
     ...
    
     

    注意

    HttpExample が上記のように表示されない場合、プロジェクトのルート フォルダー以外からホストを起動したと考えられます。 その場合は Ctrl + C キーを使用してホストを停止し、プロジェクトのルート フォルダーに移動して、前出のコマンドを再度実行してください。

  2. この出力から HttpExample 関数の URL をブラウザーにコピーし、クエリ文字列 ?name=<YOUR_NAME> を追加して、URL 全体を http://localhost:7071/api/HttpExample?name=Functions のようにします。 ブラウザーには、クエリ文字列値をエコー バックするメッセージが表示されるはずです。 要求を行うと、プロジェクトを起動したターミナルにもログ出力が表示されます。

  3. 完了したら、Ctrl + C キーを押し、y を選択して関数ホストを停止してください。

Azure に関数プロジェクトをデプロイする

最初に関数プロジェクトをデプロイすると、関数アプリと関連リソースが Azure に作成されます。 アプリをホストするために作成された Azure リソースの設定は、ファイルで定義されています。 この記事では、既定値をそのまま使用します。

ヒント

Windows ではなく Linux で実行される関数アプリを作成するには、pom.xml ファイルの runtime.os 要素を windows から linux に変更します。 従量課金プランでの Linux の実行は、これらのリージョンでサポートされています。 Linux 上で実行されるアプリと Windows 上で実行されるアプリを同じリソース グループに含めることはできません。

  1. デプロイする前に、Azure CLI または Azure PowerShell を使用して、Azure サブスクリプションにサインインします。

    az login
    

    az login コマンドで Azure アカウントにサインインします。

  2. 次のコマンドを使用して、対象のプロジェクトを新しい関数アプリにデプロイします。

    mvn azure-functions:deploy
    

    これにより、Azure に次のリソースが作成されます。

    • リソース グループ。 名前は java-functions-group です。
    • ストレージ アカウント。 Functions に必要です。 名前は、ストレージ アカウント名の要件に基づいてランダムに生成されます。
    • ホスティング プラン。 westus リージョンでの関数アプリのサーバーレス ホスティング。 名前は java-functions-app-service-plan です。
    • 関数アプリ。 関数アプリは、関数のデプロイと実行の単位です。 名前は artifactId に基づいてランダムに生成され、ランダムに生成された番号が付加されます。

    デプロイにより、プロジェクト ファイルがパッケージ化され、zip デプロイを使用して新しい関数アプリにデプロイされます。 このコードは、Azure の展開パッケージから実行されます。

Azure 上の関数を呼び出す

この関数は HTTP トリガーを使用しているため、呼び出しは、その URL にブラウザーから HTTP 要求を送信するか、または curl などのツールを使用して行います。

publish コマンドの出力に表示されている完全な 呼び出し URL にクエリ パラメーター &name=Functions を追加して、ブラウザーのアドレス バーにコピーします。 関数をローカルで実行したときと同様の出力がブラウザーに表示されるはずです。

Azure 上で実行された関数の出力をブラウザーで表示したところ

凖リアルタイムのストリーミング ログを表示するには、次のコマンドを実行します。

func azure functionapp logstream <APP_NAME> 

別のターミナル ウィンドウまたはブラウザーで、もう一度リモート関数を呼び出します。 Azure で実行された関数の詳細ログがターミナルに表示されます。

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

次の手順に進んで Azure Storage キュー出力バインディングを追加する場合、既存の作業をベースにするので、リソースはすべてそのままにしておいてください。

それ以外の場合は、追加コストの発生を避けるために、次のコマンドを使用して、リソース グループとそこに含まれるすべてのリソースを削除してください。

az group delete --name java-functions-group

次のステップ