Azure App Service でブルーグリーンデプロイする
こんにちは、@studio_meowtoon です。今回は、Azure App Service 環境で JAR ファイル形式のアプリをブルーグリーンデプロイする方法を紹介します。
目的
Windows 11 の Linux でクラウド開発します。
こちらから記事の一覧がご覧いただけます。
実現すること
Microsoft Azure App Service にて、JAR ファイル形式のアプリのブルーグリーンデプロイを実践してみます。
技術トピック
ブルーグリーンデプロイとは?
こちらを展開してご覧いただけます。
ブルーグリーンデプロイメント
ブルーグリーンデプロイは、アプリケーションの新しいバージョンを本番環境にデプロイする際に、従来の運用方法とは異なり、新しいバージョンを本番環境に構築し、そこでアプリケーションをテストした後、従来の本番環境と切り替える方法です。
内容 |
---|
通常、ブルーの本番環境とグリーンの新しい本番環境を用意します。最初はブルーがアクティブな本番環境として稼働し、グリーンはアクティブではありません。 |
新しいバージョンのアプリケーションをグリーン環境にデプロイしてテストし、問題がなければトラフィックをグリーン環境に切り替えます。 |
これにより、ダウンタイムを最小限に抑え、システムの信頼性を高めることができます。 |
開発環境
- Windows 11 Home 22H2 を使用しています。
WSL の Ubuntu を操作していきますので macOS の方も参考にして頂けます。
WSL (Microsoft Store アプリ版) ※ こちらの関連記事からインストール方法をご確認いただけます
> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
Ubuntu ※ こちらの関連記事からインストール方法をご確認いただけます
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.1 LTS
Release: 22.04
Java JDK ※ こちらの関連記事からインストール方法をご確認いただけます
$ java -version
openjdk version "11.0.18" 2023-01-17
OpenJDK Runtime Environment (build 11.0.18+10-post-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.18+10-post-Ubuntu-0ubuntu122.04, mixed mode, sharing)
Maven ※ こちらの関連記事からインストール方法をご確認いただけます
$ mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.18, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
この記事では基本的に Ubuntu のターミナルで操作を行います。Vim を使用してコピペする方法を初めて学ぶ人のために、以下の記事で手順を紹介しています。ぜひ挑戦してみてください。
ブルーグリーンデプロイする仕様
※ この記事での仕様となります。
識別するタグ | 内容 | エンドポイント | JSON レスポンス |
---|---|---|---|
v1 | 現用のサービス | /api/data | {"message":"Hello Blue!"} |
v2 | 更新するサービス | /api/data | {"message":"Hello Green!"} |
JAR ファイル形式のアプリ
No | ファイル | 内容 |
---|---|---|
1 | app.jar | 現用のアプリケーション |
2 | app.jar | 更新するアプリケーション |
ブルーグリーンデプロイする手順
v1 アプリの JAR ファイル作成
こちらを展開して手順をご覧いただけます。
Java アプリ作成
こちらの関連記事で手順がご確認いただけます。
https://qiita.com/studio_meowtoon/items/37ac0082a3228e4de570
プロジェクトフォルダに移動します。
※ ~/tmp/hello-spring-boot をプロジェクトフォルダとします。
$ cd ~/tmp/hello-spring-boot
v1 アプリのソースコードを作成します。
$ vim src/main/java/com/example/springboot/controller/HelloController.java
ファイルの内容
package com.example.springboot.controller;
import java.util.Map;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class HelloController {
@GetMapping("/data")
public Map<String, String> getData() {
Map<String, String> map = Map.of("message", "Hello Blue!");
return map;
}
}
v1 アプリをビルドします。
$ mvn clean package
ここまでの作業で v1 アプリとして、JAR ファイルが作成できました。
v1 アプリを Azure Spring Apps にデプロイ
ログイン
Azure CLI で Azure にログインします。
$ az login
こちらの関連記事で手順がご確認いただけます。
リソースグループ
リソースグループを作成します。
$ az group create \
--name rg-hello \
--location japaneast
App Service プラン
こちらの関連記事で手順がご確認いただけます。
App Service プランを作成します。
--sku Standard からブルーグリーンデプロイ(スロット)に対応しています。
$ az appservice plan create \
--resource-group rg-hello \
--name asp-hello \
--sku S1 \
--is-linux
App Service Web アプリ
Web アプリの作成を行います。
$ az webapp create \
--resource-group rg-hello \
--plan asp-hello \
--name app-hello-spring-boot \
--runtime "JAVA:11-java11"
Web アプリのスタートアップコマンドを設定します。
$ az webapp config set \
--resource-group rg-hello \
--name app-hello-spring-boot \
--startup-file "java -jar /home/site/wwwroot/app.jar --server.port=80"
v1 Web アプリのデプロイを行います。
※ デフォルトで運用スロットにデプロイされます。
$ az webapp deploy \
--resource-group rg-hello \
--name app-hello-spring-boot \
--src-path target/app.jar \
--type jar
別ターミナルから curl コマンドで URL を確認します。
$ curl http://app-hello-spring-boot.awesomewebsites.net/api/data
{"message":"Hello Blue!"}
Azure Portal の確認
[アプリ] → [デプロイ スロット] を確認します。
v1 アプリが、運用スロットに設定されていることが確認できます。
ここまでの作業で v1 アプリの Azure App Service へのデプロイが完了しました。
v2 アプリの JAR ファイル作成
こちらを展開して手順をご覧いただけます。
Java アプリ作成
v2 アプリのソースコードを作成します。
$ vim src/main/java/com/example/springboot/controller/HelloController.java
ファイルの内容
package com.example.springboot.controller;
import java.util.Map;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class HelloController {
@GetMapping("/data")
public Map<String, String> getData() {
Map<String, String> map = Map.of("message", "Hello Green!");
return map;
}
}
v2 アプリをビルドします。
$ mvn clean package
ここまでの作業で v2 アプリとして、JAR ファイルが作成できました。
v2 アプリを Azure App Service にデプロイ
App Service Web アプリ
staging スロットを作成します。
$ az webapp deployment slot create \
--resource-group rg-hello \
--name app-hello-spring-boot \
--slot staging
説明を開きます。
このコマンドは、App Service Web アプリのデプロイ スロットを作成しています。
コマンド | 内容 |
---|---|
az webapp deployment slot create | App Service Web アプリのデプロイ スロットを作成するためのコマンドです。 |
オプション | 値 | 内容 |
---|---|---|
--resource-group | rg-hello | App Service Web アプリを作成するリソースグループの名前を指定します。 |
--name | app-hello-spring-boot | App Service Web アプリの名前を指定します。 |
--slot | staging | App Service Web アプリに設定するスロットの名前を指定します。 |
v2 Web アプリを staging スロットにデプロイします。
$ az webapp deploy \
--resource-group rg-hello \
--name app-hello-spring-boot \
--src-path target/app.jar \
--type jar \
--slot staging
説明を開きます。
このコマンドは、App Service Web アプリに新しいコードをデプロイします。
コマンド | 内容 |
---|---|
az webapp deploy | App Service Web アプリに新しいコードをデプロイするためのコマンドです。 |
オプション | 値 | 内容 |
---|---|---|
--resource-group | rg-hello | App Service Web アプリを含むリソースグループの名前を指定します。 |
--name | app-hello-spring-boot | App Service Web アプリの名前を指定します。 |
--src-path | target/app.jar | App Service Web アプリにデプロイするコードの場所を指定します。 |
--type | jar | App Service Web アプリにデプロイするコードが JAR ファイルであることを指定します。 |
--slot | staging | App Service Web アプリをデプロイするスロットの名前を指定します。 |
別ターミナルから curl コマンドで URL を確認します。
$ curl http://app-hello-spring-boot.awesomewebsites.net/api/data
{"message":"Hello Blue!"}
アプリのURLをリクエストすると、更新前の v1 アプリの出力が表示されます。
Azure Portal の確認
デプロイ スロットは、App Service (スロット) というリソースとして作成されます。
[アプリ] → [デプロイ スロット] を確認します。
ここでは、v2 アプリは app-hello-spring-boot-staging スロットに設定されています。
ターミナルから curl コマンドで staging URL を確認します。
$ curl http://app-hello-spring-boot-staging.awesomewebsites.net/api/data
{"message":"Hello Green!"}
アプリを更新するために、v2 アプリを本番環境の staging スロットにデプロイすることができました。また、実際にリリースする前に staging URL を利用して動作確認を行うことができます。これは、ブルーグリーンデプロイの目的の1つです。
新しいアプリへの切り替え
staging スロットの中身と運用 スロットの中身を入れ替えます。
$ az webapp deployment slot swap \
--resource-group rg-hello \
--name app-hello-spring-boot \
--slot staging
説明を開きます。
このコマンドは、App Service Web アプリのデプロイ スロットをスワップしています。
コマンド | 内容 |
---|---|
az webapp deployment slot swap | App Service Web アプリのデプロイ スロットをスワップするためのコマンドです。 |
オプション | 値 | 内容 |
---|---|---|
--resource-group | rg-hello | App Service Web アプリを作成するリソースグループの名前を指定します。 |
--name | app-hello-spring-boot | App Service Web アプリの名前を指定します。 |
--slot | staging | 運用スロットとスワップするデプロイ スロットの名前を指定します。 |
スロットの中身の入れ替えができました。
別ターミナルから curl コマンドで URL を確認します。
$ curl http://app-hello-spring-boot.awesomewebsites.net/api/data
{"message":"Hello Green!"}
アプリのURLをリクエストすると、更新後の v2 アプリの出力が表示されます。本番環境へのデプロイ作業が完了しました。※ この記事での本番環境となります。
Azure Portal の確認
[アプリ] → [デプロイ スロット] を確認します。
運用と staging の表示はコマンド実行前と変化ありません。
Azure App Service でデプロイ スロットをスワップする場合、スワップ後にアプリの内容が入れ替わります。ただし、スワップ後にどちらが v1 のアプリであり、どちらが v2 のアプリであったかを示す情報はありません。このため、スワップ後の状況を確認するためには、ログやモニタリングツールなどが必要となる場合があります。
トラブル発生時の切り戻し
サービスを最新バージョンにデプロイした後にトラブルが発生した場合、以前に正常に動作していたデプロイに戻す必要があります。これは、ブルーグリーンデプロイの目的の1つです。
再度デプロイ スロットの中身をスワップして切り戻します。
$ az webapp deployment slot swap \
--resource-group rg-hello \
--name app-hello-spring-boot \
--slot staging
別ターミナルから curl コマンドで URL を確認します。
$ curl http://app-hello-spring-boot.awesomewebsites.net/api/data
{"message":"Hello Blue!"}
アプリの URL をリクエストして、更新前の v1 アプリの出力が表示されました。
Azure Portal の確認
[アプリ] → [デプロイ スロット] を確認します。
運用と staging の表示はコマンド実行前と変化ありませんが、切り戻しされた状況です。
デプロイ後の注意点
App Service の従量課金モデルでは、リソースの利用に応じて課金されます。新しいデプロイが正常に動作し、安定した状態になった後に、不要となったデプロイ スロットを削除することができます。これにより、必要以上に課金されることを防ぐことができます。
必要のないデプロイ スロットを削除します。
$ az webapp deployment slot delete \
--resource-group rg-hello \
--name app-hello-spring-boot \
--slot staging
説明を開きます。
このコマンドは、App Service Web アプリのデプロイ スロットを削除しています。
コマンド | 内容 |
---|---|
az webapp deployment slot delete | App Service Web アプリのデプロイ スロットを削除するためのコマンドです。 |
オプション | 値 | 内容 |
---|---|---|
--resource-group | rg-hello | App Service Web アプリを作成するリソースグループの名前を指定します。 |
--name | app-hello-spring-boot | App Service Web アプリの名前を指定します。 |
--slot | staging | App Service Web アプリの削除するスロットの名前を指定します。 |
Azure Portal の確認
[アプリ] → [デプロイ スロット] を確認します。
staging スロットが削除されたことを確認できました。
まとめ
Azure App Service 環境で、ブルーグリーンデプロイを実践することができました。
Maven、Azure CLI を使って、Spring Boot の JAR ファイル形式アプリの作成、Azure 環境へのデプロイまで、すべてをターミナルから行うことができます。このように、クラウドでのシステム開発に必要なスキルや理解を深めることができます。初めての人でも簡単に手順を追うことができるので、ぜひ挑戦してみてください。
どうでしたか? 検証目的の Azure App Service 環境で、JAR ファイル形式アプリのブルーグリーンデプロイを手軽に体験することができます。ぜひお試しください。今後も Azure の開発環境などを紹介していきますので、ぜひお楽しみにしてください。
推奨コンテンツ