【Azure Functions】ServiceBusTriggerをJavaで作成しデプロイする
Workteria(ワークテリア)では難易度の高いものから低いものまで、スキルや経験に合わせた案件を多数揃えています。会員登録は無料ですので、ぜひ会員登録してご希望の案件を探してみてください!
フリーランス/正社員のエンジニアとして活躍するには、ご自身のスキルや経験に合わせた仕事を選ぶことが大切です。ご希望の案件がみつからない場合はお気軽にお問い合わせください!ユーザ満足度の高いキャリアコンサルタントが在籍していますので、希望条件や悩み事などなんでもご相談ください。ご希望にピッタリの案件をご紹介させていただきます。
Azure Functions を使用し ServiceBusTrigger を Java で作成・デプロイ する。
このページでは以下の内容を記載しています。
・Azure Functionsの作成
・ServiceBusTriggerでのServiceBusとFunctionsのバインド
・JavaでのServiceBusTrigger作成方法
・ServiceBusTriggerのデプロイ
・エラーやExceptionの対応
概要図
様々なサービスをつくる上でサンプルとして参考にして頂けると幸いです。
前提条件
・アクティブなサブスクリプションが含まれる 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にキューを作成
※共有アクセスポリシーから 接続文字列を保管しておいてください。後段で使用します。
AzureFunctionsサービスをポータルから作成する
ブラウザからAzureにログインし、新規でFunctionを作成します。(CLIでも作成可能、今回はPortalを使用)
関数アプリの作成
※こちらの関数アプリ名はJavaのソース内でも使用します。
ストレージアカウントは作成済みを設定しています。任意に作成・設定してください。
構成の変更(アプリケーション設定の追加)
ここで設定するキー名(今回はSERVICE_BUS_CONNECTIONSTRING)はJavaのソース内でも使用します。
設定する値はServiceBusの 接続文字列を使用します。
EclipseでJavaアプリ作成
Functions プロジェクトを作成する
Eclipse で、 [File](ファイル) メニューを選択 > [New](新規作成) > [Maven Project](Maven プロジェクト) を選択する
[New Maven Project](新しい Maven プロジェクト) ダイアログを既定値のままにして [Next](次へ) を選択する
-------画像----------
azure-functions-archetype を選択し、 [次へ]
すべてのフィールドに値を入力
appName | sample-function01 ※Function作成時に設定した名称(関数アプリ名) |
appRegion | japaneast ※Function作成時に設定したリージョンを設定する |
resourceGroup |
※Function作成時に設定したリソースグループを設定する
|
javaVersion | 8 |
trigger | ServiceBusTrigger |
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.");
}
}
今回のプロジェクト構成は以下です
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
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
Functionへのデプロイ確認
ポータルからFunctions > 関数 > を選択します
関数を選択 > 統合 > トリガー から内容を確認する
ServiceBusとFunctionのバインドテスト
ServiceBusのQueueにメッセージ登録
ServiceBusExplorerでメッセージ作成送信(※送信押下前にFunctionのログストリーム画面を表示させておく)
Functionのログ確認
監視 > ログストリーム 接続できることを確認する
ログに [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 Service Bus キューとの間でメッセージを送受信する (Java)
正社員/フリーランスの方でこのようなお悩みありませんか?
- 自分に合う案件を定期的に紹介してもらいたい
- 週2、リモートワークなど自由な働き方をしてみたい
- 面倒な案件探し・契約周りは任せて仕事に集中したい
そのような方はぜひ、Workteriaサイトをご利用ください!
定期的にご本人に合う高額案件を紹介
リモートワークなど自由な働き方ができる案件多数
専属エージェントが契約や請求をトータルサポート