Azure App Service で Tomcat、JBoss、または Java SE アプリのデータ ソースを構成する

この記事では、App Service で Java SE、Tomcat、または JBoss アプリでデータ ソースを構成する方法について説明します。

Azure App Service は、フル マネージド サービスで次の 3 種類の Java Web アプリケーションを実行します。

  • Java Standard Edition (SE)。 Java SE では、Spring Boot、Quarkus、Dropwizard などの埋め込みサーバーを含む Java アーカイブ (JAR) パッケージとしてデプロイされたアプリ、または Tomcat または Jetty サーバーが埋め込まれたアプリを実行できます。
  • Tomcat。 組み込みの Tomcat サーバーは、Web アプリケーション アーカイブ (WAR) パッケージとしてデプロイされたアプリを実行できます。
  • JBoss Enterprise Application Platform (EAP): 組み込みの JBoss EAP サーバーは、WAR またはエンタープライズ アーカイブ (EAR) パッケージとしてデプロイされたアプリを実行できます。 このオプションは、Free、Premium v3、Isolated v2 を含む一連の価格レベルの Linux アプリでサポートされています。

JBoss EAP on App Service では、ライセンス持ち込み (BYOL) の課金がサポートされるようになりました。 BYOL を使用すると、既存の Red Hat サブスクリプションをお持ちのお客様は、これらのライセンスを Azure App Service 上の JBoss EAP デプロイに直接適用できます。 詳細については、 App Service での JBoss EAP の BYOL サポートを参照してください。

データ ソースの構成

Spring Boot アプリケーション内のデータ ソースに接続するには、接続文字列を作成し、それらを application.properties ファイルに挿入することをお勧めします。

  1. [App Service] ページの左側のウィンドウで、[設定]>[環境変数] を選択します。 [ 接続文字列 ] タブで、[ 追加] を選択します。 文字列の 名前 を設定し、JDBC 接続文字列を [値 ] フィールドに貼り付けて、[ 種類][カスタム] に設定します。 必要に応じて、接続文字列をスロット設定として設定できます。

    接続文字列は、 CUSTOMCONNSTR_<your-string-name>という名前の環境変数としてアプリケーションからアクセスできます。 たとえば、CUSTOMCONNSTR_exampledb のようにします。

  2. application.properties ファイルで、環境変数の名前で接続文字列を参照します。 前の例では、次のコードを使用します。

    app.datasource.url=${CUSTOMCONNSTR_exampledb}
    

詳細については、データ アクセスと外部化された構成に関する Spring Boot のドキュメントを参照してください。

ヒント

環境変数 WEBSITE_AUTOCONFIGURE_DATABASEtrue に設定すると、Linux Tomcat コンテナーで Tomcat サーバー内の共有データ ソースを自動的に構成できます。 唯一の操作は、Oracle、SQL Server、PostgreSQL、または MySQL データベース (接続資格情報を含む) に有効な JDBC 接続文字列を含むアプリ設定を追加することです。 App Service は、コンテナーで使用可能な適切なドライバーを使用して、対応する共有データベースを /usr/local/tomcat/conf/context.xmlに自動的に追加します。 このアプローチを使用するエンド ツー エンドのシナリオについては、「 チュートリアル: Azure App Service on Linux および MySQL を使用して Tomcat Web アプリを構築する」を参照してください。

これらの説明は、すべてのデータベース接続に適用されます。 プレースホルダーは、選択したデータベースのドライバー クラス名と JAR ファイルに置き換える必要があります。 次の表に、共通データベースのクラス名とドライバーのダウンロードを示します。

データベース ドライバー クラス名 JDBC ドライバー
PostgreSQL org.postgresql.Driver ダウンロード
MySQL com.mysql.jdbc.Driver ダウンロード ( [プラットフォームに依存しない] を選択します)。
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver ダウンロード

Java Database Connectivity (JDBC) または Java Persistence API (JPA) を使用するように Tomcat を構成するには、最初に起動時に Tomcat によって読み込まれる CATALINA_OPTS 環境変数をカスタマイズします。 App Service Maven プラグインのアプリ設定を使用して、この値を設定します。

<appSettings>
    <property>
        <name>CATALINA_OPTS</name>
        <value>"$CATALINA_OPTS -Ddbuser=${DBUSER} -Ddbpassword=${DBPASSWORD} -DconnURL=${CONNURL}"</value>
    </property>
</appSettings>

または、Azure portal の [Settings>]\(環境変数\) ページの [アプリ設定] タブで環境変数を設定します。

次に、データ ソースを 1 つのアプリケーションで使用するか、Tomcat サーブレットで実行されているすべてのアプリケーションで使用できるかを判断します。

アプリケーション レベル データ ソース

