Spring Boot WEBサービスを Azure App Service で起動する (jar ファイル形式)
目的
Spring Boot WEBサービスを Azure App Service 環境で起動して理解を深めます。
実現すること
Microsoft Azure App Service に Spring Boot の jar ファイル形式のWEBアプリをデプロイします。
技術背景
Microsoft Azure App Service とは?
こちらを展開してご覧いただけます。
Microsoft Azure App Service
Microsoft Azure App Service は、Microsoft Azure の PaaS (Platform as a Service) サービスの一つで、WEB アプリケーションやモバイルアプリケーション、API アプリケーションのホスティングに特化したサービスです。
Azure App Service の主な特徴とメリットは以下のとおりです。
簡単なデプロイ
Azure App Service は、Azure Portal や Azure CLI、Azure DevOps などのツールを使って、WEB アプリケーションを簡単にデプロイできます。また、多数のプログラミング言語やフレームワークに対応しており、柔軟な開発が可能です。
スケーラビリティ
Azure App Service は、自動スケーリングや手動スケーリングをサポートしており、アプリケーションの負荷に応じて柔軟にスケールできます。
高可用性
Azure App Service は、グローバルな負荷分散やフェイルオーバー機能を備えており、高い可用性を実現できます。
統合
Azure App Service は、Azure の他のサービスとシームレスに統合できます。例えば、Azure SQL Database や Azure Storage などのストレージサービスと連携して、アプリケーションのデータ管理を容易にします。
セキュリティ
Azure App Service は、ネットワークセキュリティグループ (NSG) や WEB アプリケーションファイアウォール (WAF) などのセキュリティ機能を提供しており、アプリケーションのセキュリティを高めることができます。
まとめ
これらの特徴とメリットにより、Azure App Service は、開発者や企業にとって、高速かつ柔軟な WEB アプリケーションの開発とデプロイを支援するプラットフォームとして利用されています。
開発環境
- 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 JDK の導入と Hello World!
$ 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!
$ 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
※ この記事では基本的に Ubuntu のターミナルで操作を行います。
"Hello World" を表示する手順
Spring Boot WEBサービスの作成
Spring Boot WEBサービスの Hello World! を参照して頂けます。
プロジェクトフォルダに移動
※ ~/tmp/hello-spring-boot をプロジェクトフォルダとします。
$ cd ~/tmp/hello-spring-boot
Java アプリをビルド
※ target/app.jar が作成されます。
$ mvn clean install
Azure のアカウントを取得
Azure CLI でサインイン
Azure CLI をインストールする手順 を参照して頂けます。
$ az login
※ 最新バージョンに更新する場合
$ az upgrade
Azure 環境
リソースグループ
リソースグループを作成
$ az group create \
--name rg-hello \
--location japaneast
リソースグループ一覧表示
$ az group list
※ リソースグループを削除する場合
$ az group delete -n <group>
App Service プラン
App Service プランを作成
$ az appservice plan create \
--resource-group rg-hello \
--name asp-hello \
--sku Free \
--is-linux
App Service プランの一覧表示
$ az appservice plan list
※ App Service プランを削除する場合
$ az appservice plan delete -n <plan> -g <group>
App Service WEB アプリ
※ Azure App Service に Spring Boot WEBアプリをデプロイする方法はいくつかありますが、今回は Azure CLI で jar ファイルをデプロイする方法を紹介します。
※ ランタイムを確認
- JAVA:11-java11 を使用します。
$ az webapp list-runtimes --os-type linux | grep -e java -e JAVA
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"
Web アプリのログ記録の構成
$ az webapp log config \
--resource-group rg-hello \
--name app-hello-spring-boot \
--application-logging filesystem \
--web-server-logging filesystem
App Service WEB アプリのデプロイ
デプロイ
$ az webapp deploy \
--name app-hello-spring-boot \
--resource-group rg-hello \
--src-path target/app.jar \
--type jar
WEBブラウザーでアクセス
$ az webapp browse \
--resource-group rg-hello \
--name app-hello-spring-boot
※ 立ち上がりに少し時間が掛かりますがページが表示されます。 しかし表示されたページ "/" にはコンテンツを設定していません。
改めてWEBブラウザで確認
※ URLは環境で読み替えて下さい。
https://app-hello-spring-boot.azurewebsites.net/api/data
WEBブラウザに {"message":"Hello World!"} と表示され、JSON データを取得することが出来ました。
※ 別ターミナルから curl コマンドで確認
$ curl -v https://app-hello-spring-boot.azurewebsites.net/api/data
* Trying 20.43.67.36:443...
* Connected to app-hello-spring-boot.azurewebsites.net (20.43.67.36) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: /etc/ssl/certs
* TLSv1.0 (OUT), TLS header, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS header, Certificate Status (22):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS header, Finished (20):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS header, Certificate Status (22):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS header, Finished (20):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server accepted to use h2
* Server certificate:
* subject: C=US; ST=WA; L=Redmond; O=Microsoft Corporation; CN=*.azurewebsites.net
* start date: Dec 27 21:12:39 2022 GMT
* expire date: Dec 22 21:12:39 2023 GMT
* subjectAltName: host "app-hello-spring-boot.azurewebsites.net" matched cert's "*.azurewebsites.net"
* issuer: C=US; O=Microsoft Corporation; CN=Microsoft Azure TLS Issuing CA 05
* SSL certificate verify ok.
* Using HTTP2, server supports multiplexing
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* Using Stream ID: 1 (easy handle 0x55b794ea9e80)
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
> GET /api/data HTTP/2
> Host: app-hello-spring-boot.azurewebsites.net
> user-agent: curl/7.81.0
> accept: */*
>
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
< HTTP/2 200
< content-type: application/json
< date: Mon, 27 Feb 2023 02:51:05 GMT
< set-cookie: ARRAffinity=ae907ce840c6b95b786870ca4c1362dc92f4733f1b7145fe24a6c8a07a0d5ff4;Path=/;HttpOnly;Secure;Domain=app-hello-spring-boot.azurewebsites.net
< set-cookie: ARRAffinitySameSite=ae907ce840c6b95b786870ca4c1362dc92f4733f1b7145fe24a6c8a07a0d5ff4;Path=/;HttpOnly;SameSite=None;Secure;Domain=app-hello-spring-boot.azurewebsites.net
<
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* Connection #0 to host app-hello-spring-boot.azurewebsites.net left intact
{"message":"Hello World!"}
ターミナルに {"message":"Hello World!"} と表示され、JSON データを取得することが出来ました。
※ Azure 側で SSL/TLS対応と HTTP/2プロトコルを使用してくれます。
まとめ
- Ubuntu のシンプルな構成の Java 開発環境で Spring Boot WEBサービスを Azure App Service 環境で起動させることが出来ました。