次の方法で共有


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

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

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

  • Java SE - 埋め込みサーバー (Spring Boot、Dropwizard、Quarkus、埋め込み Tomcat または Jetty サーバーを含むアプリ) を含む JAR パッケージとしてデプロイされたアプリを実行できます。
  • Tomcat - 組み込みの Tomcat サーバーは、WAR パッケージとしてデプロイされたアプリを実行できます。
  • JBoss EAP - Premium v3 および Isolated v2 価格レベルでのみ Linux アプリでサポートされます。 組み込みの JBoss EAP サーバーは、WAR または EAR パッケージとしてデプロイされたアプリを実行できます。

Note

Spring アプリケーションの場合は、Azure Spring Apps を使用することをお勧めします。 ただし、Azure App Service は引き続き宛先として使用できます。 アドバイスについてはJava ワークロード宛先ガイダンスに関する記事を参照してください。

データ ソースの構成

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 コンテナーは 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>
    

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

インストール場所は読み取り専用であるため、サーバー全体の構成用に Tomcat のインストールを直接変更することはできません。 Windows Tomcat のインストールにサーバー レベルの構成を変更する最も簡単な方法は、アプリの起動時に次の操作を行うことです。

  1. Tomcat をローカル ディレクトリ (%LOCAL_EXPANDED%) にコピーし、CATALINA_BASE として使用します (この変数については、Tomcat のドキュメントを参照してください)。
  2. XSL 変換を使用して、共有データ ソースを %LOCAL_EXPANDED%\tomcat\conf\server.xml に追加します。

スタートアップ ファイルを追加する

startup.cmd %HOME%\site\wwwroot ディレクトリという名前のファイルを作成します。 このファイルは、Tomcat サーバーが起動する前に自動的に実行されます。 ファイルの内容は次のとおりです。

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File  %HOME%\site\configure.ps1

PowerShell 構成スクリプトを追加する

次に、次のコードを使用して、configure.ps1 という構成スクリプトを %HOME%_\site ディレクトリに追加します。

# Locations of xml and xsl files
$target_xml="$Env:LOCAL_EXPANDED\tomcat\conf\server.xml"
$target_xsl="$Env:HOME\site\server.xsl"

# Define the transform function
# Useful if transforming multiple files
function TransformXML{
    param ($xml, $xsl, $output)

    if (-not $xml -or -not $xsl -or -not $output)
    {
        return 0
    }

    Try
    {
        $xslt_settings = New-Object System.Xml.Xsl.XsltSettings;
        $XmlUrlResolver = New-Object System.Xml.XmlUrlResolver;
        $xslt_settings.EnableScript = 1;

        $xslt = New-Object System.Xml.Xsl.XslCompiledTransform;
        $xslt.Load($xsl,$xslt_settings,$XmlUrlResolver);
        $xslt.Transform($xml, $output);
    }

    Catch
    {
        $ErrorMessage = $_.Exception.Message
        $FailedItem = $_.Exception.ItemName
        echo  'Error'$ErrorMessage':'$FailedItem':' $_.Exception;
        return 0
    }
    return 1
}

# Start here

# Check for marker file indicating that config has already been done
if(Test-Path "$Env:LOCAL_EXPANDED\tomcat\config_done_marker"){
    return 0
}

# Delete previous Tomcat directory if it exists
# In case previous config isn't completed or a new config should be forcefully installed
if(Test-Path "$Env:LOCAL_EXPANDED\tomcat"){
    Remove-Item "$Env:LOCAL_EXPANDED\tomcat" Recurse
}

md -Path "$Env:LOCAL_EXPANDED\tomcat"

# Copy Tomcat to local
# Using the environment variable $AZURE_TOMCAT90_HOME uses the 'default' version of Tomcat
New-Item "$Env:LOCAL_EXPANDED\tomcat" -ItemType Directory
Copy-Item -Path "$Env:AZURE_TOMCAT90_HOME\*" "$Env:LOCAL_EXPANDED\tomcat" -Recurse

# Perform the required customization of Tomcat
$success = TransformXML -xml $target_xml -xsl $target_xsl -output $target_xml

# Mark that the operation was a success if successful
if($success){
    New-Item -Path "$Env:LOCAL_EXPANDED\tomcat\config_done_marker" -ItemType File
}

この PowerShell では、次の手順が完了します。

  1. カスタム Tomcat コピーが既に存在するかどうかを確認します。 そうなっている場合は、ここでスタートアップ スクリプトを終了できます。
  2. Tomcat をローカルにコピーします。
  3. XSL 変換を使用して、カスタム Tomcat の構成に共有データ ソースを追加します。
  4. 構成が正常に完了したことを示します。

XSL 変換ファイルを追加する

組み込みの Tomcat のインストールをカスタマイズするための一般的なユース ケースは、server.xmlcontext.xml、または web.xml Tomcat 構成ファイルを変更することです。 App Service では、プラットフォーム機能を提供するために、既にこれらのファイルを変更しています。 これらの機能を引き続き使用するには、これらのファイルを変更するときに、そこに含まれている内容を保持することが重要です。 これを実現するには、XSL 変換 (XSLT) を使用します。

