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

これまで、いくつかのJava製WebフレームワークをAzure上で動かしてきました。
- [Spring Boot on Azure](https://qiita.com/kikutaro/items/4b327eb58f128c548f6d)
- [Helidon on Azure](https://qiita.com/kikutaro/items/cb92d6d5b2c8e22c8427)
- [Quarkus on Azure](https://qiita.com/kikutaro/items/33be8b3e00ad9eb37b41)
今日はVert.xを試してみます。

プロジェクトはVert.x Starterで作りました。

https://start.vertx.io/

Dependenciesは何も選択しませんでした。
![スクリーンショット 2021-05-01 21.57.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/e5a32a57-126e-0eec-e8f3-b61d0b4ababb.png)


# ローカル環境での実行

[Helidon](https://qiita.com/kikutaro/items/cb92d6d5b2c8e22c8427)や[Quarkus](https://qiita.com/kikutaro/items/33be8b3e00ad9eb37b41)を試したときと同じ環境を使いました。

- [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)

Starterを解凍するとMainVerticle.javaが入っています。コードはそのまま使います。

```java
package com.example.starter;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise;

public class MainVerticle extends AbstractVerticle {

  @Override
  public void start(Promise<Void> startPromise) throws Exception {
    vertx.createHttpServer().requestHandler(req -> {
      req.response()
        .putHeader("content-type", "text/plain")
        .end("Hello from Vert.x!");
    }).listen(8888, http -> {
      if (http.succeeded()) {
        startPromise.complete();
        System.out.println("HTTP server started on port 8888");
      } else {
        startPromise.fail(http.cause());
      }
    });
  }
}
```

ビルドします。

```
mvn clean package
```

実行します。

```
java -jar target/*.jar
```

localhostにアクセスして以下表示になればOKです。

![スクリーンショット 2021-05-01 22.05.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/300e1325-7af2-0e65-43a6-e1e4754d7a62.png)

# Azureでの実行

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

```
az login
```

次にpom.xmlのbuildセクションに以下を追加します。

```xml
<plugin>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-webapp-maven-plugin</artifactId>
    <version>1.14.0</version>
</plugin>
```

以下コマンドを実行します。

```
mvn com.microsoft.azure:azure-webapp-maven-plugin:1.14.0:config
```

対話式に構成を聞かれるので、linux、Java 8を選びました。

続いて手動でappSettingsを追加します。ポートはVert.xのコードにある通り8888にしました。

```xml
<plugins> 
  <plugin> 
    <groupId>com.microsoft.azure</groupId>  
    <artifactId>azure-webapp-maven-plugin</artifactId>  
    <version>1.14.0</version>  
    <configuration> 
      <schemaVersion>v2</schemaVersion>  
      <subscriptionId>xxxxx</subscriptionId>  
      <resourceGroup>demo-xxxxxxxxxxx-rg</resourceGroup>  
      <appName>demo-xxxxxxxxxx</appName>  
      <pricingTier>P1v2</pricingTier>  
      <region>westeurope</region>  
      <runtime> 
        <os>Linux</os>  
        <javaVersion>Java 8</javaVersion>  
        <webContainer>Java SE</webContainer> 
      </runtime>  
      <appSettings> 
        <property> 
          <name>PORT</name>  
          <value>8888</value> 
        </property>  
        <property> 
          <name>WEBSITES_PORT</name>  
          <value>8888</value> 
        </property>  
        <property> 
          <name>WEBSITES_CONTAINER_START_TIME_LIMIT</name>  
          <value>900</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フレームワークでもAzure App Service上で動きそうです。

![スクリーンショット 2021-05-01 20.04.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/c29257f3-399c-7183-aee0-5733efbe84fe.png)