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


先日、JavaのWebフレームワーク「Helidon」をAzure App Serviceで動かしました。今日は「Quarkus」を試します。

ローカル環境での実行

Helidonのときと同じ環境を使いました。

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

FROM maven:3.8.1-openjdk-11

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

今回もMicroProfile Starterでプロジェクトの雛形を作りました。

ビルドします。

mvn clean package

実行します。

java -jar target/demo.jar

以下の表示になりました。

Azureでの実行

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

az login

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

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

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

mvn com.microsoft.azure:azure-webapp-maven-plugin:1.13.0:config

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

最初このままデプロイしたところ、Quarkusがうまく起動せず以下のエラーがログに出ていました。

Caused by: java.lang.ClassNotFoundException: io.quarkus.runtime.Quarkus

調べたところ以下の情報がありました。

いまいちよくわかっていないのですが、Fat Jarになっていないっぽい?application.propertiesに以下を追加することで無事にAzure上でQuarkusが起動しました。

quarkus.package.uber-jar=true

あとは手でappSettingsを追加しています。これがないとQuarkusは起動しているけど発行されたURLにアクセスできませんでした。

<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>8080</value> 
        </property>  
        <property> 
          <name>WEBSITES_PORT</name>  
          <value>8080</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> 

無事にローカル環境と同じように表示されました。