アプリケーション レベルのデータ ソースを構成するには:

  1. プロジェクトの META-INF/ ディレクトリ内に context.xml ファイルを作成します。 META-INF/ ディレクトリが存在しない場合は作成します。

  2. context.xml で、Context 要素を追加してデータ ソースを JNDI アドレスにリンクします。 driverClassName プレースホルダーを、この記事の前半に示したテーブルのドライバーのクラス名に置き換えます。

    <Context>
        <Resource
            name="jdbc/dbconnection"
            type="javax.sql.DataSource"
            url="${connURL}"
            driverClassName="<insert your driver class name>"
            username="${dbuser}"
            password="${dbpassword}"
        />
    </Context>
    
  3. アプリケーションでこのデータ ソースを使用するよう、アプリケーションの web.xml を更新します。

    <resource-env-ref>
        <resource-env-ref-name>jdbc/dbconnection</resource-env-ref-name>
        <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
    </resource-env-ref>
    

共有のサーバーレベル リソース

ヒント

Linux Tomcat コンテナーは、 /home/site/wwwrootにコピーされたファイルに対して次の規則を使用して XSLT ファイルを自動的に適用できます。 server.xml.xsl または server.xml.xslt が存在する場合、ファイルは Tomcat の server.xmlに適用されます。 context.xml.xslまたはcontext.xml.xsltが存在する場合、ファイルは Tomcat のcontext.xmlに適用されます。

共有サーバー レベルのデータ ソースを追加するには、Tomcat の server.xmlを編集する必要があります。 /home ディレクトリの外部にあるファイルの変更は一時的なものであるため、Tomcat の構成ファイルに対する変更は、次のようにプログラムで適用する必要があります。

  • スタートアップ スクリプトをアップロードし、Settings>Configuration でスクリプトへのパスを設定します。 [ スタック設定 ] タブで、[ スタートアップ] コマンド ボックスにパスを追加します。 FTP を使用してスタートアップ スクリプトをアップロードできます。

スタートアップ スクリプトは、 XSL 変換server.xml ファイルに変換し、結果の XML ファイルを /usr/local/tomcat/conf/server.xmlに出力します。 スタートアップ スクリプトは、次のサンプル スクリプトのコメントに示すように、Web アプリlibxsltに応じて、xlstprocまたはをインストールする必要があります。 FTP を使用して、XSL ファイルとスタートアップ スクリプトをアップロードできます。

# Install the libxslt package on Alpine-based images:
apk add --update libxslt

# Install the xsltproc package on Debian or Ubuntu-based images:
apt install xsltproc

# Also copy the transform file to /home/tomcat/conf/
# Usage: xsltproc --output output.xml style.xsl input.xml
xsltproc --output /home/tomcat/conf/server.xml /home/tomcat/conf/transform.xsl /usr/local/tomcat/conf/server.xml

次の XSL ファイルの例では、新しいコネクタ ノードを Tomcat server.xml に追加します。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@* | node()" name="Copy">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@* | node()" mode="insertConnector">
    <xsl:call-template name="Copy" />
  </xsl:template>

  <xsl:template match="comment()[not(../Connector[@scheme = 'https']) and
                                 contains(., '&lt;Connector') and
                                 (contains(., 'scheme=&quot;https&quot;') or
                                  contains(., &quot;scheme='https'&quot;))]">
    <xsl:value-of select="." disable-output-escaping="yes" />
  </xsl:template>

  <xsl:template match="Service[not(Connector[@scheme = 'https'] or
                                   comment()[contains(., '&lt;Connector') and
                                             (contains(., 'scheme=&quot;https&quot;') or
                                              contains(., &quot;scheme='https'&quot;))]
                                  )]
                      ">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" mode="insertConnector" />
    </xsl:copy>
  </xsl:template>

  <!-- Add the new connector after the last existing connector if there is one -->
  <xsl:template match="Connector[last()]" mode="insertConnector">
    <xsl:call-template name="Copy" />

    <xsl:call-template name="AddConnector" />
  </xsl:template>

  <!-- ... or before the first engine if there's no existing connector -->
  <xsl:template match="Engine[1][not(preceding-sibling::Connector)]"
                mode="insertConnector">
    <xsl:call-template name="AddConnector" />

    <xsl:call-template name="Copy" />
  </xsl:template>

  <xsl:template name="AddConnector">
    <!-- Add new line -->
    <xsl:text>&#xa;</xsl:text>
    <!-- This is the new connector -->
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
               maxThreads="150" scheme="https" secure="true" 
               keystoreFile="${{user.home}}/.keystore" keystorePass="changeit"
               clientAuth="false" sslProtocol="TLS" />
  </xsl:template>

</xsl:stylesheet>

構成を完了する

最後に、Tomcat クラスパスにドライバー JAR を配置し、App Service アプリを再起動します。

  • JDBC ドライバー ファイルが Tomcat クラスローダーで確実に使用できるように、これらのファイルを /home/site/lib ディレクトリに配置します。 Cloud Shell で、ドライバー JAR ごとに az webapp deploy --type=lib を実行します。
az webapp deploy --resource-group <group-name> --name <app-name> --src-path <jar-name>.jar --type=lib --path <jar-name>.jar

サーバー レベルのデータ ソースを作成した場合は、App Service Linux アプリケーションを再起動します。 Tomcat は CATALINA_BASE/home/tomcat にリセットし、更新された構成を使用します。

