前回は、Azure Potal上でApp Serviceを作成してみたが、今回は、前回作成したApp ServiceにSpring Bootを利用したJavaアプリケーションを配置してみたので、その手順を共有する。
前提条件
下記記事に従ってAzure上でApp Serviceを作成済であること。
また、下記記事に従って、STSをダウンロード済であること。
さらに、下記サイトの内容に従って、Apache Mavenをダウンロード済であること。
https://qiita.com/Junichi_M_/items/20daee936cd0c03c3115
また、下記サイトの内容に従って、Azure CLIをインストール済であること。
https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-windows?tabs=azure-cli
やってみたこと
- Spring Bootを利用したJavaアプリケーションの作成
- App Serviceへのデプロイするための定義ファイルの構成
- App ServiceへのSpring Bootを利用したJavaアプリケーションのデプロイ
Spring Bootを利用したJavaアプリケーションの作成
App Serviceへのデプロイする場合も、まずは通常のSpring Boot StarterによるJavaアプリケーションを作成する。その手順は以下の通り。
1) STSを起動し、ファイルメニューの「新規」から「Spring スターター・プロジェクト」を選択する。

2) 型で「Maven」、パッケージングで「War」、Javaバージョンで「8」、言語で「Java」を選択し、それ以外の項目を下記のように入力し、「次へ」ボタンを押下する。

3) 「Spring Web」「Thymeleaf」をライブラリに追加し、「次へ」ボタンを押下する。

4) そのまま、「完了」ボタンを押下する。

5) しばらく待つとSpring Bootアプリケーションの作成が完了し、以下のようなプログラム構成になる。

作成後の「pom.xml」の内容は以下の通り。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
<relativePath/>
<!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demoAzureApp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>demoAzureApp</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>また、作成後の「DemoAzureAppApplication.java」の内容は以下の通り。
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoAzureAppApplication {
public static void main(String[] args) {
SpringApplication.run(DemoAzureAppApplication.class, args);
}
}さらに、作成後の「ServletInitializer.java」の内容は以下の通り。
package com.example.demo;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(DemoAzureAppApplication.class);
}
}その後、画面表示ができるよう、プログラムの追加・変更行う。追加・変更後のプログラム構成は以下の通りで、赤枠のソースが追加・変更したプログラムとなる。

6) ローカル環境ではポート番号を変更して起動するため、application.propertiesに「server.port = (ポート番号)」を追加する。

7) 以下のコントローラクラスを追加し、メッセージ「Hello App Service!!」を設定し、初期表示画面を表示できるようにする。
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class DemoController {
@GetMapping("/")
public String index(Model model){
model.addAttribute("message", "Hello App Service!!");
return "index";
}
}8) さらに以下の初期表示画面を追加する。
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>初期表示画面</title>
</head>
<body>
メッセージ:<span th:text="${message}">message</span>
</body>
</html>9) 「DemoAzureAppApplication.java」クラスにメインクラスが含まれているので、これを選択し右クリックし「実行」メニューから「Spring Bootアプリケーション」を選択する。

起動すると、下記コンソールログが出力されることが確認できる。

10) 「http:// (ホスト名):(ポート番号)」とアクセスすると、以下の初期表示画面が表示されることが確認できる。

11) 画面表示の確認が終わったら、コンソールの「停止」ボタンを押下して、サーバーを停止させる。

App Serviceへのデプロイするための定義ファイルの構成
App Serviceへのデプロイするためには、Mavenの定義ファイル「pom.xml」にApp Serviceデプロイ用定義を追加する必要がある。その手順は以下の通り。
1) コマンドプロンプトを起動し、pom.xmlの存在するディレクトリに移動する。

2) 「az login」コマンドを実行し、Azure Portalにログインするアカウントでログインする。

下記ログイン画面が表示されるため、ログインアカウントを選択する。

ログインに成功すると以下の画面に遷移する。

また、コンソールには以下のログイン情報が表示される。

3) App Serviceへのデプロイ定義を追加するため、「mvn com.microsoft.azure:azure-webapp-maven-plugin:1.12.0:config」というコマンドを実行する。その際、前回の記事で作成したApp Serviceを指定するようにする。

4) 先ほどのコマンド実行後の「pom.xml」の内容は以下の通りで、「azure-webapp-maven-plugin」の定義が追加されている。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
<relativePath/>
<!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demoAzureApp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>demoAzureApp</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-webapp-maven-plugin</artifactId>
<version>1.12.0</version>
<configuration>
<schemaVersion>v2</schemaVersion>
<subscriptionId>(ログインユーザーのサブスクリプションID)</subscriptionId>
<resourceGroup>azureAppDemo</resourceGroup>
<appName>azureAppDemoService</appName>
<pricingTier>B1</pricingTier>
<region>japaneast</region>
<appServicePlanName>ASP-azureAppDemo-8679</appServicePlanName>
<appServicePlanResourceGroup>azureAppDemo</appServicePlanResourceGroup>
<runtime>
<os>Linux</os>
<javaVersion>Java 8</javaVersion>
<webContainer>Tomcat 8.5</webContainer>
</runtime>
<deployment>
<resources>
<resource>
<directory>${project.basedir}/target</directory>
<includes>
<include>*.war</include>
</includes>
</resource>
</resources>
</deployment>
</configuration>
</plugin>
</plugins>
</build>
</project>App ServiceへのSpring Bootを利用したJavaアプリケーションのデプロイ
App Serviceへのデプロイは、Mavenコマンドで実行できる。その手順は以下の通り。
1) Azure Portalにログインし、デプロイ予定のApp Serviceを起動する。

2) コマンドプロンプトを起動し、pom.xmlの存在するディレクトリに移動する。

3) 「mvn clean」コマンドを実行し、デプロイされたwarファイルが含まれるtarget ディレクトリ内をクリアする。

4) 「mvn package」コマンドを実行し、デプロイ用のwarファイルを作成する。


「mvn package」コマンドの実行が完了すると、以下のように「demoAzureApp-0.0.1-SNAPSHOT.war」が作成されていることが確認できる。

5) 「mvn azure-webapp:deploy」コマンドを実行し、warファイルをApp Serviceにデプロイする。

6) デプロイが完了したら、画面から確認する。デプロイ対象のApp Service概要の、URLの右「クリップボードにコピー」を押下し、URLをコピーした後で、コピーしたURLにアクセスすると、以下のように、デプロイしたアプリケーションの初期表示画面が表示される。


要点まとめ
- Azure App Service上でSpring Bootを利用したJavaアプリケーションを配置するには、通常のSpring Boot StarterによるJavaアプリケーションを作成し、Azure App Serviceへデプロイするための定義ファイルを作成後、デプロイを行う。
- Azure App Serviceにデプロイするための定義を作成するには、「az login」コマンドでログイン後、「mvn com.microsoft.azure:azure-webapp-maven-plugin:1.12.0:config」というコマンドを実行する。
- Azure App Serviceにデプロイするためのwarファイルを作成するには、「mvn clean」コマンドを実行後、「mvn package」コマンドを実行する。
- Azure App Serviceに作成したwarファイルをデプロイするには、「mvn azure-webapp:deploy」コマンドを実行する。





