MySQL を使用して Spring アプリを App Service にデプロイする

Note

Spring アプリケーションの場合は、Azure Spring Apps を使用することをお勧めします。 ただし、Azure App Service は引き続き宛先として使用できます。 詳細については、「Java アプリケーションをデプロイするために適切な Azure サービスを選択する」を参照してください 。

このチュートリアルでは、App Service Linux で Java Web アプリをビルド、構成、デプロイ、トラブルシューティング、およびスケールするプロセスについて説明します。

このチュートリアルは、一般的な Spring PetClinic サンプル アプリに基づいています。 このトピックでは、HSQLDB バージョンのアプリをローカルでテストし、Azure App Service にデプロイします。 その後、Azure Database for MySQL を使用するバージョンを構成して展開します。 最後に、アプリのログにアクセスし、アプリを実行するワーカーの数を増増やしてスケールアウトする方法について説明します。

前提条件

サンプルを入手する

サンプル アプリを使い始める場合は、次のコマンドを使用してソース リポジトリを複製し、準備します。

git clone https://github.com/spring-petclinic/spring-framework-petclinic.git
cd spring-framework-petclinic

HSQLDB サンプルをローカルでビルドして実行する

まず、HSQLDB をデータベースとして使用して、サンプルをローカルでテストします。

サンプル アプリの HSQLDB バージョンをビルドします。

mvn package

次に、TOMCAT_HOME 環境変数を Tomcat のインストール場所に設定します。

export TOMCAT_HOME=<Tomcat install directory>

次に、WAR ファイルをデプロイするための pom.xml ファイルを更新します。 次の XML を既存の <plugins> 要素の子として追加します。 必要に応じて、1.9.11Cargo Maven 3 プラグインの最新バージョンに変更します。

<plugin>
    <groupId>org.codehaus.cargo</groupId>
    <artifactId>cargo-maven3-plugin</artifactId>
    <version>1.9.11</version>
    <configuration>
        <container>
            <containerId>tomcat9x</containerId>
            <type>installed</type>
            <home>${TOMCAT_HOME}</home>
        </container>
        <configuration>
            <type>existing</type>
            <home>${TOMCAT_HOME}</home>
        </configuration>
        <deployables>
            <deployable>
                <groupId>${project.groupId}</groupId>
                <artifactId>${project.artifactId}</artifactId>
                <type>war</type>
                <properties>
                    <context>/</context>
                </properties>
            </deployable>
        </deployables>
    </configuration>
</plugin>

この構成を使用すると、ローカルでアプリを Tomcat に展開できます。

mvn cargo:deploy

次に、Tomcat を起動します。

${TOMCAT_HOME}/bin/catalina.sh run

これで、ブラウザーで http://localhost:8080 に移動して実行中のアプリを表示し、動作を確認できるようになりました。 完了したら、Bash プロンプトで Ctrl + C キーを押して Tomcat を停止します。

Azure App Service にデプロイする

ローカルで動作することを確認したので、次はアプリを Azure にデプロイします。

まず、次の環境変数を設定します。 REGION については、West US 2 を使用するか、こちらで見つけることができる他のリージョンを使用します。

export RESOURCEGROUP_NAME=<resource group>
export WEBAPP_NAME=<web app>
export WEBAPP_PLAN_NAME=${WEBAPP_NAME}-appservice-plan
export REGION=<region>

Maven では、指定した名前で Azure リソースを作成するためにこれらの値が使用されます。 環境変数を使用すると、プロジェクト ファイルのアカウントのシークレットを保持することができます。

次に、pom.xml ファイルを更新して、Azure へのデプロイ用に Maven を構成します。 以前に追加した <plugin> 要素の後に、次の XML を追加します。 必要に応じて、2.5.0Azure App Service 用 Maven プラグインの最新バージョンに変更します。

