Azure Spring Cloud の環境構築方法のご紹介
本ブログエントリは、Microsoft Azure Advent Calendar の 20日目の内容です。
昨日は @mstakaha1113 さんによる 「AzureでIoT系のサービスをサラッと(?)使ってみよう」でした。
明日は @hoisjp さんです。
Pivotal と Microsoft は 2019/10/8 オースティンで開催された SpringOne Platform 2019 で Azure Spring Cloud というサービスを発表しました。
(SpringOne 2019 における Azure Spring Cloud の発表内容)
Azure Spring Cloud の特徴
Azure Spring Cloud は Microsoft と Pivotal が共同開発した Spring Cloud アプリケーションの開発・運用に特化した環境で、これを利用した場合、アプリケーションの運用・管理コストを大幅に軽減してくれます。
実際の実行環境は Azure Kubernets Service (AKS) ですが、Kubernetes 環境を全く意識することなく、本来必要となる複雑な管理操作を完全に隠蔽しています。実際 Kubernetes コマンドを直接実行する事はできません。その為、おそらく多くの方が Kubernetes 上で動作している事に気づかないかもしれません。
筆者は Kubernetes による Java アプリケーションの開発・運用も経験をしていますが、Kubernetes 上での開発・運用に比べて、特にインフラ面の管理コストが大幅に削減できると考えています。
通常 Kubernetes 上で Java アプリケーションを動作させるためには、コンテナを強く意識したビルド・プロセス、リリース・プロセスが必要です (コンテナのビルド、コンテナレジストリへの Push、YAML の生成、k8s への適用など)。
# Build the Source Code $ mvn clean package # Build the Container Image $ docker build -t $DOCKER_IMAGE:$VERSION . -f Dockerfile $ docker tag $DOCKER_IMAGE:$VERSION $DOCKER_REPOSITORY/$DOCKER_IMAGE:$VERSION # Push the image to Container Registry $ docker push $DOCKER_REPOSITORY/$DOCKER_IMAGE:$VERSION # Create and Modify the Deployment YAML file # Apply to the Kubernetes kubectl apply --record -f deployment.yaml
上記以外にも、Kuberenes 自身のメンテナンスやパッチ適用、クラスタ自身の運用管理を行わなければなりません。
しかし、Azure Spring Cloud を利用すると Pivotal Build Service という機能を完全統合しているため、アプリケーション開発者は、ソースコードの開発により集中できるようになります。具体的には開発者はソースコードの開発に集中し、コンテナのビルドや YAML ファイルの生成は不要で、コマンドを2、3回実行するだけで簡単にアプリケーションをデプロイできるようになります。デプロイに関しても最初から Blue-Green デプロイの機能を持つため、最新のビルドは Staging 環境にデプロイし、動作確認したのち、本番環境と切り替えるといった操作も容易に実現できます。
さらに、既存の Azure の Managed Service (現時点では Cosmos DB, MySQL, Redis) とのサービス・バインディングの機能も持つ為、JDBC などの接続情報を容易に作成することもできとても便利です。
上記以外にも多くの機能を持つ Azure Spring Cloud ですが、筆者は比較的小規模〜中規模のマイクロサービス提供をしたい場合、今後有用な選択肢になると考えています。
実際の操作イメージを掴む為、下記のデモ動画をご覧ください。
下記動画のデモ内容
- デモアプリケーションのご紹介 (PetStore)
- Azure DataBase for MySQL の動作確認
- Visual Studio Code を利用した Spring Boot アプリの実装のご紹介
- ソースコードのビルド
- Azure Spring Cloud アプリの作成
- Azure Spring Cloud アプリから Managed MySQL へのバインド
- CPU, Memory, インスタンスなどのスケール機能のご紹介
- Spring Boot アプリケーションを Azure Spring Cloud アプリへデプロイ
- Log Analytics による、アプリケーション・ログの確認
- アプリケーションの動作確認
- 分散トレーシング機能のご紹介 (Application Insights を利用)
- ブルー・グリーン・デプロイ機能の検証
ソースコード修正→ビルド→ステージング環境へのデプロイ
- ステージング・アプリと本番アプリの切り替え
- GitHub Actions を利用した CI/CD の構築
(GUI で Azure Spring Cloud と MySQL を接続する環境構築方法)
※ ご注意:本デモ動画は筆者のプレゼン時に操作時の待ち時間を短縮するため、操作待ちの箇所をカット(編集)しています。実際には、本デモ動画よりも所用時間が長くなることをご理解ください。
NeXTSTEP :Azure Spring Cloud 構築の事前準備 (CLI 版)
以降のエントリーでは、上記 GUI (動画ビデオ) で環境構築した内容と、ほぼ同等の内容を CLI (コマンドライン)だけで構築する方法について紹介します。
CLI で環境構築する場合は別途、Log Analytics や Application Insights の連携などを自ら行う必要がある為、まずはこれらを作成するところから始めます。
1. Azure へのログインと Spring Cloud 用エクステンションの追加
まず、Azure CLI を利用するために az login コマンドでログインをしましょう。そして次に、Azure Spring Cloud を操作するために、az extension コマンドでエクステンションを追加してください。
$ az login $ az extension add --name spring-cloud
2. 環境変数の設定
次に、各種リソースの名前などを可変で変更しやすくするため、さらに入力ミスを極力減らす目的で、下記の環境変数を設定してください。
$ export RESOURCE_GROUP=Spring-Cloud-Services $ export SPRING_CLOUD_SVC_NAME=spring-cloud-services-jp $ export LOCATION=southeastasia $ export APP_INSIGHTS_NAME=spring-clouds-appinsights $ export MYSQL_NAME=mysql4springcloud $ export MYSQL_USERNAME=terada $ export MYSQL_PASSWORD=whelp90-OCRs $ export MYSQL_DB_NAME=petstoredb $ export SPRING_CLOUD_APP_NAME=petstore-app $ export SPRING_CLOUD_APP_NEW_VERSION_NAME=petstore-app-new-version
上記の環境変数名のそれぞれの意味を下記に記載します。適宜ご自身の環境に応じて上記の環境変数の値は変更してください。
環境変数名 | 説明 |
RESOURCE_GROUP | リソースグループ名 |
SPRING_CLOUD_SVC_NAME | Azure Spring Cloud のサービス名 |
LOCATION | リソースを配置するリージョンの場所 |
APP_INSIGHTS_NAME | Application Insights の名前 |
MYSQL_NAME | MySQL の名前 |
MYSQL_USERNAME | MySQL のログイン・ユーザ名 |
MYSQL_PAAWORD | MySQL のユーザ・パスワード |
MYSQL_DB_NAME | MySQL のデータベース名 |
SPRING_CLOUD_APP_NAME | Azure Spring Cloud のデプロイするアプリケーション名 |
CLOUD_APP_NEW_VERSION_NAME | Azure Spring Cloud のステージング環境に配備するアプリケーション名 |
3. Azure リソースグループの作成
それでは早速、Azure Spring Cloud をインストールするリソース・グループを作成します。下記のコマンドを実行してください。
$ az group create \ --location $LOCATION \ --name $RESOURCE_GROUP
4. Application Insights のインストール
リソース・グループを作成した後、Application Insights をインストールしてください。Application Insights をインストールする事で、Azure Spring Cloud から分散トレーシング機能を利用できるようになります。
$ az resource create \ --resource-group $RESOURCE_GROUP \ --resource-type "Microsoft.Insights/components" \ --name $APP_INSIGHTS_NAME \ --location $LOCATION \ --properties '{"Application_Type":"web"}'
上記コマンドを実行した結果が、JSON 形式で出力されます。出力結果の中に、下記のような InstrumentationKey が表示されます。
後の設定で利用するため、この値をコピーして保存しておいてください。
"InstrumentationKey": "d25f6639-****-****-****-f1b******b41",
5. Log Analytics Workspace のインストール
次に、Log Analytics Workspace をインストールします。下記の defaultValue の値をご自身の環境にあわせて修正して deploy_logworkspacetemplate.json というファイル名で保存してください。
{ "$schema": "https://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "workspaceName": { "type": "String", "defaultValue": "workspace-name(適宜名前を修正してください)", "metadata": { "description": "Specifies the name of the workspace." } }, "location": { "type": "String", "allowedValues": [ "eastus", "southeastasia", "westus" ], "defaultValue": "southeastasia", "metadata": { "description": "Specifies the location in which to create the workspace." } }, "sku": { "type": "String", "allowedValues": [ "Standalone", "PerNode", "PerGB2018" ], "defaultValue": "PerGB2018", "metadata": { "description": "Specifies the service tier of the workspace: Standalone, PerNode, Per-GB" } } }, "resources": [ { "type": "Microsoft.OperationalInsights/workspaces", "name": "[parameters('workspaceName')]", "apiVersion": "2015-11-01-preview", "location": "[parameters('location')]", "properties": { "sku": { "Name": "[parameters('sku')]" }, "features": { "searchVersion": 1 } } } ] }
上記の JSON を deploy_logworkspacetemplate.json ファイルに保存したのち、下記のコマンドを実行し Log Analytics の Workspace を作成してください。
$ az group deployment create \ --resource-group $RESOURCE_GROUP \ --name spring-cloud-log-analytics-workspace \ --template-file deploy_logworkspacetemplate.json
6. Azure Database for MySQL のインストールと検証用 DB の作成
最後の準備事項として、下記のコマンドを実行して Azure Database for MySQL をインストールします。
※ ご注意:今回の MySQL の作成方法は検証目的で作成しています。本番環境用ではないためご注意ください。
$ az mysql server create \ -l $LOCATION \ -g $RESOURCE_GROUP \ -n $MYSQL_NAME \ -u $MYSQL_USERNAME \ -p $MYSQL_PASSWORD \ --sku-name GP_Gen5_2
MySQL を作成した直後は Firewall の設定により全てのクライアントからのリクエストを受け付けられなくなっています。そこで Firewall の設定を行い MySQL に接続できるようにします。ここでは、Azure 内の IP アドレス (0.0.0.0) からだけ MySQL に接続をできるようにしています。
※ ご注意:本来は個別に接続可能な IP アドレスを設定してください。
$ az mysql server firewall-rule create \ -g $RESOURCE_GROUP \ -s $MYSQL_NAME \ -n allowfrominternal \ --start-ip-address 0.0.0.0 \ --end-ip-address 0.0.0.0
上記の設定で、Azure 内のネットワークからは MySQL に接続できるようになります。たとえばコマンドの実行環境が Cloud Shell などを利用している場合、これで接続ができるようになるかと想定します。
一方、MySQL への接続が外部のネットワークからの場合、0.0.0.0 の部分を変更し個別に接続可能な IP アドレスを指定してください。管理ポータルを利用すると簡単にクライアントの IP アドレスを入手し登録する事もできます。MySQL の「Connection Security」より「Add ClientIP」というボタンを押下するとご自身の IP アドレスが自動的に取得できます。「Save」ボタンを押下してご自身のパソコンなどからアクセスできるように設定してください。
Firewall 設定が完了すると、mysql コマンドを利用して MySQL に接続ができるようになります。下記のコマンドでは日本語入力に対応する設定や、データベースの作成、さらにはテーブル作成やデータをインサートを行なっています。 ( catalog.sql は後述する git clone で入手できます)
$ mysql -u $MYSQL_USERNAME@$MYSQL_NAME \ -h $MYSQL_NAME.mysql.database.azure.com -p mysql> show databases; mysql> show variables like "char%"; mysql> set character_set_database=utf8mb4; mysql> set character_set_server=utf8mb4; mysql> create database petstoredb default character set utf8mb4; mysql> use petstoredb; mysql> source ./catalog.sql mysql> select * from item;
CLI 版:Azure Spring Cloud の環境構築
7. Azure Spring Cloud の構築
上記の準備を完了することで、Azure Spring Cloud を便利に利用できるための環境が整いました。そこで、ここから実際に Azure Spring Cloud のサービスを作っていきます。リソース・グループ内に Azure Spring Cloud のサービスを作成してください。
$ az spring-cloud create \ -n $SPRING_CLOUD_SVC_NAME \ -g $RESOURCE_GROUP
8.Azure Spring Cloud と Log Analytics の連携
Azure Spring Cloud のサービスを作成したのち、Log Analytics WorkSpace と連携するための設定を行ってください。
大変残念ながら、この連携の設定は現時点で Azure 管理ポータルからしかできません。
管理ポータルから Azure Spring Cloud を選択し、「Monitoring」→「Diagnostics settings」を選択してください。
次に「+ Add diagnostic setting」を押下し「Name」に適切な名前を入力してください。
次に「Send to Log Analytics」にチェックし「Subscription」と「Log Analytics workspace」から、準備段階で作成したワークスペース名を選択してください。log, metrics の全項目にチェックし「Save」ボタンを押下してください。
以上で、デプロイしたアプリケーションのログなどが Log Analytics 経由で参照できるようになります。
9. Azure Spring Cloud 上に新規アプリの作成
Azure Spring Cloud のサービスを作成したので、次にサービス内に Spring Boot/Spring Cloud のマイクロサービス・アプリケーションをデプロイします。
$ az spring-cloud app create \ -n $SPRING_CLOUD_APP_NAME \ -s $SPRING_CLOUD_SVC_NAME \ -g $RESOURCE_GROUP
10. MySQL へのバインドを作成
次に、Azure Spring Cloud から MySQL を利用できるようにバインド設定を行います。GUI からバインドを作成する際は、GUI からサブスクリプションを選択しその中に含まれる MySQL を選択することで容易にバインド情報を作成できますが、CLI からバインドを行うためにはまず MySQL の ID を取得しなければなりません。そこで、MySQL の ID を取得するために、下記のコマンドを実行して取得してください。ここで、「“id”: “/subscriptions/***」 ではじまる行の内 「/databases/petstoredb」 より前の部分を MySQL の リソース ID (–resource-id) として利用します。
$ az mysql db show \ --name $MYSQL_DB_NAME \ -g $RESOURCE_GROUP \ --server-name $MYSQL_NAME { "charset": "utf8mb4", "collation": "utf8mb4_general_ci", "id": "/subscriptions/********-****-****-****-************/resourceGroups/Spring-Cloud-Env/providers/Microsoft.DBforMySQL/servers/mysql4springcloud/databases/petstoredb", "name": "petstoredb", "resourceGroup": "Spring-Cloud-Env", "type": "Microsoft.DBforMySQL/servers/databases" }
取得した リソース ID を指定して MySQL のバインドを作成してください。
$ az spring-cloud app binding mysql add \ --app $SPRING_CLOUD_APP_NAME \ --resource-id "/subscriptions/********-****-****-****-************/resourceGroups/Spring-Cloud-Env/providers/Microsoft.DBforMySQL/servers/mysql4springcloud" \ --database-name $MYSQL_DB_NAME \ --name "mysql-binding" \ -s $SPRING_CLOUD_SVC_NAME \ -g $RESOURCE_GROUP \ --username $MYSQL_USERNAME@$MYSQL_NAME \ --key $MYSQL_PASSWORD
バインドが完了すると Azure Portal 上では下記のような内容を確認できます。
11. サンプル・ソースコードの入手
次に、GitHub よりサンプルのソースコードやデータ、設定ファイルなどを入手してください。
$ git clone https://github.com/yoshioterada/Azure-Spring-Cloud-with-MySQL-Sample
ディレクトリ構成は下記のようになっています。
├── catalog.sql (MySQL に挿入するデータ) ├── deploy_logworkspacetemplate.json (Log Analytics Workspace を作成するためのJSON) ├── mvnw ├── mvnw.cmd ├── pom.xml └── src ├── main │ ├── java │ │ └── com │ │ └── yoshio3 │ │ └── demo │ │ ├── CatItemRepository.java (Repository クラス) │ │ ├── DemoApplication.java (Main クラス) │ │ ├── Item.java (JPA Entity クラス) │ │ └── PetItemController.java (REST API 実装クラス) │ └── resources │ ├── AI-Agent.xml │ ├── application.properties │ ├── log4j2.xml │ ├── static │ │ ├── css │ │ │ ├── new-design.css (新デザイン) │ │ │ └── old-design.css (旧デザイン) │ │ └── images │ └── templates │ └── index.html ( Web ページ ThymeLeaf ) └── test └── java └── com └── yoshio3 └── demo └── DemoApplicationTests.java
12. ソースコードのビルドとアプリのデプロイ
入手したソースコードを mvn コマンドでビルドしてください。ビルドが完了すると target ディレクトリ配下に demo-0.0.1-SNAPSHOT.jar ができます。
$ mvn clean package -DskipTests $ ls target/ classes demo-0.0.1-SNAPSHOT.jar demo-0.0.1-SNAPSHOT.jar.original generated-sources generated-test-sources maven-archiver maven-status test-classes
ビルドの成果物である demo-0.0.1-SNAPSHOT.jar を Azure Spring Cloud のアプリに対してデプロイします。
この時、事前準備で作成した Application Insights の InstrumentationKey を環境変数 (–env “azure.application-insights.instrumentation-key=) に設定します。これにより Java で実装した Application Insights を動作できます。デプロイには少し時間がかかりますので、しばらくお待ちください。
$ az spring-cloud app deploy \ -n $SPRING_CLOUD_APP_NAME \ -s $SPRING_CLOUD_SVC_NAME \ -g $RESOURCE_GROUP \ --instance-count 2 --memory 2 \ --runtime-version Java_8 \ --env "azure.application-insights.instrumentation-key=********-****-****-****-************" \ --jar-path ./target/demo-0.0.1-SNAPSHOT.jar --version 1
13. 外部から接続可能な Public URL を作成
デプロイ時に Public URL の公開オプションを指定せずにデプロイすると下記のように 「Test Endpoint」しか作成されません。
GUI からは「Assign domain」のボタンを押下するだけで容易に Public URL を付加する事ができますが、CLI では下記のコマンドを実行することで Public からアクセス可能な URL を作成できます。
$ az spring-cloud app update \ -n $SPRING_CLOUD_APP_NAME \ -s $SPRING_CLOUD_SVC_NAME \ -g $RESOURCE_GROUP \ --is-public true
作成された URL を確認するために、下記のコマンドを実行してください。”url” の行に URL が表示されます。
$ az spring-cloud app show \ -n $SPRING_CLOUD_APP_NAME \ -s $SPRING_CLOUD_SVC_NAME \ -g $RESOURCE_GROUP ........ (中略) "url": "https://spring-cloud-services-******-********-***.azuremicroservices.io" }, "resourceGroup": "Spring-Cloud-Env", "type": "Microsoft.AppPlatform/Spring/apps" }
14. 動作確認
上記の URL に対して curl コマンド、もしくは Web ブラウザを利用してアクセスしてみてください。
$ curl https://spring-cloud-services-******-********-***.azuremicroservices.io/cats
15. 新バージョンをステージングへデプロイ
上記で一通りアプリケーションのデプロイはできるようになりましたが、さらにアプリケーションを更新して、Blue-Green デプロイの機能も試してみましょう。
アプリケーションの一部を更新して新バージョンを作成します。
ここではわかりやすくするため、デザインを変更してみましょう。index.html を開き、CSS を “old-design.css” から “new-design.css” に修正して、さらに <H1>Hello Java<H1> の行も追加します。
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> <head> <title>Springboot</title> <meta charset="utf-8" /> <link th:href="@{/css/new-design.css}" rel="stylesheet" type="text/css"></link> </head> <body> <H1>Hello Java</H1>
編集が終わったのち、新しいバージョンを作るために再度 mvn コマンドでソースコードをビルドします。
$ mvn clean package -DskipTests
今回は、アプリケーションを Staging 環境にデプロイするため、下記のコマンドを実行します。–name で新規バージョンにつける名前を指定します。
(ご注意:上記で実行した az spring-cloud app deploy コマンドとは違います)
$ az spring-cloud app deployment create \ -s $SPRING_CLOUD_SVC_NAME \ -g $RESOURCE_GROUP \ --name $SPRING_CLOUD_APP_NEW_VERSION_NAME \ --version 2 \ --app $SPRING_CLOUD_APP_NAME \ --jar-path target/demo-0.0.1-SNAPSHOT.jar
16. 本番とステージングのアプリの入れ替え
上記で、Staging 環境に新しいバージョンがデプロイされましたが、新バージョンを本番環境に適用するためには、旧バージョンから新バージョンにリクエストの振り先を変える必要があります。そこで、振り先を新バージョンに変更するために下記のコマンドを実行してください。
$ az spring-cloud app set-deployment \ --deployment $SPRING_CLOUD_APP_NEW_VERSION_NAME \ --name $SPRING_CLOUD_APP_NAME \ -s $SPRING_CLOUD_SVC_NAME \ -g $RESOURCE_GROUP
このようにして簡単にバージョンの切り替えも可能です。
17. GitHub Actions による CI/CD
さらに、下記にのような GitHub Actions のワークフローを作成(.github/workflows/main.yaml)することで、GitHub に対してソースコードを Push する度に、ソースコードのビルドからデプロイまでを自動化することもできます。
このワークフローを作成する上で注意したポイントは、Staging にすでにアプリケーションがデプロイされている場合、上書きできずエラーになるため、一旦既存のデプロイ済みのアプリケーションを削除して追加しています。また、ソースコードリビジョンとデプロイ名を一致させるために、環境変数に Git のリビジョン番号などを代入し、それを名前に付加するようにしています。
name: Build and deploy on Azure Spring Cloud on: [push] jobs: build-and-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: Set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Get Year Month Day run: echo ::set-env name=DATE::$(date '+%Y%m%d-%H%M%S') - name: Get the Git Revision Number run: echo ::set-env name=GIT_SHORT_VERSION::$(git rev-parse --short HEAD) - name: Build with Maven run: mvn package -DskipTests -Pcloud - name: Login to Azure Spring Cloud uses: azure/actions/login@v1 with: creds: ${{ secrets.AZURE_CREDENTIALS }} - name: Install Azure Spring Cloud extension run: az extension add -y --source https://azureclitemp.blob.core.windows.net/spring-cloud/spring_cloud-0.1.0-py2.py3-none-any.whl - name: Get Un Active Service Name run: echo ::set-env name=UNACTIVE_SERVICE::$(az spring-cloud app deployment list -g Spring-Cloud-Services -s spring-cloud-services-jp --app petstore-app -o json | jq -c '.[]| [.name, .properties.active]' | grep false | awk -F'["]' '{print $2}') - name: Delete UnActive Service run: az spring-cloud app deployment delete -n ${{env.UNACTIVE_SERVICE}} -g Spring-Cloud-Services -s spring-cloud-services-jp --app petstore-app - name: Deploy to Azure Spring Cloud run: az spring-cloud app deployment create -g Spring-Cloud-Services -s spring-cloud-services-jp --name green-${{env.DATE}}-${{env.GIT_SHORT_VERSION}} --version ${{env.DATE}}-${{env.GIT_SHORT_VERSION}} --app petstore-app --jar-path target/demo-0.0.1-SNAPSHOT.jar
以上、で GUI でデモした内容とほぼ同等の内容を CLI だけで実施しましたが、自動化設定を行う際には本内容が必要になる場合もあるかと想定します。本エントリを少しでもお役に立てていただければ誠に幸いです。
その他の参考情報
Azure Spring Cloud は 2019 年 10 月に発表されたばかりのサービスで、現時点ではまだ Preview 版になります。しかしながら現状でも便利な機能が含まれるため、ぜひ多くの皆様にお試しいただければ誠に幸いです。また、本紙の都合上取り上げなかった機能に関しても下記のようなドキュメントから参照していただく事ができます。
Azure Spring Cloud
Azure Spring Cloud のドキュメント
その他 Spring on Azure に関する情報
Azure Spring Cloud のご紹介
また、Microsoft MVP である@setoazusaさんも、12/19 に「Azure Spring CloudでBlue-Green Deploy」というエントリーを投稿してくださっているようです。こちらも合わせてご覧ください。
さいごに
Azure Spring Cloud の正式リリース(GA) は来年 2020 年の Q2 あたりを予定しています。ご興味のある方はぜひ、お早めにお試しいただきぜひ使用感に関してフィードバックをいただければ誠に幸いです。
より多くのフィードバックをいただき改善していくことでさらに良くなってまいりますので、ぜひ多くの皆様お試しください。
ご協力のほどどうぞよろしくお願いします。
Entry filed under: Microsoft Azure. Tags: Azure, Java, Microservices, Spring Boot, Spring Cloud.