ヒント

既定では、Linux JBoss コンテナーは、JBoss サーバー内の共有データ ソースを自動的に構成できます。 実行する必要があるのは、有効な JDBC 接続文字列を含むアプリ設定を Oracle、SQL Server、PostgreSQL、または MySQL データベース (接続資格情報を含む) に追加し、WEBSITE_AUTOCONFIGURE_DATABASE値を含むアプリ設定/環境変数trueを追加することです。 サービス コネクタを使用して作成された JDBC 接続もサポートされています。 App Service は、コンテナーで使用可能な適切なドライバーを使用して、対応する共有データ ソース (アプリ設定名とサフィックス _DSに基づいて) を自動的に追加します。 このアプローチを使用するエンド ツー エンドのシナリオについては、「 チュートリアル: Azure App Service on Linux および MySQL を使用して JBoss Web アプリを構築する」を参照してください。

JBoss EAP にデータ ソースを登録するには、主に次の 3 つの手順があります。

  1. JDBC ドライバーをアップロードします。
  2. JDBC ドライバーをモジュールとして追加します。
  3. モジュールを使用してデータ ソースを追加します。

App Service はステートレス ホスティング サービスであるため、これらの手順をスタートアップ スクリプトに配置し、JBoss コンテナーが起動するたびに実行する必要があります。 PostgreSQL、MySQL、Azure SQL Database の例を次に示します。

JBoss EAP on App Service では、持ち込みライセンス (BYOL) の使用料に対応しています。 BYOL を使用すると、既存の Red Hat サブスクリプションをお持ちのお客様は、これらのライセンスを Azure App Service 上の JBoss EAP デプロイに直接適用できます。 詳細については、 JBoss EAP の BYOL サポートを参照してください。

  1. JBoss CLI コマンドを jboss-cli-commands.cli という名前のファイルに置きます。 JBoss コマンドを使用して、モジュールを追加し、データ ソースとして登録する必要があります。 次の例は、JNDI 名 java:jboss/datasources/postgresDS を持つ PostgreSQL データ ソースを作成するための JBoss CLI コマンドを示しています。

    module add --name=org.postgresql --resources=/home/site/libs/postgresql-42.7.4.jar
    /subsystem=datasources/jdbc-driver=postgresql:add(driver-name="postgresql",driver-module-name="org.postgresql",driver-class-name="org.postgresql.Driver",driver-xa-datasource-class-name="org.postgresql.xa.PGXADataSource")
    data-source add --name=postgresql --driver-name="postgresql" --jndi-name="java:jboss/datasources/postgresDS" --connection-url="jdbc:postgresql://\${env.DB_HOST}:5432/postgres" --user-name="\${env.DB_USERNAME}" --password="\${env.DB_PASSWORD}" --enabled=true --use-java-context=true
    

    module add コマンドでは 3 つの環境変数 (DB_HOSTDB_USERNAME、および DB_PASSWORD) が使用されることに注意してください。この環境変数は、App Service でアプリ設定として追加する必要があります。 JBoss が値をプレーンテキストで保存しないように、スクリプトは --resolve-parameter-values フラグなしでそれらを追加します。

  2. JBoss CLI コマンドを呼び出すスタートアップ スクリプト startup.sh を作成します。 次の例は、 jboss-cli-commands.cli ファイルを呼び出す方法を示しています。 後で、コンテナーの起動時にこのスクリプトを実行するように App Service を構成します。

    $JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/scripts/jboss-cli-commands.cli
    
  3. 任意のデプロイ オプションを使用して、JDBC ドライバー、 jboss-cli-commands.clistartup.sh をそれぞれのスクリプトで指定されたパスにアップロードします。 startup.sh をスタートアップ ファイルとしてアップロードします。 次に例を示します。

    export RESOURCE_GROUP_NAME=<resource-group-name>
    export APP_NAME=<app-name>
    
    # The lib type uploads to /home/site/libs by default.
    az webapp deploy --resource-group $RESOURCE_GROUP_NAME --name $APP_NAME --src-path postgresql-42.7.4.jar --target-path postgresql-42.7.4.jar --type lib
    az webapp deploy --resource-group $RESOURCE_GROUP_NAME --name $APP_NAME --src-path jboss-cli-commands.cli --target-path /home/site/scripts/jboss-cli-commands.cli --type static
    # The startup type uploads to /home/site/scripts/startup.sh by default.
    az webapp deploy --resource-group $RESOURCE_GROUP_NAME --name $APP_NAME --src-path startup.sh --type startup
    

    詳細については、「App Service へのファイルのデプロイ」を参照してください。

データ ソースが JBoss サーバーに追加されたことを確認するには、Web アプリに SSH 接続し、 $JBOSS_HOME/bin/jboss-cli.sh --connect実行します。 JBoss に接続したら、 /subsystem=datasources:read-resource を実行してデータ ソースの一覧を出力します。

jboss-cli-commands.cli の定義に従って、JNDI 名java:jboss/datasources/postgresDSを使用して PostgreSQL 接続にアクセスできます。