検索

キーワード


目次

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

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

Workteria(ワークテリア)では難易度の高いものから低いものまで、スキルや経験に合わせた案件を多数揃えています。会員登録は無料ですので、ぜひ会員登録してご希望の案件を探してみてください!

フリーランス/正社員のエンジニアとして活躍するには、ご自身のスキルや経験に合わせた仕事を選ぶことが大切です。ご希望の案件がみつからない場合はお気軽にお問い合わせください!ユーザ満足度の高いキャリアコンサルタントが在籍していますので、希望条件や悩み事などなんでもご相談ください。ご希望にピッタリの案件をご紹介させていただきます。

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

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

編集した記事一覧

正社員/フリーランスの方でこのようなお悩みありませんか?

  • 自分に合う案件を定期的に紹介してもらいたい
  • 週2、リモートワークなど自由な働き方をしてみたい
  • 面倒な案件探し・契約周りは任せて仕事に集中したい

そのような方はぜひ、Workteriaサイトをご利用ください!

  • 定期的にご本人に合う高額案件を紹介

  • リモートワークなど自由な働き方ができる案件多数

  • 専属エージェントが契約や請求をトータルサポート