Azure App Serviceとは

Azure App Serviceは、各種WebアプリやWeb API、RESTfulサービスなどの実行環境を提供するPaaS型のクラウドサービスである。各アプリはAzureプラットフォームの仮想環境上に展開され、自動スケールや高可用機能などを、複雑な設定をしなくても利用することができる。

App Serviceでは、Javaや.NETをはじめとして、PythonやRuby、PHP、JavaScript(Node.js)などといったさまざまなプログラミング言語でアプリを構築できる。またOSとして、WindowsとLinuxの両方がサポートされていることに加え、アプリをDockerコンテナとしてデプロイするオプションも備えている。

今回は、Spring Bootを利用して簡単なWebアプリを構築した上で、それを専用のMavenプラグインを使ってApp Serviceにデプロイする一連の手順を紹介する。

Spring BootでWebアプリを作る

まずは、Spring Bootを使ってデプロイ対象となるWebアプリを作成しよう。Spring Bootアプリの雛形を作るには「Spring Initializer」を利用すると便利だ。以下のサイトで、必要な項目を選択・入力するだけで、アプリの構成に最低限必要な要素を含んだMavenまたはGradleプロジェクトを作成してくれる。

https://start.spring.io/

次のスクリーンショットは、Java WebアプリのためのMavenプロジェクトを作成する場合の設定例である。JavaのバージョンはJava 11を指定した。Dependenciesの項目では利用したいフレームワークを選択する。今回は、Webアプリを作りたいので「Spring Web」を追加している。Spring Webは、検索窓に「Web」と入力すれば検索結果の一覧に出てくるはずだ。

設定できたら、一番下の[Generate]ボタンをクリックすれば、プロジェクトが生成されてzipファイルとしてダウンロードできる。上の例では、Artifactを「sample」とているため、sample.zipというファイルが生成された。

前回、Linux仮想マシン上にJavaの開発環境を構築してあるので、今回はそれを開発マシンとして利用したい。zipファイルをダウンロードしたら、scpコマンドなどを利用して仮想マシン上にアップロードしよう。

アップロードしたら、zipファイルを解凍して、プロジェクトのディレクトリに移動する。

$ unzip sample.zip
$ cd sample/

続いて、Webブラウザからアクセスしたときのエンドポイントとなる部分のクラスを追加する。src/main/java/jp/mynavi/azurejava/sample/ ディレクトリ(パッケージ名を本稿の例と同じにした場合)に、「SampleController.java」という名前で以下の内容のプログラムを作って配置しよう。

SampleController.java

package jp.mynavi.azurejava.sample;

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
public class SampleController {

        @RequestMapping("/hello")
        public String index() {
                return "Hello Spring Boot!";
        }

}

この index() メソッドは、Web経由でアクセスする場合の /hello のエンドポイントにマッピングされる。すなわち、「http://..../hello」にアクセスがあった場合に呼び出されて、呼び出し元に「Hello Spring Boot!」という文字列を返す。

ここまでできたら、プロジェクトのルートディレクトリで、以下のコマンドを実行してアプリをビルドしよう。

$ mvn clean package

ビルドに成功したら、次のコマンドで構築したアプリを起動できる。

$ mvn spring-boot:run

この状態ではアプリは仮想マシンのローカルで起動しているので、ここで別のプロンプトを立ち上げて次のコマンドを実行すると、「Hello Spring Boot!」と返ってくることが確認できるはずだ。curlは指定したURLにリクエストを送るコマンドである。

$ curl http://localhost:8080/hello
Hello Spring Boot!

Azure App Service用のMavenプラグインを設定する

上の例ではWebアプリを仮想マシンのローカルで実行しただけなので、今度はこれをApp Serviceにデプロイしたい。App Service用のMavenプラグインを利用すれば、非常に簡単にデプロイを行うことができる。

まず、プロジェクトの「pom.xml」のpluginsの部分に、次の内容の設定を追加する。

<plugin>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-webapp-maven-plugin</artifactId>
    <version>1.9.0</version>
</plugin>

追加したら、次のように「mvn azure-webapp:config」を実行することで、設定ファイルを自動でApp Serviceように構成し直してくれる。途中でOSの種類とJavaのバージョンを聞かれるので、今回は「Linux」および「11」をそれぞれ選択しよう。最後に「Confirm (Y/N)?」と出たら、「Y」を入力すれば設定が完了する。

