HelidonのWebアプリケーションをAzure App Serviceで動かす



昨日書いた記事ではMicrosoft Learnの「Azure上のJavaの概要」を試して、Spring BootのWebアプリケーションをAzureにデプロイしました。

JavaのWebフレームワークは色々なものがあるので、他はどうなんだろう...?と気になったので、今日はMicroProfileの「Helidon」を試してみました。

基本的にはMicrosoftが後悔している以下のドキュメントどおりの手順ですが、一部変更しないとうまく動かなかったので、その辺りを含めてまとめます。

ローカル環境での実行

昨日書いた記事と同じ以下の環境を使いました。

使用したdockerfileは以下のとおりです。

FROM maven:3.8.1-openjdk-11

RUN curl -sL https://aka.ms/InstallAzureCLIDeb | bash

まずはMicroProfile Starterで以下のように選択してHelidonのプロジェクトをダウンロードします。

解凍したものをコンテナ環境で開いて以下のコマンドを実行します。

mvn clean package

あとは実行するだけです。

java -jar target/demo.jar

ブラウザでアクセスすると以下のような画面になります。

クリックするとHello Worldが表示されます。

ここまではドキュメントどおりです。

Azureでの実行

続いてAzureにデプロイするための準備です。最初にAzure CLIでログインしておきます。

az login

次にpom.xmlの セクションに以下を追加します。ドキュメントでは1.10.0となっていますが、試したらうまく動きませんでした。本記事の執筆時点の最新である1.13.0にしたところうまくいったので、以下を追加します。

<build>
  <finalName>helidon-hello-azure</finalName>
  <plugins>
    <plugin>
      <groupId>com.microsoft.azure</groupId>
      <artifactId>azure-webapp-maven-plugin</artifactId>
      <version>1.13.0</version>
    </plugin>
  </plugins>
</build>

続いてazure-webappでAzureの構成を設定します。

mvn azure-webapp:config

対話式に構成を聞かれるので、linux、Java 11を選びました。このあとドキュメントではセクションを編集するのですが、そのまま適用するとうまくいきませんでした。

azure-webapp-maven-pluginを1.10.0ではなく1.13.0に上げたことで、Configurationで使えない定義があるようです。

そこで、<webContainer>タグで「java11」と指定してあるものを「Java SE」に変えました。

また、ドキュメントでは<include>タグで「/libs/*.jar」を追加しているのですが、これがあると

Multi executable jars found in <resources>, please check the configuration

というエラーになるのでカットしました。ということで最終的な定義は以下のとおりです。

<plugins> 
      <plugin> 
        <groupId>com.microsoft.azure</groupId>  
        <artifactId>azure-webapp-maven-plugin</artifactId>  
        <version>1.13.0</version>  
        <configuration>
          <schemaVersion>V2</schemaVersion>
          <resourceGroup>demo-xxxxxxxxx-rg</resourceGroup>
          <appName>demo-xxxxxxxxxxxx</appName>
          <pricingTier>P1v2</pricingTier>
          <region>westeurope</region>
          <runtime>
            <os>linux</os>
            <javaVersion>java11</javaVersion>
            <webContainer>Java SE</webContainer>
          </runtime>
          <appSettings>
            <property>
              <name>PORT</name>
              <value>8080</value>
            </property>
            <property>
              <name>WEBSITES_PORT</name>
              <value>8080</value>
            </property>
            <property>
              <name>WEBSITES_CONTAINER_START_TIME_LIMIT</name>
              <value>600</value>
            </property>
          </appSettings>
          <deployment>
            <resources>
              <resource>
                <directory>${project.basedir}/target</directory>
                <includes>
                  <include>*.jar</include>
                </includes>
              </resource>
            </resources>
          </deployment>
        </configuration>
      </plugin> 
    </plugins> 

あとは以下デプロイしたら終了です。

mvn clean package
mvn azure-webapp:deploy

デプロイされたWebアプリケーションにアクセスするとローカル環境と同じものが無事表示されました。

ドキュメントどおりに試してエラーが出たときに少し焦りますが、その分、うまく動いたときは嬉しいですね。他のフレームワークも試したいと思います。