検索

キーワード


【Azure Functions】ServiceBusTriggerをJavaで作成しデプロイする

  • 公開日:2021-02-19 23:02:32
  • 最終更新日:2021-03-31 20:18:39
【Azure Functions】ServiceBusTriggerをJavaで作成しデプロイする

Azure Functions を使用し ServiceBusTrigger Java で作成・デプロイ する。

このページでは以下の内容を記載しています。

 ・Azure Functionsの作成

 ・ServiceBusTriggerでのServiceBusとFunctionsのバインド

 ・JavaでのServiceBusTrigger作成方法

 ・ServiceBusTriggerのデプロイ

 ・エラーやExceptionの対応
 

概要図

Azureサービス構成図

様々なサービスをつくる上でサンプルとして参考にして頂けると幸いです。


前提条件

・アクティブなサブスクリプションが含まれる Azure アカウント

・Azure-CLIのインストール

・Java Developer Kit、バージョン 8 または 11

・Apache Maven バージョン 3.0 ~

・Java と Maven をサポートする Eclipse

・EclipseにAzure Toolkit for Eclipseのインストール

・(おすすめ)Azure Functions Core Tools


ServiceBusサービスをポータルから作成する

ブラウザからAzureにログインし、新規でServiceBusを作成します。(CLIでも作成可能、今回はPortalを使用)

名前空間の作成

リソースグループは作成済みのグループを設定しています。任意に設定してください。

ServiceBus_NameSpace


作成したServiceBusにキューを作成

ServiceBus_Queue


※共有アクセスポリシーから 接続文字列を保管しておいてください。後段で使用します。

ServiceBus_ConectionString


AzureFunctionsサービスをポータルから作成する

ブラウザからAzureにログインし、新規でFunctionを作成します。(CLIでも作成可能、今回はPortalを使用)

関数アプリの作成

Function_base

※こちらの関数アプリ名はJavaのソース内でも使用します。

Function_host

ストレージアカウントは作成済みを設定しています。任意に作成・設定してください。

Function_watch

Function_all


構成の変更(アプリケーション設定の追加)

ここで設定するキー名(今回はSERVICE_BUS_CONNECTIONSTRING)はJavaのソース内でも使用します。

設定する値はServiceBusの 接続文字列を使用します。

Function_app_setting


EclipseでJavaアプリ作成

Functions プロジェクトを作成する

Eclipse で、 [File](ファイル) メニューを選択 > [New](新規作成) > [Maven Project](Maven プロジェクト) を選択する

[New Maven Project](新しい Maven プロジェクト) ダイアログを既定値のままにして [Next](次へ) を選択する

Function_Maven_proj

-------画像----------

azure-functions-archetype を選択し、 [次へ]

Java_Maven_proj02


すべてのフィールドに値を入力

appName sample-function01 ※Function作成時に設定した名称(関数アプリ名)
appRegion japaneast ※Function作成時に設定したリージョンを設定する
resourceGroup Function作成時に設定したリソースグループを設定する
javaVersion 8
trigger ServiceBusTrigger 

Java_Maven_proj03

 

Function.javaを作成する

import com.microsoft.azure.functions.ExecutionContext;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.ServiceBusQueueTrigger;

/**
 * Azure Functions with ServiceBusTrigger.
 */
public class Function {
    /**
    * ServiceBusTrigger
    * @param message
    * @param context
    */
    @FunctionName("servicebus-trigger")
    public void run(
            @ServiceBusQueueTrigger(
                    name = "message"
                    , queueName = "sb-sample-queue-for-function"
                    , connection = "SERVICE_BUS_CONNECTIONSTRING") String message,
            final ExecutionContext context) {
        context.getLogger().info("ServiceBusTrigger start.");

        //Out put message.
        context.getLogger().info(message);

        context.getLogger().info("ServiceBusTrigger end.");
    }
}


今回のプロジェクト構成は以下です

 Java_Function_create


pom.xmlを編集する

サンプルは以下の通りです。適時、それぞれの仕様や環境に合わせて編集して下さい。

今回はFunctionに従量課金プランを設定したので、appServicePlanNameを設定しません。

<?xml version="1.0" encoding="UTF-8" ?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.ms.az.functions</groupId>
    <artifactId>sample-function</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>Azure Java Functions</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <azure.functions.maven.plugin.version>1.9.1</azure.functions.maven.plugin.version>
        <azure.functions.java.library.version>1.4.0</azure.functions.java.library.version>
        <functionAppName>sample-function01</functionAppName>
        <functionAppReagion>japaneast</functionAppReagion>
        <functionResourceGroup>rs-XXXX</functionResourceGroup>
        <stagingDirectory>${project.build.directory}/azure-functions/${functionAppName}</stagingDirectory>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.microsoft.azure.functions</groupId>
            <artifactId>azure-functions-java-library</artifactId>
            <version>${azure.functions.java.library.version}</version>
        </dependency>

        <!-- Test -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.4.2</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>2.23.4</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
            <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>rs-XXXX</resourceGroup>
                    <!-- function app service plan name 
                    <appServicePlanName>java-functions-app-service-plan</appServicePlanName>
                     -->
                    <!-- function app region-->
                    <region>japaneast</region>
                    <runtime>
                        <os>windows</os>
                        <javaVersion>8</javaVersion>
                    </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>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.1.0</version>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <overwrite>true</overwrite>
                            <outputDirectory>${stagingDirectory}</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>${project.basedir}</directory>
                                    <includes>
                                        <include>host.json</include>
                                        <include>local.settings.json</include>
                                    </includes>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.1.1</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${stagingDirectory}/lib</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                            <includeScope>runtime</includeScope>
                            <excludeArtifactIds>azure-functions-java-library</excludeArtifactIds>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>


