クイックスタート: コマンド ラインから Azure に Java 関数を作成するQuickstart: Create a Java function in Azure from the command line

この記事では、コマンドライン ツールを使用して、HTTP 要求に応答する Java 関数を作成します。In this article, you use command-line tools to create a Java function that responds to HTTP requests. コードをローカルでテストした後、Azure Functions のサーバーレス環境にデプロイします。After testing the code locally, you deploy it to the serverless environment of Azure Functions.

このクイックスタートを完了すると、ご利用の Azure アカウントでわずかな (数セント未満の) コストが発生します。Completing this quickstart incurs a small cost of a few USD cents or less in your Azure account.

注意

Maven が好みの開発ツールでない場合は、GradleIntelliJ IDEA、および Visual Studio Code を使用する Java 開発者向けの同様のチュートリアルを確認してください。If Maven is not your preferred development tool, check out our similar tutorials for Java developers using Gradle, IntelliJ IDEA and Visual Studio Code.

ローカル環境を構成するConfigure your local environment

開始する前に、次の項目を用意する必要があります。Before you begin, you must have the following:

前提条件のチェックPrerequisite check

  • ターミナルまたはコマンド ウィンドウで func --version を実行して、Azure Functions Core Tools のバージョンが 3.x であることを確認します。In a terminal or command window, run func --version to check that the Azure Functions Core Tools are version 3.x.

  • az --version を実行して、Azure CLI バージョンが 2.4 以降であることを確認します。Run az --version to check that the Azure CLI version is 2.4 or later.

  • az login を実行して Azure にサインインし、アクティブなサブスクリプションを確認します。Run az login to sign in to Azure and verify an active subscription.

ローカル関数プロジェクトを作成するCreate a local function project

Azure Functions における関数プロジェクトとは、それぞれが特定のトリガーに応答する個別の関数を 1 つまたは複数含んだコンテナーです。In Azure Functions, a function project is a container for one or more individual functions that each responds to a specific trigger. プロジェクト内のすべての関数は、同じローカル構成とホスティング構成を共有します。All functions in a project share the same local and hosting configurations. このセクションでは、関数を 1 つだけ含んだ関数プロジェクトを作成します。In this section, you create a function project that contains a single function.

  1. 空のフォルダーで次のコマンドを実行して、Maven アーキタイプから Functions プロジェクトを生成します。In an empty folder, run the following command to generate the Functions project from a Maven archetype.

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

    重要

    • Java 11 で関数を実行する場合は、-DjavaVersion=11 を使用します。Use -DjavaVersion=11 if you want your functions to run on Java 11. 詳細については、「Java のバージョン」を参照してください。To learn more, see Java versions.
    • この記事の作業を行うには、JAVA_HOME 環境変数を、適切なバージョンの JDK のインストール場所に設定する必要があります。The JAVA_HOME environment variable must be set to the install location of the correct version of the JDK to complete this article.
  2. Maven により、デプロイ時にプロジェクトの生成を終了するための値の入力が求められます。Maven asks you for values needed to finish generating the project on deployment.
    入力を求められたら、次の値を入力します。Provide the following values when prompted:

    PromptPrompt Value 説明Description
    groupIdgroupId com.fabrikam Java のパッケージ命名規則に従って、すべてのプロジェクトにわたって対象のプロジェクトを一意に識別する値。A value that uniquely identifies your project across all projects, following the package naming rules for Java.
    artifactIdartifactId fabrikam-functions バージョン番号のない、jar の名前である値。A value that is the name of the jar, without a version number.
    versionversion 1.0-SNAPSHOT 既定値を選択します。Choose the default value.
    packagepackage com.fabrikam 生成された関数コードの Java パッケージである値。A value that is the Java package for the generated function code. 既定値を使用します。Use the default.
  3. Y」と入力するか、Enter キーを押して確認します。Type Y or press Enter to confirm.

    Maven により、artifactId という名前の新しいフォルダーにプロジェクト ファイルが作成されます (この例では fabrikam-functions)。Maven creates the project files in a new folder with a name of artifactId, which in this example is fabrikam-functions.

  4. プロジェクト フォルダーに移動します。Navigate into the project folder:

    cd fabrikam-functions
    

    このフォルダーにはプロジェクト用の各種ファイルが格納されています。たとえば、local.settings.jsonhost.json といった名前の構成ファイルです。This folder contains various files for the project, including configurations files named local.settings.json and host.json. local.settings.json には Azure からダウンロードしたシークレットを含めることができるため、このファイルは既定で .gitignore ファイルによってソース管理から除外されます。Because local.settings.json can contain secrets downloaded from Azure, the file is excluded from source control by default in the .gitignore file.

