Azure

Azure Spring Apps でJavaアプリケーションをデプロイしてみる

はじめに

Azure Spring Appsを立ち上げてJavaアプリケーションをデプロイして思います。

Azure Spring AppsはAzure Spring Cloudを呼ばれているものです。名前が変わったようです。Azure Spring AppsはJavaのアプリケーション動作させるイメージがありました。クイックスタートを参考に薦めていきたいと思います。

クイックスタートた微妙に古いのでバージョンの設定に気をつけましょう。

Spring Cloudの説明は割愛します。

前提条件

JDK 8 または JDK 11 をインストールするとあります。

JDK 8はEclipse Temurinバージョン

JDK 11はMicrosoft Build of OpenJDKバージョン

を利用します。

一応、Azureの開発ではMicrosoft Build of OpenJDKがお勧めされています。

そこで下記よりJDK 11(microsoft-jdk-11.0.15-windows-x64.msi)をダウンロードしてインストールします。

Set JAVA_HOME variableをインストールしてJAVA_HOMEを設定します。

Azure Spring Appsを起動

Azure Spring Appsを起動します。必要項目を入力します。

ログを取得する場合んは有効にします。必要ない場合はチェックを外します。

Application Insightsも利用しない場合はチェックを外します。

ネットワークの設定も行えます。

あとは立ち上げるだけです。

起動後は下記のように確認できます。

Spring プロジェクト

どうやらSpring プロジェクトというのを作成していきます。

下記のように設定していきます。Spring Bootのバージョンは2.7.1を指定します。Javaのバージョンは11を指定します。

設定後にGENERATEを作成します。hellospring.zipがダウンロードされます。

 

デプロイ

今回はVSCodeを利用してデプロイしていきます。

Maven

最初に、Maven をインストールします。

ダウンロードします。

解凍したファイルをC:\に配置します。

PATHを通します。

一時反映

SET PATH=%PATH%;C:\apache-maven-3.8.6\bin

永続化(管理者権限)

SETX /M PATH "%PATH%;C:\apache-maven-3.8.6\bin"
mvn --version
Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Maven home: C:\apache-maven-3.8.6
Java version: 11.0.15, vendor: Microsoft, runtime: C:\Program Files\Microsoft\jdk-11.0.15.10-hotspot
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 11", version: "10.0", arch: "amd64", family: "windows"

 

VSCode

ダウンロードしたSpring プロジェクトを解凍します。

解凍後にPowershellなどで移動して code . でVSCodeで起動します。

右下に出てくる Extension Pack for Java をインストールします。

インストールの完了を確認できます。

インストール後にビルドが走ります。数分かかります。

src/main/java/com/example/hellospring/HelloController.java を追加します。

package com.example.hellospring;

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
public class HelloController {

    @RequestMapping("/")
    public String index() {
        return "Greetings from Azure Spring Apps!";
    }

}

F5で実行してみます。さてエラーが発生します。

PS C:\hellospring>  & 'C:\Program Files\Microsoft\jdk-11.0.15.10-hotspot\bin\java.exe' '-agentlib:jdwp=transport=dt_socket,server=n,suspend=y,address=localhost:55725' '@C:\Users\user1\AppData\Local\Temp\cp_bw6ha9hg5d79dds74xqxztcvk.argfile' 'com.example.hellospring.HellospringApplication' 
23:06:29.394 [main] DEBUG org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter - Application failed to start due to an exception
org.springframework.cloud.commons.ConfigDataMissingEnvironmentPostProcessor$ImportException: No spring.config.import set
        at org.springframework.cloud.commons.ConfigDataMissingEnvironmentPostProcessor.postProcessEnvironment(ConfigDataMissingEnvironmentPostProcessor.java:82)  
        at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEnvironmentPreparedEvent(EnvironmentPostProcessorApplicationListener.java:102)
        at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEvent(EnvironmentPostProcessorApplicationListener.java:87)       
        at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:131)
        at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:85)
        at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:66)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
        at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120)
        at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114)
        at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:65)
        at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:344)        
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:302)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295)
        at com.example.hellospring.HellospringApplication.main(HellospringApplication.java:10)
23:06:29.404 [main] ERROR org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter -

Description:

No spring.config.import property has been defined

Action:

Add a spring.config.import=configserver: property to your configuration.
        If configuration is not required add spring.config.import=optional:configserver: instead.
        To disable this check, set spring.cloud.config.enabled=false or
        spring.cloud.config.import-check.enabled=false.

解決方法はpom.xmlの編集を行います。解決法としてはレガシーな解決方法にようです。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

再度、F5を実行します。

/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.7.1)

2022-07-18 23:17:25.507  INFO 1712 --- [           main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : http://localhost:8888
2022-07-18 23:17:25.687  INFO 1712 --- [           main] c.c.c.ConfigServicePropertySourceLocator : Connect Timeout Exception on Url - http://localhost:8888. Will be trying the next url if available
2022-07-18 23:17:25.687  WARN 1712 --- [           main] c.c.c.ConfigServicePropertySourceLocator : Could not locate PropertySource: I/O error on GET request for "http://localhost:8888/application/default": Connection refused: connect; nested exception is java.net.ConnectException: Connection refused: connect
2022-07-18 23:17:25.692  INFO 1712 --- [           main] c.e.hellospring.HellospringApplication   : No active profile set, falling back to 1 default profile: "default"
2022-07-18 23:17:26.845  INFO 1712 --- [           main] o.s.cloud.context.scope.GenericScope     : BeanFactory id=9391f086-ec09-32d1-9c35-173b41e8a25e
2022-07-18 23:17:27.241  INFO 1712 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)

 

http://localhost:8080/ にアクセスします。

Azure Spring Appsにデプロイ

Azure Spring Appsにデプロイするためには拡張機能をインストールする必要があります。

これをインストールしないとVSCodeからデプロイできません。

インストール後は図のように表示されます。

右クリックしてアプリを作成します。

アプリ名を入力します。

Java 11を設定します。

ターミナルでビルドします。

mvn clean package

あとは出来上がったjarファイルをデプロイしてあげます。

以上でデプロイは完了です。

アクセス

デプロイ後にエンドポイントにアクセスするか聞かれます。

無い場合は作成するか聞かれます。

作成されると自動的にブラウザからアクセスされます。

問題なくアプリケーションがデプロイされ動作していることが確認できました。

まとめ

Azure Spring Appsのデプロイを試して見ました。VSCodeでデプロイするまでには少々時間がかかりました。

正直なところJavaアプリケーションをデプロイするのに便利なのかわかりません。ただ、Spring Cloudを使っている人には良いのかと思います。

なかなか開発者ではないので掴みにくい部分でした。

-Azure
-,