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 - Free、Premium v3、Isolated v2 価格レベルの Linux アプリでのみサポートされます。 組み込みの JBoss EAP サーバーは、WAR または EAR パッケージとしてデプロイされたアプリを実行できます。
Note
Spring アプリケーションの場合は、Azure Spring Apps を使用することをお勧めします。 ただし、Azure App Service は引き続き宛先として使用できます。 アドバイスについてはJava ワークロード宛先ガイダンスに関する記事を参照してください。
データ ソースの構成
Spring Boot アプリケーション内のデータ ソースに接続するには、接続文字列を作成し、それらを application.properties ファイルに挿入することをお勧めします。
App Service ページの [構成] セクションに文字列の名前を設定し、JDBC 接続文字列を値フィールドに貼り付けて、タイプを [カスタム] に設定します。 必要に応じて、この接続文字列をスロット設定として設定することができます。
この接続文字列は、
CUSTOMCONNSTR_<your-string-name>
という名前の環境変数としてアプリケーションにアクセスできます。 たとえば、CUSTOMCONNSTR_exampledb
のようにします。application.properties ファイルで、環境変数名を使用してこの接続文字列を参照します。 たとえば、例では次のコードを使用します。
app.datasource.url=${CUSTOMCONNSTR_exampledb}
ヒント
既定では、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 つのアプリケーション、またはすべてのアプリケーションのどちらに対して使用可能にする必要があるかを判定します。
アプリケーション レベル データ ソース
プロジェクトの META-INF/ ディレクトリ内に context.xml ファイルを作成します。 META-INF/ ディレクトリが存在しない場合は作成します。
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>
アプリケーションでこのデータ ソースを使用するよう、アプリケーションの 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 の server.xml を編集する必要があります。 これを行う最も信頼性の高い方法は次のとおりです。
- スタートアップ スクリプトをアップロードし、[構成]>[スタートアップ コマンド] でスクリプトへのパスを設定します。 FTP を使用してスタートアップ スクリプトをアップロードできます。
スタートアップ スクリプトによって、server.xml ファイルへの xsl 変換が作成され、結果の xml ファイルが /usr/local/tomcat/conf/server.xml
に出力されます。 スタートアップ スクリプトでは、apk を使用して libxslt をインストールする必要があります。 xsl ファイルとスタートアップ スクリプトは FTP 経由でアップロードできます。 以下にスタートアップ スクリプトの例を示します。
# Install libxslt. Also copy the transform file to /home/tomcat/conf/
apk add --update libxslt
# 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(., '<Connector') and
(contains(., 'scheme="https"') or
contains(., "scheme='https'"))]">
<xsl:value-of select="." disable-output-escaping="yes" />
</xsl:template>
<xsl:template match="Service[not(Connector[@scheme = 'https'] or
comment()[contains(., '<Connector') and
(contains(., 'scheme="https"') or
contains(., "scheme='https'"))]
)]
">
<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>
</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 を再起動します。
- 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 データベース (接続資格情報を含む) に追加することだけです。App Service は、コンテナーで使用可能な適切なドライバーを使用して、対応する共有データ ソースを自動的に追加します。 このアプローチを使用したエンド ツー エンドのシナリオについては、「チュートリアル: Azure App Service on Linux と MySQL を使用して JBoss Web アプリを構築する」を参照してください。
JBoss EAP を使用してデータ ソースを登録する場合、3 つの主要な手順があります:
- JDBC ドライバーをアップロードします。
- JDBC ドライバーをモジュールとして追加します。
- モジュールを使用してデータ ソースを追加します。
App Service はステートレス ホスティング サービスであるため、これらの手順をスタートアップ スクリプトに配置し、JBoss コンテナーが起動するたびに実行する必要があります。 PostgreSQL、MySQL、SQL Database を例として使用します:
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_HOST
、DB_USERNAME
、およびDB_PASSWORD
) が使用されることに注意してください。この環境変数は、App Service でアプリ設定として追加する必要があります。 JBoss が値をプレーンテキストで保存しないように、スクリプトは--resolve-parameter-values
フラグなしでそれらを追加します。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
任意のデプロイ オプションを使用して、JDBC ドライバー、 jboss-cli-commands.cli と startup.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 リファレンス ドキュメントを入手してください。