Share via


チュートリアル: パスワードレス接続を使用して Java JBoss EAP App Service から MySQL データベースに接続する

Azure App Service は、Azure での高度にスケーラブルな自己適用型の Web ホスティング サービスを提供します。 さらに、Azure Database for MySQL やその他の Azure サービスへのアクセスをセキュリティ保護するためのターンキー ソリューションであるマネージド ID もアプリ向けに提供しています。 App Service のマネージド ID を使用すると、環境変数列内の認証情報などのシークレットをアプリから排除することで、アプリのセキュリティを強化できます。 このチュートリアルでは、次の作業を行う方法について説明します。

  • MySQL データベースを作成する。
  • WAR パッケージを使用して、サンプル JBoss EAP アプリを Azure App Service にデプロイする。
  • MySQL データベースで Microsoft Entra 認証を使用するように Spring Boot Web アプリケーションを構成する。
  • サービス コネクタを使用して、マネージド ID で MySQL データベースに接続する。

Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。

前提条件

サンプル アプリを複製してリポジトリを準備する

お使いのターミナルで次のコマンドを実行して、サンプル リポジトリを複製し、サンプル アプリの環境をセットアップします。

git clone https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps
cd Passwordless-Connections-for-Java-Apps/JakartaEE/jboss-eap/

Azure Database for MySQL の作成

サブスクリプションに Azure Database for MySQL を作成するには、次の手順に従います。 Spring Boot リスト アプリは、このデータベースに接続し、実行時にデータを格納します。アプリケーションの状態は、アプリケーションを実行する場所に関わらず永続化されます。

  1. Azure CLI にサインインして、ログイン資格情報に接続されるサブスクリプションが複数ある場合は、必要に応じてサブスクリプションを設定します。

    az login
    az account set --subscription <subscription-ID>
    
  2. Azure リソース グループを作成して、そのリソース グループの名前をメモします。

    export RESOURCE_GROUP=<resource-group-name>
    export LOCATION=eastus
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Azure Database for MySQL サーバーを作成します。 サーバーは管理者アカウントで作成されますが、これは使用されません。管理タスクの実行には、Microsoft Entra 管理者アカウントが使用されるためです。

    export MYSQL_ADMIN_USER=azureuser
    # MySQL admin access rights won't be used because Azure AD authentication is leveraged to administer the database.
    export MYSQL_ADMIN_PASSWORD=<admin-password>
    export MYSQL_HOST=<mysql-host-name>
    
    # Create a MySQL server.
    az mysql flexible-server create \
        --name $MYSQL_HOST \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION \
        --admin-user $MYSQL_ADMIN_USER \
        --admin-password $MYSQL_ADMIN_PASSWORD \
        --public-access 0.0.0.0 \
        --tier Burstable \
        --sku-name Standard_B1ms \
        --storage-size 32
    
  4. アプリケーション用のデータベースを作成します。

    export DATABASE_NAME=checklist
    
    az mysql flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $MYSQL_HOST \
        --database-name $DATABASE_NAME
    

App Service を作成する

Linux 上に Azure App Service リソースを作成します。 JBoss EAP には Premium SKU が必要です。

export APPSERVICE_PLAN=<app-service-plan>
export APPSERVICE_NAME=<app-service-name>
# Create an App Service plan
az appservice plan create \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_PLAN \
    --location $LOCATION \
    --sku P1V3 \
    --is-linux

# Create an App Service resource.
az webapp create \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --plan $APPSERVICE_PLAN \
    --runtime "JBOSSEAP:7-java8"

ID 接続を使用して MySQL データベースを接続する

次に、Service Connector を使用してデータベースを接続します。

Azure CLI 用 Service Connector パスワードレス拡張機能をインストールします。

az extension add --name serviceconnector-passwordless --upgrade

その後、次のコマンドを使用して、Microsoft Entra 認証用のユーザー割り当てマネージド ID を作成します。 詳細については、「Azure Database for MySQL - フレキシブル サーバーの Microsoft Entra 認証を設定する」を参照してください。

export USER_IDENTITY_NAME=<your-user-assigned-managed-identity-name>
export IDENTITY_RESOURCE_ID=$(az identity create \
    --name $USER_IDENTITY_NAME \
    --resource-group $RESOURCE_GROUP \
    --query id \
    --output tsv)

重要

ユーザー割り当て ID を作成したら、グローバル管理者または特権ロール管理者に、この ID に対して次のアクセス許可を付与するように依頼します。User.Read.AllGroupMember.Read.AllApplication.Read.ALL 詳細については、「Active Directory 認証」の「アクセス許可」セクションを参照してください。

次に、Service Connector を使用して、システム割り当てマネージド ID で MySQL データベースにアプリを接続します。 この接続を行うには、az webapp connection create コマンドを実行します。

az webapp connection create mysql-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $MYSQL_HOST \
    --database $DATABASE_NAME \
    --system-identity mysql-identity-id=$IDENTITY_RESOURCE_ID \
    --client-type java

