Azure Spring Apps (ASA) でブルーグリーンデプロイする
こんにちは、@studio_meowtoon です。今回は、Azure Spring Apps 環境で JAR ファイル形式のアプリをブルーグリーンデプロイする方法を紹介します。
目的
Windows 11 の Linux でクラウド開発します。
こちらから記事の一覧がご覧いただけます。
実現すること
Microsoft Azure Spring Apps (ASA) にて、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
Spring Apps サービスインインスタンス
こちらの関連記事で手順がご確認いただけます。
Spring Apps サービスインスタンスを作成します。
※ Kubernetes 基盤の環境がベースとなっているので少し時間がかかります。
--sku Standard からブルーグリーンデプロイに対応しています。
$ az spring create \
--resource-group rg-hello \
--name aps-hello \
--location japaneast \
--sku Standard
Spring Apps アプリ
v1 Spring Apps アプリの作成を行います。
$ az spring app create \
--resource-group rg-hello \
--service aps-hello \
--name sap-hello-spring-boot \
--deployment-name sap-hello-spring-boot--v1 \
--runtime-version Java_11 \
--assign-endpoint true
説明を開きます。
このコマンドは、Spring Apps アプリを作成しています。
コマンド | 内容 |
---|---|
az spring app create | Spring Apps アプリを作成するためのコマンドです。 |
オプション | 値 | 内容 |
---|---|---|
--resource-group | rg-hello | Spring Apps アプリを作成するリソースグループの名前を指定します。 |
--service | aps-hello | Spring Apps アプリを作成する、Spring Apps サービスインスタンスの名前を指定します。 |
--name | sap-hello-spring-boot | Spring Apps アプリの名前を指定します。 |
--deployment-name | sap-hello-spring-boot--v1 | Spring Apps アプリのデプロイの名前を指定します。 |
--runtime-version | Java_11 | Spring Apps アプリを Java 11 ランタイムで実行するように設定します。 |
--assign-endpoint | true | true の場合は直接アクセス用のエンドポイント URL を割り当てます。 |
v1 Spring Apps アプリをデプロイします。
$ az spring app deploy \
--resource-group rg-hello \
--service aps-hello \
--name sap-hello-spring-boot \
--deployment sap-hello-spring-boot--v1 \
--artifact-path target/app.jar
説明を開きます。
このコマンドは、Spring Apps アプリをデプロイしています。
コマンド | 内容 |
---|---|
az spring app deploy | Spring Apps アプリをデプロイするためのコマンドです。 |
オプション | 値 | 内容 |
---|---|---|
--resource-group | rg-hello | Spring Apps アプリを作成するリソースグループの名前を指定します。 |
--service | aps-hello | Spring Apps アプリを作成する、Spring Apps サービスインスタンスの名前を指定します。 |
--name | sap-hello-spring-boot | Spring Apps アプリの名前を指定します。 |
--deployment | sap-hello-spring-boot--v1 | Spring Apps アプリのデプロイの名前を指定します。 |
--artifact-path | target/app.jar | Spring Apps アプリにデプロイするコードの場所を指定します。 |
デプロイ成功後、以下のURLでアクセス可能です。
https://<service-name>-<app-name>.azuremicroservices.io
別ターミナルから curl コマンドでURL を確認します。
$ curl https://aps-hello-sap-hello-spring-boot.awesomemicroservices.io/api/data
{"message":"Hello Blue!"}
Azure Portal の確認
[アプリ] → [デプロイ] を確認します。
v1 アプリが、実稼働と設定されていることが確認できます。
ここまでの作業で v1 アプリの Azure Spring Apps へのデプロイが完了しました。
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 Spring Apps にデプロイ
Spring Apps アプリ
v2 Spring Apps アプリのステージング環境のデプロイを作成します。
$ az spring app deployment create \
--resource-group rg-hello \
--service aps-hello \
--app sap-hello-spring-boot \
--name sap-hello-spring-boot--v2 \
--runtime-version Java_11 \
--artifact-path target/app.jar
説明を開きます。
このコマンドは、Spring Apps アプリのステージング環境のデプロイを作成しています。
コマンド | 内容 |
---|---|
az spring app deployment create | Spring Apps アプリのステージング環境のデプロイを作成するためのコマンドです。 |
オプション | 値 | 内容 |
---|---|---|
--resource-group | rg-hello | Spring Apps アプリを作成するリソースグループの名前を指定します。 |
--service | aps-hello | Spring Apps アプリを作成する、Spring Apps サービスインスタンスの名前を指定します。 |
--app | sap-hello-spring-boot | Spring Apps アプリの名前を指定します。 |
--name | sap-hello-spring-boot--v1 | Spring Apps アプリのデプロイの名前を指定します。 |
--runtime-version | Java_11 | Spring Apps アプリを Java 11 ランタイムで実行するように設定します。 |
--artifact-path | target/app.jar | Spring Apps アプリにデプロイするコードの場所を指定します。 |
別ターミナルから curl コマンドでURL を確認します。
$ curl https://aps-hello-sap-hello-spring-boot.awesomemicroservices.io/api/data
{"message":"Hello Blue!"}
アプリのURLをリクエストすると、更新前の v1 アプリの出力が表示されます。
Azure Portal の確認
[アプリ] → [デプロイ] を確認します。
v2 アプリは、ステージングと設定されていることが確認できます。
別ターミナルから curl コマンドでテスト エンドポイントを確認します。
$ curl https://primary:4Fk5UKl9Bch3GbFFzXoLtzSRPpURANQ5Z2oylLldyp9OQZ4FplVxcLPqRpOxnJ6L@aps-hello.test.awesomemicroservices.io/sap-hello-spring-boot/sap-hello-spring-boot--v2/api/data
{"message":"Hello Green!"}
アプリを更新するために、v2 アプリを本番環境にステージングとしてデプロイすることができました。また、実際にリリースする前にテスト エンドポイント を利用して動作確認を行うことができます。これは、ブルーグリーンデプロイの目的の1つです。
新しいデプロイへの切り替え
ステージングを実環境に切り替えます。
$ az spring app set-deployment \
--resource-group rg-hello \
--service aps-hello \
--name sap-hello-spring-boot \
--deployment sap-hello-spring-boot--v2
説明を開きます。
このコマンドは、Spring Apps アプリの運用環境のデプロイを設定しています。
コマンド | 内容 |
---|---|
az spring app set-deployment | Spring Apps アプリの運用環境のデプロイを設定するためのコマンドです。 |
オプション | 値 | 内容 |
---|---|---|
--resource-group | rg-hello | Spring Apps アプリを作成するリソースグループの名前を指定します。 |
--service | aps-hello | Spring Apps アプリを作成する、Spring Apps サービスインスタンスの名前を指定します。 |
--name | sap-hello-spring-boot | Spring Apps アプリの名前を指定します。 |
--deployment | sap-hello-spring-boot--v2 | Spring Apps アプリのデプロイの名前を指定します。 |
デプロイが切り替わりました。
別ターミナルから curl コマンドでURL を確認します。
$ curl https://aps-hello-sap-hello-spring-boot.awesomemicroservices.io/api/data
{"message":"Hello Green!"}
アプリのURLをリクエストすると、更新後の v2 アプリの出力が表示されます。本番環境へのデプロイ作業が完了しました。※ この記事での本番環境となります。
Azure Portal の確認
[アプリ] → [デプロイ] を確認します。
v2 アプリが実稼働と設定されていることが確認できます。
トラブル発生時の切り戻し
サービスを最新バージョンにデプロイした後にトラブルが発生した場合、以前に正常に動作していたデプロイに戻す必要があります。これは、ブルーグリーンデプロイの目的の1つです。
v2 アプリから、v1 アプリに切り戻します。
※ デプロイを切り替えます。
$ az spring app set-deployment \
--resource-group rg-hello \
--service aps-hello \
--name sap-hello-spring-boot \
--deployment sap-hello-spring-boot--v1
別ターミナルから curl コマンドでURL を確認します。
$ curl https://aps-hello-sap-hello-spring-boot.awesomemicroservices.io/api/data
{"message":"Hello Blue!"}
アプリのURLをリクエストして、更新前の v1 アプリの出力が表示されました。
Azure Portal の確認
[アプリ] → [デプロイ] を確認します。
再度 v1 デプロイが実稼働に設定され、切り戻せたことを確認できます。
デプロイ後の注意点
Spring Apps アプリは2つのデプロイしか保持できません。さらに最新のデプロイを反映させるためには古いデプロイを削除する必要があります。
App sap-hello-spring-boot may have at most 2 deployments, currently 2
Spring Apps アプリの古いデプロイを削除します。
$ az spring app deployment delete \
--resource-group rg-hello \
--service aps-hello \
--app sap-hello-spring-boot \
--name sap-hello-spring-boot--v1
説明を開きます。
このコマンドは、Spring Apps アプリのデプロイを削除しています。
コマンド | 内容 |
---|---|
az spring app deployment delete | Spring Apps アプリのデプロイを削除するためのコマンドです。 |
オプション | 値 | 内容 |
---|---|---|
--resource-group | rg-hello | Spring Apps アプリを作成するリソースグループの名前を指定します。 |
--service | aps-hello | Spring Apps アプリを作成する、Spring Apps サービスインスタンスの名前を指定します。 |
--app | sap-hello-spring-boot | Spring Apps アプリの名前を指定します。 |
--name | sap-hello-spring-boot--v1 | Spring Apps アプリのデプロイの名前を指定します。 |
Azure Portal の確認
[アプリ] → [デプロイ] を確認します。
v1 デプロイが削除されたことを確認できました。
まとめ
Azure Spring Apps 環境で、ブルーグリーンデプロイを実践することができました。
Maven、Azure CLI を使って、Spring Boot の JAR ファイル形式アプリの作成、Azure 環境へのデプロイまで、すべてをターミナルから行うことができます。このように、クラウドでのシステム開発に必要なスキルや理解を深めることができます。初めての人でも簡単に手順を追うことができるので、ぜひ挑戦してみてください。
どうでしたか? 検証目的の Azure Spring Apps 環境で、JAR ファイル形式アプリのブルーグリーンデプロイを手軽に体験することができます。ぜひお試しください。今後も Azure の開発環境などを紹介していきますので、ぜひお楽しみにしてください。
推奨コンテンツ