<plugin>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>azure-webapp-maven-plugin</artifactId>
  <version>2.5.0</version>
  <configuration>
    <schemaVersion>v2</schemaVersion>
    <subscriptionId>${SUBSCRIPTION_ID}</subscriptionId>
    <resourceGroup>${RESOURCEGROUP_NAME}</resourceGroup>
    <appName>${WEBAPP_NAME}</appName>
    <region>${REGION}</region>
    <pricingTier>P1v2</pricingTier>
    <runtime>
      <os>Linux</os>
      <javaVersion>Java 8</javaVersion>
      <webContainer>TOMCAT 9.0</webContainer>
    </runtime>
    <deployment>
      <resources>
        <resource>
          <directory>${project.basedir}/target</directory>
          <includes>
            <include>*.war</include>
          </includes>
        </resource>
      </resources>
    </deployment>
  </configuration>
</plugin>

次に、Azure にサインインします。

az login

次に、アプリを App Service Linux にデプロイします。

mvn azure-webapp:deploy

これで、(https://<app-name>.azurewebsites.net を置換した後に) <app-name> に移動して実行中のアプリを表示できるようになりました。

Azure Database for MySQL の設定

次に、HSQLDB ではなく MySQL を使用するように切り替えます。 Azure 上で MySQL サーバー インスタンスを作成し、データベースを追加した後、新しいデータベース接続情報を使用してアプリの構成を更新します。

まず、後の手順で使用するために、次の環境変数を設定します。

export MYSQL_SERVER_NAME=<server>
export MYSQL_SERVER_FULL_NAME=${MYSQL_SERVER_NAME}.mysql.database.azure.com
export MYSQL_SERVER_ADMIN_LOGIN_NAME=<admin>
export MYSQL_SERVER_ADMIN_PASSWORD=<password>
export MYSQL_DATABASE_NAME=<database>
export DOLLAR=\$

次に、データベース サーバーを作成して初期化します。 初期構成には az mysql up を使用します。 次に、az mysql server configuration set を使用して接続タイムアウトを増やし、サーバーのタイムゾーンを設定します。

az extension add --name db-up

az mysql up \
    --resource-group ${RESOURCEGROUP_NAME} \
    --server-name ${MYSQL_SERVER_NAME} \
    --database-name ${MYSQL_DATABASE_NAME} \
    --admin-user ${MYSQL_SERVER_ADMIN_LOGIN_NAME} \
    --admin-password ${MYSQL_SERVER_ADMIN_PASSWORD}

az mysql server configuration set --name wait_timeout \
    --resource-group ${RESOURCEGROUP_NAME} \
    --server ${MYSQL_SERVER_NAME} --value 2147483

az mysql server configuration set --name time_zone \
    --resource-group ${RESOURCEGROUP_NAME} \
    --server ${MYSQL_SERVER_NAME} --value=-8:00

次に、MySQL CLI を使用して Azure 上のデータベースに接続します。

mysql -u ${MYSQL_SERVER_ADMIN_LOGIN_NAME}@${MYSQL_SERVER_NAME} \
 -h ${MYSQL_SERVER_FULL_NAME} -P 3306 -p

MySQL CLI プロンプトで次のコマンドを実行して、MYSQL_DATABASE_NAME 環境変数に以前に指定したのと同じ値で名前が付けられたデータベースを確認します。

show databases;

これで MySQL を使用する準備ができました。

MySQL 用にアプリを構成する

次に、MySQL バージョンのアプリに接続情報を追加し、App Service にデプロイします。

pom.xml ファイルを更新して、MySQL をアクティブな構成にします。 次に示すように、H2 プロファイルから <activation> 要素を削除し、代わりに MySQL プロファイルに配置します。 スニペットの残りの部分は、既存の構成を示しています。 以前に設定した環境変数が、Maven によって MySQL アクセスの構成にどのように使用されているかに注目してください。

<profile>
    <id>MySQL</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <db.script>mysql</db.script>
        <jpa.database>MYSQL</jpa.database>
        <jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>
        <jdbc.url>jdbc:mysql://${DOLLAR}{MYSQL_SERVER_FULL_NAME}:3306/${DOLLAR}{MYSQL_DATABASE_NAME}?useUnicode=true</jdbc.url>
        <jdbc.username>${DOLLAR}{MYSQL_SERVER_ADMIN_LOGIN_NAME}@${DOLLAR}{MYSQL_SERVER_FULL_NAME}</jdbc.username>
        <jdbc.password>${DOLLAR}{MYSQL_SERVER_ADMIN_PASSWORD}</jdbc.password>
    </properties>
    ...
</profile>

次に、pom.xml ファイルを構成して、Azure のデプロイと MySQL の使用のために Maven を構成します。 以前に追加した <plugin> 要素の後に、次の XML を追加します。 必要に応じて、2.5.0Azure App Service 用 Maven プラグインの最新バージョンに変更します。

<plugin>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>azure-webapp-maven-plugin</artifactId>
  <version>2.5.0</version>
  <configuration>
    <schemaVersion>v2</schemaVersion>
    <subscriptionId>${SUBSCRIPTION_ID}</subscriptionId>
    <resourceGroup>${RESOURCEGROUP_NAME}</resourceGroup>
    <appName>${WEBAPP_NAME}</appName>
    <region>${REGION}</region>
    <pricingTier>P1v2</pricingTier>
    <runtime>
      <os>Linux</os>
      <javaVersion>Java 8</javaVersion>
      <webContainer>TOMCAT 9.0</webContainer>
    </runtime>
    <appSettings>
      <property>
        <name>MYSQL_SERVER_FULL_NAME</name>
        <value>${MYSQL_SERVER_FULL_NAME}</value>
      </property>
      <property>
        <name>MYSQL_SERVER_ADMIN_LOGIN_NAME</name>
        <value>${MYSQL_SERVER_ADMIN_LOGIN_NAME}</value>
      </property>
      <property>
        <name>MYSQL_SERVER_ADMIN_PASSWORD</name>
        <value>${MYSQL_SERVER_ADMIN_PASSWORD}</value>
      </property>
      <property>
        <name>MYSQL_DATABASE_NAME</name>
        <value>${MYSQL_DATABASE_NAME}</value>
      </property>
    </appSettings>
    <deployment>
      <resources>
        <resource>
          <directory>${project.basedir}/target</directory>
          <includes>
            <include>*.war</include>
          </includes>
        </resource>
      </resources>
    </deployment>
  </configuration>
</plugin>

次に、アプリをビルドし、ローカルで展開し、Tomcat で実行してテストします。

mvn package
mvn cargo:deploy
${TOMCAT_HOME}/bin/catalina.sh run

これで、http://localhost:8080 のローカルでアプリを表示できるようになりました。 アプリは前と同様に動作しますが、HSQLDB ではなく Azure Database for MySQL を使用します。 完了したら、Bash プロンプトで Ctrl + C キーを押して Tomcat を停止します。

最後に、アプリを App Service にデプロイします。

mvn azure-webapp:deploy

これで、https://<app-name>.azurewebsites.net に移動し、App Service と Azure Database for MySQL を使用して実行中のアプリを表示できるようになりました。

アプリのログにアクセスする

トラブルシューティングが必要な場合は、アプリのログを確認できます。 ローカル コンピューター上でリモート ログ ストリームを開くには、次のコマンドを使用します。

az webapp log tail --name ${WEBAPP_NAME} \
    --resource-group ${RESOURCEGROUP_NAME}

ログの表示が終了したら、Ctrl + C キーを押してストリームを停止します。

ログ ストリームは、https://<app-name>.scm.azurewebsites.net/api/logstream でも使用できます。

スケール アウト

アプリへのトラフィックの増加をサポートするために、次のコマンドを使用して複数のインスタンスにスケールアウトできます。

az appservice plan update --number-of-workers 2 \
    --name ${WEBAPP_PLAN_NAME} \
    --resource-group ${RESOURCEGROUP_NAME}

お疲れさまでした。 Spring Framework、JSP、Spring Data、Hibernate、JDBC、App Service Linux、および Azure Database for MySQL を使用して Java Web アプリをビルドし、スケールアウトしました。

リソースをクリーンアップする

前のセクションでは、リソース グループに Azure リソースを作成しました。 これらのリソースを今後使用する予定がない場合は、次のコマンドを実行してリソース グループを削除します。

az group delete --name ${RESOURCEGROUP_NAME}

次のステップ

次は、App Service で Java に使用できるその他の構成オプションと CI/CD オプションを確認します。