次の方法で共有


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

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

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

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

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

データ ソースの構成

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

  1. App Service ページの [構成] セクションに文字列の名前を設定し、JDBC 接続文字列を値フィールドに貼り付けて、タイプを [カスタム] に設定します。 必要に応じて、この接続文字列をスロット設定として設定することができます。

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

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

    app.datasource.url=${CUSTOMCONNSTR_exampledb}
    

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

ヒント

Linux Tomcat コンテナーでは、環境変数 WEBSITE_AUTOCONFIGURE_DATABASEtrue に設定することで、Tomcat サーバー内の共有データ ソースを自動的に構成できます。 そのための操作は、有効な JDBC 接続文字列を含むアプリ設定を Oracle、SQL Server、PostgreSQL、または MySQL データベース (接続資格情報を含む) に追加することだけです。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 の [構成]>[アプリケーション設定] ページで環境変数を設定します。

次に、データ ソースを Tomcat サーブレットで実行されている 1 つのアプリケーション、またはすべてのアプリケーションのどちらに対して使用可能にする必要があるかを判定します。

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

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

  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 の構成ファイルに対する変更は、次のようにプログラムで適用する必要があります。

  1. スタートアップ スクリプトをアップロードし、[構成]>[スタートアップ コマンド] でスクリプトへのパスを設定します。 FTP を使用してスタートアップ スクリプトをアップロードできます。

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

# 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's 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>

構成を完了する

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

  1. 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 サーバーで共有データ ソースを自動的に構成できます。 唯一の操作は、Oracle、SQL Server、PostgreSQL、または MySQL データベース (接続資格情報を含む) に有効な JDBC 接続文字列を含むアプリ設定を追加し、WEBSITE_AUTOCONFIGURE_DATABASE値を含むアプリ設定/環境変数trueを追加することです。 Service Connector で作成された 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、SQL Database を例として使用します。

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

  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 サーバーに追加されたことを確認するには、webapp に SSH で接続して、$JBOSS_HOME/bin/jboss-cli.sh --connect を実行します。 JBoss に接続したら、/subsystem=datasources:read-resource を実行してデータ ソースの一覧を表示します。

jboss-cli-commands.cli で以前から定義されているように JNDI 名 java:jboss/datasources/postgresDS を使用して PostgreSQL 接続にアクセスできます。

Java 開発者向けの Azure センターにアクセスして、Azure クイック スタート、チュートリアル、および Java リファレンス ドキュメントを入手してください。