Spring Boot on Microsoft Azure

Spring BootのWebアプリをPaaSで動かすとき、「手軽」というのを理由にHerokuやCloud Foundry(PWAなど)をメインに利用してきました。しかし、先日Microsoft Azureを調べていたら、App Serviceに簡単にデプロイできるよ～という公式ドキュメントを見つけたので試してみました。

https://docs.microsoft.com/ja-jp/java/azure/spring-framework/deploy-spring-boot-java-app-with-maven-plugin

試してみたらホントに「簡単」でした！
![2018-09-14_23h01_12.png](https://qiita-image-store.s3.amazonaws.com/0/47737/5cdcba7c-2dcd-63d1-2589-9248a7bec91e.png)

上記ドキュメントよりシンプルな手順でデプロイしたのでまとめます。なお、主な手順の違いは以下です。

- Spring Initializrベース
- warではなくjarのままデプロイ
- tomcatの依存性は追加しない
- SpringBootServletInitializerの継承を使わない

コードはこちら。
https://github.com/kikutaro/AzureSpringBoot

# 開発環境

- Windows 10 Pro 1803(64bit)
- JDK 8u152
- Visual Studio Code 1.27.1
    - [Java Extension Pack 0.3.0](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack)
    - [Language Support for Java(TM) by Red Hat 0.30.0](https://marketplace.visualstudio.com/items?itemName=redhat.java)
    - [Spring Initializr Java Support](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-spring-initializr) 0.3.0
    - [Maven for Java 0.10.0](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-maven)

# 手順

# Spring Bootのプロジェクト作成

Visual Studio Codeの拡張機能にある「**[Spring Initializr Java Support](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-spring-initializr)**」を使って作成します。

**「表示」**->**「コマンドパレット」**を選択
![2018-09-13_20h52_50.png](https://qiita-image-store.s3.amazonaws.com/0/47737/d0dfaf5a-ee40-4153-c960-7fa492652963.png)

MSのドキュメントはMavenベースなので、**「Spring Initializr: Generate a Maven Project」**を選択
![2018-09-12_23h14_23.png](https://qiita-image-store.s3.amazonaws.com/0/47737/39956a48-b048-a90f-24af-7a26d62ddb91.png)

Javaを選択
![2018-09-12_23h14_49.png](https://qiita-image-store.s3.amazonaws.com/0/47737/d11dfadf-a02c-ad8f-7305-af36869e7a7a.png)

GroupIdを入力。「tech.kikutaro」としました。
![2018-09-14_22h20_39.png](https://qiita-image-store.s3.amazonaws.com/0/47737/3a1db595-076c-bc94-82c0-d22731e4aa94.png)

ArtifactIdを入力。「azurespringboot」としました。
![2018-09-14_22h21_32.png](https://qiita-image-store.s3.amazonaws.com/0/47737/55dcda13-9a18-b8e9-46e9-f7344d2aa0be.png)


Spring Bootは2.0.5を選択
![2018-09-12_23h18_40.png](https://qiita-image-store.s3.amazonaws.com/0/47737/b0093db5-c76c-b13b-f256-c7abed5b4b67.png)

依存性はWebとDevToolsの2つを選択
![2018-09-12_23h18_59.png](https://qiita-image-store.s3.amazonaws.com/0/47737/064d5546-b7d1-f107-0097-c7407ba79d8e.png)

![2018-09-12_23h19_18.png](https://qiita-image-store.s3.amazonaws.com/0/47737/b0373987-3c0c-f39e-8156-68eb064d90b2.png)

以上で完了です。保存すると以下のダイアログが表示されます。「Open it」で開きます。
![2018-09-12_23h36_28.png](https://qiita-image-store.s3.amazonaws.com/0/47737/4b1cc7bb-4ea2-0852-0242-14cb9467a1f7.png)

# 動作確認

Azureにデプロイする前に簡単なコードを書いて手元で動作確認します。ここではRESTのGETで「Hello, Azure!」と返すだけのコードにしました。

```java:DemoApplication.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

	@GetMapping("/hello")
	public String hello() {
		return "Hello, Azure!";
	}
}
```

起動を確認します。

```
.\mvnw.cmd clean package
```

```
.\mvnw.cmd spring-boot:run
```

ローカル環境へアクセスして動作確認できたらOKです。

![2018-09-13_00h10_16.png](https://qiita-image-store.s3.amazonaws.com/0/47737/381ff8d3-9d93-b749-a179-390bca19fc7b.png)

# Azureへデプロイする準備

[MSさんのドキュメント](https://docs.microsoft.com/ja-jp/java/azure/spring-framework/deploy-spring-boot-java-app-with-maven-plugin)では、packagingをwarに変えたり、tomcatの依存を追加したり、SpringBootServletInitializerを継承したりと、jettyなど他のServletでも動くようにするための工夫をしていますが、今回は特にこの辺を変更せずに進めました。

本当は以下の設定も不要ですが、デプロイしたアプリのURLが衝突しないようにするために今回は追加しました。

```xml:pom.xml
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <!-- add from -->
    <maven.build.timestamp.format>yyyyMMddHHmm</maven.build.timestamp.format>
    <!-- add to -->
</properties>
```

azure-webapp-maven-pluginの設定を追加します。ドキュメントには「<!-- Check latest version on Maven Central -->」とあります。

なお、最初ドキュメントのまま1.1.0を使って、deploymentTypeをjarにしてみたらエラーになりました。deploymentTypeがjarに対応していない模様です。

![2018-09-14_23h16_29.png](https://qiita-image-store.s3.amazonaws.com/0/47737/a1084df4-498c-745a-d526-5512abba5670.png)

最新の1.4.0にしたら問題なくjarが指定できました。

```xml:pom.xml
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
	</plugin>
	<!-- add from -->
	<plugin>
	    <groupId>com.microsoft.azure</groupId>
	    <artifactId>azure-webapp-maven-plugin</artifactId>
	    <version>1.4.0</version>
	    <configuration>
	        <resourceGroup>maven-projects</resourceGroup>
	        <appName>${project.artifactId}-${maven.build.timestamp}</appName>
        	<region>westus</region>
	        <javaVersion>1.8</javaVersion>
	        <deploymentType>jar</deploymentType>
	        </configuration>
        </plugin>
        <!-- add to -->
    </plugins>
</build>
```

# Azureへデプロイ

デプロイの前に[Azure CLI](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli?view=azure-cli-latest)をインストールしました。

Azure CLIでログインすると、ブラウザが自動起動するのでログイン画面が表示されます。ユーザ名とパスワードを入れてログインします。

```sh:
az login
```

あとはデプロイするだけです。

```
.\mvnw.cmd clean package
```

```
.\mvnw.cmd azure-webapp:deploy
```

デプロイ完了を待ちます。
![2018-09-14_23h44_07.png](https://qiita-image-store.s3.amazonaws.com/0/47737/26f7bb91-238d-89f5-2247-721c606902bc.png)

成功したらAzureのApp Serviceを開いて、デプロイされたアプリケーションを確認します。

![2018-09-14_23h12_54.png](https://qiita-image-store.s3.amazonaws.com/0/47737/14605789-7e0c-b123-2bdd-8225fd8d2c83.png)


アプリケーションを選択したら右上に表示されているURLのリンクをクリックすると作成したページが開けます。

![2018-09-14_23h14_45.png](https://qiita-image-store.s3.amazonaws.com/0/47737/56680f15-fdf1-53de-ee04-ca9414638a9c.png)


動いた！

![2018-09-14_23h01_12.png](https://qiita-image-store.s3.amazonaws.com/0/47737/bd088b7e-eb8b-1772-acc6-3dd239005060.png)

細かく手順を書いたので長くみえますが、Herokuなどにデプロイするのと同じくらい手軽でした。