このサービス コネクタ コマンドは、バックグラウンドで次のタスクを実行します。

  • Azure App Service によってホストされるアプリ $APPSERVICE_NAME のシステム割り当てマネージド ID を有効にします。

  • Microsoft Entra 管理者を現在サインインしているユーザーに設定します。

  • 手順 1 でシステム割り当てマネージド ID のデータベース ユーザーを追加し、データベース $DATABASE_NAME のすべての特権をこのユーザーに付与します。 前のコマンドからの出力で、接続文字列からユーザー名を取得できます。

  • AZURE_MYSQL_CONNECTIONSTRING という名前のアプリの [アプリ設定] に接続文字列を追加します。

    Note

    The subscription is not registered to use Microsoft.ServiceLinker」というエラー メッセージが表示される場合は、コマンド az provider register --namespace Microsoft.ServiceLinker を実行して、サービス コネクタ リソースプロバイダーを登録し、connection コマンドを再実行します。

アプリケーションをデプロイする

次の手順に従って、データベース内のデータを準備し、アプリケーションをデプロイします。

データベース スキーマを作成する

  1. 現在の IP アドレスからの接続を許可するようにファイアウォールを開きます。

    # Create a temporary firewall rule to allow connections from your current machine to the MySQL server
    export MY_IP=$(curl http://whatismyip.akamai.com)
    az mysql flexible-server firewall-rule create \
        --resource-group $RESOURCE_GROUP \
        --name $MYSQL_HOST \
        --rule-name AllowCurrentMachineToConnect \
        --start-ip-address ${MY_IP} \
        --end-ip-address ${MY_IP}
    
  2. データベースに接続してテーブルを作成します。

    export DATABASE_FQDN=${MYSQL_HOST}.mysql.database.azure.com
    export CURRENT_USER=$(az account show --query user.name --output tsv)
    export RDBMS_ACCESS_TOKEN=$(az account get-access-token \
        --resource-type oss-rdbms \
        --output tsv \
        --query accessToken)
    mysql -h "${DATABASE_FQDN}" --user "${CURRENT_USER}" --enable-cleartext-plugin --password="$RDBMS_ACCESS_TOKEN" < azure/init-db.sql
    
  3. 一時的なファイアウォール規則を削除します。

    az mysql flexible-server firewall-rule delete \
        --resource-group $RESOURCE_GROUP \
        --name $MYSQL_HOST \
        --rule-name AllowCurrentMachineToConnect
    

アプリケーションをデプロイする

  1. [アプリの設定] の接続文字列を更新します。

    サービス コネクタによって生成された接続文字列を取得し、パスワードレス認証プラグインを追加します。 この接続文字列は、スタートアップ スクリプトで参照されます。

    export PASSWORDLESS_URL=$(\
        az webapp config appsettings list \
            --resource-group $RESOURCE_GROUP \
            --name $APPSERVICE_NAME \
        | jq -c '.[] \
        | select ( .name == "AZURE_MYSQL_CONNECTIONSTRING" ) \
        | .value' \
        | sed 's/"//g')
    # Create a new environment variable with the connection string including the passwordless authentication plugin
    export PASSWORDLESS_URL=${PASSWORDLESS_URL}'&defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin'
    az webapp config appsettings set \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --settings "AZURE_MYSQL_CONNECTIONSTRING_PASSWORDLESS=${PASSWORDLESS_URL}"
    
  2. サンプル アプリには、WAR ファイルを生成できる pom.xml ファイルが含まれています。 次のコマンドを実行して、アプリをビルドします。

    mvn clean package -DskipTests
    
  3. WAR とスタートアップ スクリプトを App Service にデプロイします。

    az webapp deploy \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --src-path target/ROOT.war \
        --type war
    az webapp deploy \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --src-path src/main/webapp/WEB-INF/createMySQLDataSource.sh \
        --type startup
    

サンプル Web アプリをテストする

次のコマンドを実行して、アプリケーションをテストします。

export WEBAPP_URL=$(az webapp show \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --query defaultHostName \
    --output tsv)

# Create a list
curl -X POST -H "Content-Type: application/json" -d '{"name": "list1","date": "2022-03-21T00:00:00","description": "Sample checklist"}' https://${WEBAPP_URL}/checklist

# Create few items on the list 1
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 1"}' https://${WEBAPP_URL}/checklist/1/item
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 2"}' https://${WEBAPP_URL}/checklist/1/item
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 3"}' https://${WEBAPP_URL}/checklist/1/item

# Get all lists
curl https://${WEBAPP_URL}/checklist

# Get list 1
curl https://${WEBAPP_URL}/checklist/1

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

前の手順では、リソース グループ内に Azure リソースを作成しました。 これらのリソースが将来必要になると想定していない場合、Cloud Shell で次のコマンドを実行して、リソース グループを削除します。

az group delete --name myResourceGroup

このコマンドの実行には、少し時間がかかる場合があります。

次のステップ

App Service on Linux での Java アプリの実行の詳細について開発者ガイドで確認してください。