Azure Functionsに作成したアプリをデプロイする

Mavenコマンドでclean後、packageを行う

 mvn clean package

Java_Func_deploy01

BUILD FAILUREが発生する場合はEclipseに問題(エラー)が出ていないか確認しましょう

pom.xmlも記述ミスがないか確認しましょう

プロキシ環境の場合settings.xmlにプロキシ設定があるか確認する(mavenの.m2フォルダ直下に配置されているはずです)

settings.xml
<proxies>
  <proxy>
    <id>sampleid001</id>
    <active>true</active>
    <protocol>https</protocol>
    <username>proxyuser</username>
    <password>proxypass</password>
    <host>proxy.host.net</host>
    <port>8080</port>
    <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
  </proxy>
</proxies>


Mavenコマンドでデプロイを行う

 mvn azure-functions:deploy

Java_Func_deploy02


Functionへのデプロイ確認

ポータルからFunctions > 関数 > を選択します

Function_deploy_check01


関数を選択 > 統合 > トリガー から内容を確認する

Function_deploy_check02


ServiceBusとFunctionのバインドテスト

ServiceBusのQueueにメッセージ登録

ServiceBusExplorerでメッセージ作成送信(※送信押下前にFunctionのログストリーム画面を表示させておく)

Function_deploy_teste01


Functionのログ確認

監視 > ログストリーム  接続できることを確認する

Function_deploy_test02


ログに [Information] test01 が出力されていて、ServiceBusQueueに送信したメッセージが出力されている事がわかる。




以上でServiceBusとFunctionsのバインドができており、ServiceBusQueueトリガーが正常に動作していることがわかりました。




Error/Exception対応

ここでは出現頻度が高そうなエラーやExceptionとその対応について記述します

同じ様な事象が起きた場合参考にしてください


ログイン時(az login)

Error/Exception内容

Please ensure you have network connection. Error detail: HTTPSConnectionPool(host='login.microsoftonline.com', port=443): Max retries exceeded with url: /common/oauth2/token (Caused by NewConnectionError(': Failed to establish a new connection: [Error XXXXX]getaddinfo failed'.))

対応例

・ログインアカウントの確認、権限があるか

・プロキシ設定の有無

 プロキシ設定が必要な場合、以下の様に設定する

 set https.proxyHost=domain

 set https.proxyPort=8080

 set https.proxyUser=user

 set https.proxyPassword=password

 set HTTPS_PROXY=http://user:password@domain:8080


デプロイ時(mvn azure-functions:deploy)

Error/Exception内容1

"The specified function app does not exist. Creating a new function app..."
-------------------------------------------------------------------
BUILD FAILURE
-------------------------------------------------------------------
Failed to execute goal com.microsoft.azure:azure-functions-maven-plugin:1.5.0:run (default-cli) on project XXXX: java.net.UnknownHostException: management.azure.com:

対応例

・サブスクリプションの確認

 現在選択中のサブスクリプションが正しいか確認する

 以下でサブスクリプションをセットすることができる

 az account set --subscription "正しいサブスクリプション"

・pom.xmlの確認

 デプロイ対象のFunctionがAzureに存在しているか

 pom.xmlのpropertiesタグの中のfunctionAppNameがデプロイ対象のFunction名称(ポータルから名称が合っているか確認してみましょう)

Error/Exception内容2

Updating the specified function app...
-------------------------------------------------------------------
BUILD FAILURE
-------------------------------------------------------------------
Failed to execute goal com.microsoft.azure:azure-functions-maven-plugin:1.9.1:deploy (default-cli) on project sample-function: Target app service plan XXXXX-service-plan cannot be found in resource group YYYYY, ...

対応例

・リソースグループの確認

 ポータルから作成したFunctionのリソースグループとpom.xmlに設定したリソースグループに相違がないか 確認する

・サービスプランとサービスプラン名称の確認

 今回のサンプルで はサービスプランをpom.xmlに設定しない(従量課金プラン選択の為)

 AppServicePlanの場合は ポータルから作成したサービスプラン名称とpom.xmlに設定した 名称に相違がないか確認する



参考サイト:

Azure Functionsサービスについて

Azure Service Busサービスについて

Azure Functions における Azure Service Bus のバインド

Azure Service Bus キューとの間でメッセージを送受信する (Java)



【著者】

k_toshi

----------------------------------------------------------------