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

https://qiita.com/official-events/22637c675c61a797a24f

<hr>

[昨日書いた記事](https://qiita.com/kikutaro/items/4b327eb58f128c548f6d)ではMicrosoft Learnの「[Azure上のJavaの概要](https://docs.microsoft.com/ja-jp/learn/modules/intro-to-java-azure/)」を試して、Spring BootのWebアプリケーションをAzureにデプロイしました。

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

https://helidon.io/#/

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

https://docs.microsoft.com/ja-jp/azure/developer/java/eclipse-microprofile/deploy-microprofile-helidon-java-app-with-maven-plugin

# ローカル環境での実行

[昨日書いた記事](https://qiita.com/kikutaro/items/4b327eb58f128c548f6d)と同じ以下の環境を使いました。

- [Docker](https://www.docker.com/)
- [Visual Studio Code](https://code.visualstudio.com/)
    - [Visual Studio Code Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)
    - [Docker for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker)
    - [Java Extension Pack](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack)


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

```dockerfile
FROM maven:3.8.1-openjdk-11

RUN curl -sL https://aka.ms/InstallAzureCLIDeb | bash
```
まずは[MicroProfile Starter](https://start.microprofile.io/)で以下のように選択してHelidonのプロジェクトをダウンロードします。

![スクリーンショット 2021-04-22 21.30.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/f4b7d410-4982-ab59-0c32-42e421ebd095.png)

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

```
mvn clean package
```

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

```
java -jar target/demo.jar
```

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

![2021-04-22_21h33_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/c5e8f82b-7602-8bbd-5f15-8ed4e9db5dda.png)

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

![2021-04-22_21h34_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/9585fea0-7ebf-f86b-e475-057b65ee4abf.png)

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

# Azureでの実行

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

```
az login
```

次にpom.xmlの<build> セクションに以下を追加します。[ドキュメント](https://docs.microsoft.com/ja-jp/azure/developer/java/eclipse-microprofile/deploy-microprofile-helidon-java-app-with-maven-plugin#configure-maven-plugin-for-azure-app-service)では1.10.0となっていますが、試したらうまく動きませんでした。本記事の執筆時点の最新である1.13.0にしたところうまくいったので、以下を追加します。

```xml
<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を選びました。このあと[ドキュメント](https://docs.microsoft.com/ja-jp/azure/developer/java/eclipse-microprofile/deploy-microprofile-helidon-java-app-with-maven-plugin#configure-maven-plugin-for-azure-app-service)では<configuration>セクションを編集するのですが、そのまま適用するとうまくいきませんでした。

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

https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Web-App:-Configuration-Details

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

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

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

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

```xml
<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アプリケーションにアクセスするとローカル環境と同じものが無事表示されました。

![2021-04-22_21h54_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/005b3e34-c5a5-8f84-043b-5ce54066e2a8.png)

![2021-04-22_21h54_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/2ef88a1a-b402-90d6-4b4d-40ca28efe1c9.png)

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