$ mvn azure-webapp:config
    ......
    ......
    ......
[WARNING] The plugin may not work if you change the os of an existing webapp.
Define value for OS(Default: Linux):
1. linux [*]
2. windows
3. docker
Enter index to use: 1
Define value for javaVersion(Default: Java 8):
1. Java 11
2. Java 8 [*]
Enter index to use: 1
Please confirm webapp properties
AppName : sample-1580893629721
ResourceGroup : sample-1580893629721-rg
Region : westeurope
PricingTier : PremiumV2_P1v2
OS : Linux
RuntimeStack : JAVA 11-java11
Deploy to slot : false
Confirm (Y/N)? :Y
[INFO] Saving configuration to pom.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  02:32 min
[INFO] Finished at: 2020-02-05T09:09:10Z
[INFO] ------------------------------------------------------------------------
$ 

この時点で、pom.xmlにはApp Service用プラグインのデフォルトの設定が追加されている。このうち、価格プランとリージョンだけは自分用に修正しておいたほうがいいだろう。今回は価格プランは「Standard B1」、リージョンは「東日本」としたかったので、pricingTierとregionの設定個所を探して、次のように変更した。

<pricingTier>B1</pricingTier>
<region>japaneast</region>

また、Webアプリを公開するポートは80番にしたいので、runtimeとdeploymentの間あたりに次のようにappSettingsの設定を追加しておこう。

....
</runtime>
<appSettings>
    <property>
            <name>JAVA_OPTS</name>
            <value>-Dserver.port=80</value>
        </property>
</appSettings>
<deployment>
....

以上でApp Service用プラグインの設定は完了だ。

Azure CLIを使ってAzureにログインする

さて、Mavenプラグインを使ってアプリをデプロイするには、あらかじめAzureサービスにログインして認証をクリアしておく必要がある。AzureサービスへのログインにはAzure CLIと呼ばれるコマンドラインツールを利用する。Linux環境では、Azure CLIはyumを使ってインストールできる。

まず、次の内容を「azure-cli.repo」というファイル名で保存して、/etc/yum.repos.d/ ディレクトリ以下に配置する。

[azure-cli]
name=Azure CLI
baseurl=https://packages.microsoft.com/yumrepos/azure-cli
enabled=1
gpgcheck=1
gpgkey=https://packages.microsoft.com/keys/microsoft.asc

続いて、次のコマンドを実行して認証キーをインポートする。

$ sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc

最後に、yumコマンドでインストールを実施する。

$ sudo yum install azure-cli

Azure CLIはコマンドラインからAzure環境にアクセスしてさまざまな設定を行うことができるツールである。仮想マシンの構築や操作などもこのツールで行うことができる。今回は、ひとまずログインされできていればあとはMavenプラグインがすべてやってくれる。

ログインは次のコマンドで行う。

$ az login
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code GHWFGASAK to authenticate.

「https://microsoft.com/devicelogin にアクセスして指定のコード(この例ではGHWFGASAK)を入力しろ」という指示が返ってきている。Webブラウザ(ローカルの作業マシンで良い)で指定されたURLにアクセスすると、次の画面のようにコード入力が求められるので、ここでコードを入力する。

Microsoftアカウントを複数持っている場合は、次の図のように表示されるので、Azureサブスクリプション用に利用しているものを選択する。

ログインに成功すれば、コンソールにサブスクリプション情報が返ってくるはずだ。

Azure App ServiceにWebアプリをデプロイする

ここまで準備ができたら、いよいよApp Serviceにアプリをデプロイしてみよう。プロジェクトのルートディレクトリで次のコマンドを実行すれば、App Serviceへのデプロイが行われる。初回は少し時間がかかる。

$ mvn azure-webapp:deploy

デプロイに成功すると、AzureポータルのApp Serviceのページで、今デプロイしたアプリが一覧に追加されていることが確認できるはずだ。

詳細ページに移動すると、右上にURLが記載されている。これが、このアプリが公開されているURLになる。

WebブラウザからこのURLにアクセスすれば、外部向けにこのWebアプリが公開されていることが確認できる。今回は /hello というエンドポイントを用意しているので、「http://sample~.net/hello」にアクセスすれば、画面に「Hello Spring Boot!」と表示される。

なお、デプロイしたリソースが不要になったら、忘れずに削除しておくことをお勧めする。Azureポータルの[削除]ボタンで削除できる。