configure.ps1 という XSL 変換ファイルを %HOME%_\site ディレクトリに追加します。 次の XSL 変換コードを使用して、新しいコネクタ ノードを server.xml に追加できます。 先頭の ID 変換は、構成ファイルの元の内容を保持します。

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

    <!-- Identity transform: this ensures that the original contents of the file are included in the new file -->
    <!-- Ensure that your transform files include this block -->
    <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 Connnector 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>

CATALINA_BASE アプリ設定を設定する

プラットフォームでは、カスタム バージョンの Tomcat がインストールされている場所も認識している必要があります。 インストールの場所は、CATALINA_BASE のアプリ設定で設定できます。

この設定は、次のように、Azure CLI を使用して変更できます。

    az webapp config appsettings set -g $MyResourceGroup -n $MyUniqueApp --settings CATALINA_BASE="%LOCAL_EXPANDED%\tomcat"

または、次のように、この設定を Azure portal で手動で変更できます。

  1. [設定]>[構成]>[アプリケーションの設定] の順に移動します。
  2. [新しいアプリケーション設定] を選択します。
  3. 次の値を使用して設定を作成します。
    1. 名前: CATALINA_BASE
    2. : "%LOCAL_EXPANDED%\tomcat"

構成を完了する

最後に、ドライバーの JAR を Tomcat クラスパス内に配置し、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 --target-path <jar-name>.jar

JBoss EAP を使用してデータ ソースを登録する場合の 3 つの主要なステップは、JDBC ドライバーのアップロード、モジュールとしての JDBC ドライバーの追加、モジュールの登録です。 App Service はステートレスのホスティング サービスであるため、データ ソース モジュールを追加および登録するための構成コマンドは、スクリプト化して、コンテナーの起動時に適用する必要があります。

  1. データベースの JDBC ドライバーを入手します。

  2. JDBC ドライバー用の XML モジュール定義ファイルを作成します。 PostgreSQL のモジュール定義の例を以下に示します。

    <?xml version="1.0" ?>
    <module xmlns="urn:jboss:module:1.1" name="org.postgres">
        <resources>
        <!-- ***** IMPORTANT : REPLACE THIS PLACEHOLDER *******-->
        <resource-root path="/home/site/deployments/tools/postgresql-42.2.12.jar" />
        </resources>
        <dependencies>
            <module name="javax.api"/>
            <module name="javax.transaction.api"/>
        </dependencies>
    </module>
    
  3. JBoss CLI コマンドが含まれる jboss-cli-commands.cli という名前のファイルを作成します。 JBoss コマンドを使用して、モジュールを追加し、データ ソースとして登録する必要があります。 次の例では、PostgreSQL 用の JBoss CLI コマンドを示します。

    #!/usr/bin/env bash
    module add --name=org.postgres --resources=/home/site/deployments/tools/postgresql-42.2.12.jar --module-xml=/home/site/deployments/tools/postgres-module.xml
    
    /subsystem=datasources/jdbc-driver=postgres:add(driver-name="postgres",driver-module-name="org.postgres",driver-class-name=org.postgresql.Driver,driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource)
    
    data-source add --name=postgresDS --driver-name=postgres --jndi-name=java:jboss/datasources/postgresDS --connection-url=${POSTGRES_CONNECTION_URL,env.POSTGRES_CONNECTION_URL:jdbc:postgresql://db:5432/postgres} --user-name=${POSTGRES_SERVER_ADMIN_FULL_NAME,env.POSTGRES_SERVER_ADMIN_FULL_NAME:postgres} --password=${POSTGRES_SERVER_ADMIN_PASSWORD,env.POSTGRES_SERVER_ADMIN_PASSWORD:example} --use-ccm=true --max-pool-size=5 --blocking-timeout-wait-millis=5000 --enabled=true --driver-class=org.postgresql.Driver --exception-sorter-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter --jta=true --use-java-context=true --valid-connection-checker-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker
    
  4. JBoss CLI コマンドを呼び出すスタートアップ スクリプト startup_script.sh を作成します。 次の例は、jboss-cli-commands.cli を呼び出す方法を示しています。 後で、コンテナーの起動時にこのスクリプトを実行するように App Service を構成します。

    $JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/deployments/tools/jboss-cli-commands.cli
    
  5. 任意の FTP クライアントを使用して、JDBC ドライバー、jboss-cli-commands.clistartup_script.sh、およびモジュール定義を /site/deployments/tools/ にアップロードします。

  6. コンテナーの起動時に startup_script.sh を実行するようにサイトを構成します。 Azure portal で、 [構成]>[一般設定]>[スタートアップ コマンド] に移動します。 スタートアップ コマンド フィールドを /home/site/deployments/tools/startup_script.sh に設定します。 変更内容を保存します。

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

次のステップ

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