Spring MVC WEBアプリを Azure App Service 環境で起動する (Docker イメージ)

# Spring MVC WEBアプリを Azure App Service 環境で起動する (Docker イメージ)

## 目的

[Spring MVC WEBアプリ](https://qiita.com/hiroxpepe/items/8da878169d6bf36a001f)を [Azure App Service](https://learn.microsoft.com/ja-jp/azure/app-service/overview) 環境で起動して理解を深めます。  

## 実現すること

Microsoft Azure App Service に Spring MVC WEBアプリの Docker イメージをデプロイします。  

## 開発環境

+ Windows 11 Home 22H2 を使用しています。  
+ [WSL](https://learn.microsoft.com/ja-jp/windows/wsl/about) の Ubuntu を操作していきますので macOS の方も参考にして頂けます。  

<details>

WSL (Microsoft Store アプリ版)

```sh
> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
```

Ubuntu

```sh
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:        22.04
```

Java JDK [※ 最小構成 Java JDK の導入と Hello World!](https://qiita.com/hiroxpepe/items/8650664e466906a57996)

```sh
$ java -version
openjdk version "11.0.17" 2022-10-18
OpenJDK Runtime Environment (build 11.0.17+8-post-Ubuntu-1ubuntu222.04)
OpenJDK 64-Bit Server VM (build 11.0.17+8-post-Ubuntu-1ubuntu222.04, mixed mode, sharing)
```

Maven [※ 最小構成 Maven の導入と Hello World!](https://qiita.com/hiroxpepe/items/40f7f199b9be7f9e3b5b)

```sh
$ mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.17, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
```

Docker Desktop

```sh
Version 4.16.3 (96739)
```

```sh
$ docker --version
Docker version 20.10.22, build 3a2c30b
```

```sh
$ docker-compose --version
Docker Compose version v2.15.1
```

</details>

※ この記事では基本的に Ubuntu のターミナルで操作を行います。

## "Hello World" を表示する手順

### Spring MVC WEBアプリの作成

[最小構成 Spring MVC WEBアプリの Hello World!](https://qiita.com/hiroxpepe/items/8da878169d6bf36a001f) を参照してください。  

プロジェクトフォルダに移動  
※ ~/tmp/hello-spring-mvc をプロジェクトフォルダとします。

```sh
$ cd ~/tmp/hello-spring-mvc
```

Java アプリをビルド  
※ target/hello-spring-mvc.war が作成されます。  

```sh
$ mvn clean install
```

### Docker イメージを作成

Dockerfile を作成

```sh
$ vim Dockerfile
```

ファイルの内容

```sh
FROM jetty:10.0.13-jre11-alpine

COPY target/*.war /var/lib/jetty/webapps/app.war

EXPOSE 8080
```

Docker イメージをビルド  
※ ローカルの Docker 環境 (Docker Desktop) に app-hello-spring-mvc Docker イメージが作成されます。  

```sh
$ docker build -t app-hello-spring-mvc .
```

Docker イメージの確認

```sh
$ docker images | grep app-hello-spring-mvc
app-hello-spring-mvc   latest   fb56b58a2aed   37 minutes ago   195MB
```

### Azure のアカウントを取得

公式 [Azure の無料アカウントを使ってクラウドで構築](https://azure.microsoft.com/ja-jp/free/)

### Azure CLI でサインイン

[Azure CLI をインストールする手順](https://qiita.com/hiroxpepe/items/20aeb54a676f190d5c96) を参照してください。

```sh
$ az login
```

※ 最新バージョンに更新する場合

```sh
$ az upgrade
```

### Azure 環境

#### リソースグループ

リソースグループを作成

```sh:Microsoft.Resources/resourceGroups
$ az group create \
    --name rg-hello \
    --location japaneast
```

リソースグループ一覧表示

```sh
$ az group list
```

※ リソースグループを削除する場合

```sh
$ az group delete -n <group>
```

#### コンテナ レジストリ

コンテナ レジストリを作成  
※ --sku Free では作成できません。  
※ --name <name> はパブリックで一意の値が求められます。

```sh:Microsoft.ContainerRegistry/registries
$ az acr create \
    --resource-group rg-hello \
    --name cr20230212 \
    --sku Basic
```

コンテナ レジストリ一覧表示

```sh
$ az acr list
```

コンテナ レジストリログイン資格情報を表示

```sh
$ az acr update -n cr20230212 --admin-enabled true
$ az acr credential show \
    --resource-group rg-hello \
    --name cr20230212
```

```json
{
  "passwords": [
    {
      "name": "password",
      "value": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    },
    {
      "name": "password2",
      "value": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    }
  ],
  "username": "cr20230212"
}
```

※ コンテナ レジストリを削除する場合

```sh
$ az acr delete --n <acr-name>
```

コンテナ レジストリにログイン

```sh
$ az acr login --name cr20230212
```

Docker イメージをコンテナ レジストリにプュシュ

```sh
$ docker tag app-hello-spring-mvc cr20230212.azurecr.io/app-hello-spring-mvc:latest
$ docker push cr20230212.azurecr.io/app-hello-spring-mvc:latest
```

コンテナ レジストリのイメージを確認

```sh
$ az acr repository list --name cr20230212 --output table
Result
--------------------
app-hello-spring-mvc
```

ローカルの Docker イメージを Azure コンテナ レジストリにプュシュすることが出来ました。

#### App Service プラン

App Service プランを作成

```sh:Microsoft.Web/serverfarms
$ az appservice plan create \
    --resource-group rg-hello \
    --name asp-hello \
    --sku Free \
    --is-linux
```

App Service プランの一覧表示

```sh
$ az appservice plan list
```

※ App Service プランを削除する場合

```sh
$ az appservice plan delete -n <plan> -g <group>
```

#### App Service WEB アプリ

※ Azure App Service に Spring MVC WEBアプリの Docker イメージをデプロイする方法はいくつかありますが、今回は Azure CLI で ACR 上の Docker イメージをデプロイする方法を紹介します。  

WEB アプリの作成とデプロイ  

```sh:Microsoft.Web/sites
$ az webapp create \
    --resource-group rg-hello \
    --plan asp-hello \
    --name app-hello-spring-mvc \
    --deployment-container-image-name cr20230212.azurecr.io/app-hello-spring-mvc:latest \
    --docker-registry-server-user cr20230212 \
    --docker-registry-server-password XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

Web アプリの設定を構成  
※ App Service WEB アプリはデフォルトで 80 番ポートをリッスンする仕様です。  

```sh
$ az webapp config appsettings set \
    --resource-group rg-hello \
    --name app-hello-spring-mvc \
    --settings WEBSITES_PORT=8080
```

Web アプリのログ記録の構成

```sh
$ az webapp log config \
    --resource-group rg-hello \
    --name app-hello-spring-mvc \
    --docker-container-logging filesystem \
    --application-logging filesystem \
    --web-server-logging filesystem 
```

起動する場合  
※ デフォルトで App Service は起動しているが Web アプリは起動していない。  

```sh
$ az webapp start --name app-hello-spring-mvc --resource-group rg-hello
```

WEBブラウザーでアクセス

```sh
$ az webapp browse --name app-hello-spring-mvc --resource-group rg-hello
```

WEB アプリのログ確認

```sh
$ az webapp log tail --name app-hello-spring-mvc --resource-group rg-hello
```

※ 立ち上がりに少し時間が掛かりますがページが表示されます。

+ しかし表示されたページ "/" にはコンテンツを設定していません。

改めてWEBブラウザで確認  
※ URLは環境で読み替えて下さい。

```sh
https://app-hello-spring-mvc.azurewebsites.net/app/hello
```

WEBブラウザに "Hello World!" と表示することが出来ました。  

## まとめ

+ Ubuntu の 最小構成の Java 開発環境で Spring MVC WEBアプリを Azure App Service 環境で起動させることが出来ました。

## 参考

公式 [Azure App Service コマンド リファレンス](https://learn.microsoft.com/ja-jp/cli/azure/service-page/azure%20app%20service?view=azure-cli-latest)