Spring Boot(Kotlin) + GradleでAPIを書いてAzure App Serviceにデプロイする。(2020/10版)

## はじめに
[Spring Boot(Kotlin) + GradleでAPIを書いてAzure Web Appにデプロイする。](https://qiita.com/hatakoya/items/bb81f969ee3b0edd6b68) を参考にしたSpring Boot(Kotlin)のアプリをAzure App Serviceする流れです。
Microsoft Azure PortalやSpring BootでUpdateで変更があるようなので、2020/10版として再構成します。


## 環境構築
- IntellJ IDEA CE
- Microsoft Azureアカウント([Microsoft Azureの無料アカウント](https://azure.microsoft.com/ja-jp/free/search/?&ef_id=Cj0KCQjwufn8BRCwARIsAKzP6951V4PC7VIrxsdJZYygE9lavN2eYmsoo9w_KYcKIdO11Vos1WezFmAaAthgEALw_wcB:G:s&OCID=AID2100066_SEM_Cj0KCQjwufn8BRCwARIsAKzP6951V4PC7VIrxsdJZYygE9lavN2eYmsoo9w_KYcKIdO11Vos1WezFmAaAthgEALw_wcB:G:s))
- Microsoft Azure Portalが利用できるブラウザ(GoogleChrome等)


### 1. プロジェクトをつくる
[Spring Initializer](https://start.spring.io/)  で`Gradle`、`Kotlin`と、プラグインに`Web`を設定してダウンロードする。  

- Spring Initializer設定例
![Spring Initializer設定例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328602/289f42fe-45e5-cdbb-d284-2af229feaea0.png)

### 2. プロジェクトを読み込む
IntelliJ IDEA CEで`File`→`Open`で作成したプロジェクト開く。


## APIサンプル実装

一通り実装すると`src/main/kotlin`配下は以下のようになる  

```
- com
  - example
    - BootApp.kt
    - MyController.kt
    - Main.kt
```

### メインクラス（Main.kt）
以下を実装する。

```kotlin:Main.kt
package com.example.demo

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class Main

fun main(args: Array<String>) {
	runApplication<BootApp>(*args)
}

```

### BootApp.kt
以下を実装する。

```kotlin:BootApp.kt
package com.example.demo

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer

@SpringBootApplication
class BootApp : SpringBootServletInitializer()
```

### コントローラクラス（MyContoroller.kt）
この例だと`localhost:8080`に行くと"Hello"が返ってくる。

```kotlin:MyController.kt
package com.example.demo

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

@RestController
class MyController {

  // URLに対応する処理を書いていく
  @RequestMapping("/")
  fun hello(): String {
    return "Hello"
  }

  // http://localhost:8080?name=hoge
  // みたいにGETパラメータをもらいたいときはこう
  @RequestMapping("/paramTest")
  fun paramTest(@RequestParam(value = "name") name: String): String {
    return name
  }
}
```

### テストクラス削除
test/kotlin配下のktファイルを削除する。
※あっても後続作業には問題ないのですが、 `gradle build タスク` 実行対策です


## ローカルサーバで動作確認
`gradle bootRun`タスクを実行する。  

```bash
./gradlew bootRun
```

実行後、ブラウザで`http://localhost:8080`へアクセスする。
以下のような結果が表示されればOK。
![ローカルサーバでの動作確認](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328602/d396b5ab-24a7-e904-2c22-c4081884cd17.png)


## Azureへデプロイ
`war`を作成し、Azure App Serviceへのデプロイ手順。  

### 1. warプラグインを入れ、warを有効にする
```kotlin:build.gradle.kts
plugins {
  // 他pluginは省略
  id("war")
}
tasks.withType<War> {
  enabled = true  // 未設定時は実行可能Warファイルが作成される
}
```

### 2. warを生成する
`gradle war`タスクを実行する。  

```bash
./gradlew war
```

`build/libs`の中に`war`が生成される。
![war生成結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328602/bbc90cb7-9cdc-6801-08cd-0eb9f223e96a.png)


### 3. Azure App Serviceのアプリケーション設定でJava, Tomcatを設定する
- 名前： 適切なものを設定
- 公開： コード
- ランタイムスタック： 任意のJava JDK
- JavaWebサーバのスタック： 任意のTomcat
- オペレーティングシステム： Windows ※後続作業のためWindows必須選択
- 地域： 任意の地域
- AppServiceプラン： お試しなのでお安いものや無料のもの

![Azure App Service](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328602/146d3cfd-d5ea-df3d-0347-d7f3cf72bbb7.png)


### 4. warをAzure App Serviceの`wwwRoot/webapps`にデプロイする

App Service Editorを選択する。  
※ここでApp Service Editorが見つからない場合、 `Azure App Serviceのアプリケーション設定` のオペレーティングシステム Windowsを選択しているか再度確認する。

![App Service Editor](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328602/2e1e36e7-663e-4097-08c9-3304f34634af.png)


App Service Editorを開いたら、エクスプローラから`war`をドラッグ&ドロップしデプロイする。  
※ここでデプロイ階層が異なる場合、 `Azure App Serviceのアプリケーション設定` のJavaWebサーバのスタック Tomcatを選択しているか再度確認する。

・デプロイ前
![デプロイ前](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328602/ef97917c-b9f9-2956-5370-736f1392445b.png)

・デプロイ後
![デプロイ後](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328602/f8dc949a-70fb-9fb6-c309-5260731ab7dc.png)


### 5. 動作確認
ブラウザでAzure App Serviceのweb appのURLを表示する。
時間かかる場合もあるのでページ読み込み終わるまで気長に待つ。

URLは以下のようになる。
`https://[Azure App Serviceのアプリケーションの名前].azurewebsites.net/[warファイルの名前]/`
![動作確認](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328602/dd95a247-7c78-e779-04b4-fef7b0cd4322.png)


### 6. Azure App Serviceの削除
確認が終わったらAzure App Serviceを削除する。


## 備忘
本記事のコードは以下GitHubのリポジトリを参照ください。
https://github.com/awakuwaku/spring-azure-deploy-sample

## 参考
- [Spring Boot (Kotlin) はじめの一歩](https://qiita.com/Yuki10/items/aef152f300a500b85725)
- [Spring Boot(Kotlin) + GradleでAPIを書いてAzure Web Appにデプロイする。](https://qiita.com/hatakoya/items/bb81f969ee3b0edd6b68)