(省略可) ファイルの内容を確認する(Optional) Examine the file contents

先に「関数をローカルで実行する」に進み、ファイルの内容は後から確認してもかまいません。If desired, you can skip to Run the function locally and examine the file contents later.

Function.javaFunction.java

Function.java には、run メソッドが含まれています。これは、トリガー動作を定義する HttpTrigger 注釈で装飾された HttpRequestMessage 内の request 変数で要求データを受け取ります。Function.java contains a run method that receives request data in the request variable is an HttpRequestMessage that's decorated with the HttpTrigger annotation, which defines the trigger behavior.

/**
 * 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 によって生成されます。The response message is generated by the HttpResponseMessage.Builder API.

pom.xmlpom.xml

アプリをホストするために作成された Azure リソースの設定は、生成された pom.xml ファイル内の com.microsoft.azure という groupId を持つプラグインの configuration 要素で定義されます。Settings for the Azure resources created to host your app are defined in the configuration element of the plugin with a groupId of com.microsoft.azure in the generated pom.xml file. たとえば、次の構成要素では、Maven ベースのデプロイに対して、westus リージョンの java-functions-group リソース グループに関数アプリを作成することを指示しています。For example, the configuration element below instructs a Maven-based deployment to create a function app in the java-functions-group resource group in the westus region. 関数アプリ自体は、java-functions-app-service-plan プラン (既定では、サーバーレスの従量課金プラン) でホストされている Windows 上で実行されます。The function app itself runs on Windows hosted in the java-functions-app-service-plan plan, which by default is a serverless Consumption plan.

<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 に変更することができます。You can change these settings to control how resources are created in Azure, such as by changing runtime.os from windows to linux before initial deployment. Maven プラグインでサポートされている設定の完全な一覧については、構成の詳細に関するページを参照してください。For a complete list of settings supported by the Maven plug-in, see the configuration details.

FunctionTest.javaFunctionTest.java

このアーキタイプでは、関数の単体テストも生成されます。The archetype also generates a unit test for your function. 関数を変更してバインドを追加したり、新しい関数をプロジェクトに追加したりする場合は、FunctionTest.java ファイル内のテストも変更する必要があります。When you change your function to add bindings or add new functions to the project, you'll also need to modify the tests in the FunctionTest.java file.

関数をローカルで実行するRun the function locally

  1. LocalFunctionProj フォルダーから、ローカルの Azure Functions ランタイム ホストを起動して関数を実行します。Run your function by starting the local Azure Functions runtime host from the LocalFunctionProj folder:

    mvn clean package
    mvn azure-functions:run
    

    出力の最後の方に、次の行があります。Toward the end of the output, the following lines should appear:

     ...
    
     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 が上記のように表示されない場合、プロジェクトのルート フォルダー以外からホストを起動したと考えられます。If HttpExample doesn't appear as shown above, you likely started the host from outside the root folder of the project. その場合は Ctrl + C キーを使用してホストを停止し、プロジェクトのルート フォルダーに移動して、前出のコマンドを再度実行してください。In that case, use Ctrl+C to stop the host, navigate to the project's root folder, and run the previous command again.

  2. この出力から HttpExample 関数の URL をブラウザーにコピーし、クエリ文字列 ?name=<YOUR_NAME> を追加して、URL 全体を http://localhost:7071/api/HttpExample?name=Functions のようにします。Copy the URL of your HttpExample function from this output to a browser and append the query string ?name=<YOUR_NAME>, making the full URL like http://localhost:7071/api/HttpExample?name=Functions. ブラウザーには、クエリ文字列値をエコー バックするメッセージが表示されるはずです。The browser should display a message that echoes back your query string value. 要求を行うと、プロジェクトを起動したターミナルにもログ出力が表示されます。The terminal in which you started your project also shows log output as you make requests.

  3. 完了したら、Ctrl + C キーを押し、y を選択して関数ホストを停止してください。When you're done, use Ctrl+C and choose y to stop the functions host.

Azure に関数プロジェクトをデプロイするDeploy the function project to Azure

最初に関数プロジェクトをデプロイすると、関数アプリと関連リソースが Azure に作成されます。A function app and related resources are created in Azure when you first deploy your functions project. アプリをホストするために作成された Azure リソースの設定は、ファイルで定義されています。Settings for the Azure resources created to host your app are defined in the pom.xml file. この記事では、既定値をそのまま使用します。In this article, you'll accept the defaults.

ヒント

Windows ではなく Linux で実行される関数アプリを作成するには、pom.xml ファイルの runtime.os 要素を windows から linux に変更します。To create a function app running on Linux instead of Windows, change the runtime.os element in the pom.xml file from windows to linux. 従量課金プランでの Linux の実行は、これらのリージョンでサポートされています。Running Linux in a consumption plan is supported in these regions. Linux 上で実行されるアプリと Windows 上で実行されるアプリを同じリソース グループに含めることはできません。You can't have apps that run on Linux and apps that run on Windows in the same resource group.

  1. デプロイする前に、Azure CLI または Azure PowerShell を使用して、Azure サブスクリプションにサインインします。Before you can deploy, sign in to your Azure subscription using either Azure CLI or Azure PowerShell.

    az login
    

    az login コマンドで Azure アカウントにサインインします。The az login command signs you into your Azure account.

  2. 次のコマンドを使用して、対象のプロジェクトを新しい関数アプリにデプロイします。Use the following command to deploy your project to a new function app.

    mvn azure-functions:deploy
    

    これにより、Azure に次のリソースが作成されます。This creates the following resources in Azure:

    • リソース グループ。Resource group. 名前は java-functions-group です。Named as java-functions-group.
    • ストレージ アカウント。Storage account. Functions に必要です。Required by Functions. 名前は、ストレージ アカウント名の要件に基づいてランダムに生成されます。The name is generated randomly based on Storage account name requirements.
    • ホスティング プラン。Hosting plan. westus リージョンでの関数アプリのサーバーレス ホスティング。Serverless hosting for your function app in the westus region. 名前は java-functions-app-service-plan です。The name is java-functions-app-service-plan.
    • 関数アプリ。Function app. 関数アプリは、関数のデプロイと実行の単位です。A function app is the deployment and execution unit for your functions. 名前は artifactId に基づいてランダムに生成され、ランダムに生成された番号が付加されます。The name is randomly generated based on your artifactId, appended with a randomly generated number.

    デプロイにより、プロジェクト ファイルがパッケージ化され、zip デプロイを使用して新しい関数アプリにデプロイされます。The deployment packages the project files and deploys them to the new function app using zip deployment. このコードは、Azure の展開パッケージから実行されます。The code runs from the deployment package in Azure.

Azure 上の関数を呼び出すInvoke the function on Azure

この関数は HTTP トリガーを使用しているため、呼び出しは、その URL にブラウザーから HTTP 要求を送信するか、または curl などのツールを使用して行います。Because your function uses an HTTP trigger, you invoke it by making an HTTP request to its URL in the browser or with a tool like curl.

publish コマンドの出力に表示されている完全な 呼び出し URL にクエリ パラメーター &name=Functions を追加して、ブラウザーのアドレス バーにコピーします。Copy the complete Invoke URL shown in the output of the publish command into a browser address bar, appending the query parameter &name=Functions. 関数をローカルで実行したときと同様の出力がブラウザーに表示されるはずです。The browser should display similar output as when you ran the function locally.

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

凖リアルタイムのストリーミング ログを表示するには、次のコマンドを実行します。Run the following command to view near real-time streaming logs:

func azure functionapp logstream <APP_NAME> 

別のターミナル ウィンドウまたはブラウザーで、もう一度リモート関数を呼び出します。In a separate terminal window or in the browser, call the remote function again. Azure で実行された関数の詳細ログがターミナルに表示されます。A verbose log of the function execution in Azure is shown in the terminal.

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

次の手順に進んで Azure Storage キュー出力バインディングを追加する場合、既存の作業をベースにするので、リソースはすべてそのままにしておいてください。If you continue to the next step and add an Azure Storage queue output binding, keep all your resources in place as you'll build on what you've already done.

それ以外の場合は、追加コストの発生を避けるために、次のコマンドを使用して、リソース グループとそこに含まれるすべてのリソースを削除してください。Otherwise, use the following command to delete the resource group and all its contained resources to avoid incurring further costs.

az group delete --name java-functions-group

次のステップNext steps