Java
Azure
spring-boot

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

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

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

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

開発環境

手順

Spring Bootのプロジェクト作成

Visual Studio Codeの拡張機能にある「Spring Initializr Java Support」を使って作成します。

「表示」->「コマンドパレット」を選択
2018-09-13_20h52_50.png

MSのドキュメントはMavenベースなので、「Spring Initializr: Generate a Maven Project」を選択
2018-09-12_23h14_23.png

Javaを選択
2018-09-12_23h14_49.png

GroupIdを入力。「tech.kikutaro」としました。
2018-09-14_22h20_39.png

ArtifactIdを入力。「azurespringboot」としました。
2018-09-14_22h21_32.png

Spring Bootは2.0.5を選択
2018-09-12_23h18_40.png

依存性はWebとDevToolsの2つを選択
2018-09-12_23h18_59.png

2018-09-12_23h19_18.png

以上で完了です。保存すると以下のダイアログが表示されます。「Open it」で開きます。
2018-09-12_23h36_28.png

動作確認

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

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

Azureへデプロイする準備

MSさんのドキュメントでは、packagingをwarに変えたり、tomcatの依存を追加したり、SpringBootServletInitializerを継承したりと、jettyなど他のServletでも動くようにするための工夫をしていますが、今回は特にこの辺を変更せずに進めました。

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

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

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

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をインストールしました。

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

az login

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

.\mvnw.cmd clean package
.\mvnw.cmd azure-webapp:deploy

デプロイ完了を待ちます。
2018-09-14_23h44_07.png

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

2018-09-14_23h12_54.png

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

2018-09-14_23h14_45.png

動いた!

2018-09-14_23h01_12.png

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