チュートリアル: マネージド ID を使用してシークレットなしで Java Tomcat App Service から PostgreSQL SQL Database に接続する

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

  • PostgreSQL データベースを作成する。
  • WAR パッケージを使用して、サンプル アプリを Tomcat 上の Azure App Service にデプロイする。
  • PostgreSQL Database で Microsoft Entra 認証を使用するように Tomcat Web アプリケーションを構成します。
  • Service Connector を使用して、マネージド ID で PostgreSQL Database に接続する。

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

前提条件

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

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

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

Azure Database for PostgreSQL の作成

サブスクリプションに Azure Database for Postgres を作成するには、次の手順に従います。 Tomcat アプリではこのデータベースに接続し、実行時にそのデータを格納し、アプリケーションの実行場所に関係なくアプリケーションの状態を保持します。

  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 PostgreSQL サーバーを作成します。 サーバーは管理者アカウントで作成されますが、これは使用されません。管理タスクの実行には、Microsoft Entra 管理者アカウントが使用されるためです。

    export POSTGRESQL_ADMIN_USER=azureuser
    # PostgreSQL admin access rights won't be used because Azure AD authentication is leveraged to administer the database.
    export POSTGRESQL_ADMIN_PASSWORD=<admin-password>
    export POSTGRESQL_HOST=<postgresql-host-name>
    
    # Create a PostgreSQL server.
    az postgres flexible-server create \
        --resource-group $RESOURCE_GROUP \
        --name $POSTGRESQL_HOST \
        --location $LOCATION \
        --admin-user $POSTGRESQL_ADMIN_USER \
        --admin-password $POSTGRESQL_ADMIN_PASSWORD \
        --public-access 0.0.0.0 \
        --sku-name Standard_D2s_v3
    
  4. アプリケーション用のデータベースを作成します。

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

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

WAR ファイルをビルドし、WAR パッケージを使用して Tomcat 上の Azure App Service にデプロイするには、次の手順に従います。

  1. サンプル アプリには、WAR ファイルを生成できる pom.xml ファイルが含まれています。 次のコマンドを実行して、アプリをビルドします。

    mvn clean package -f pom.xml
    
  2. Tomcat 9.0 を使用して、Linux 上に Azure App Service リソースを作成します。

    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 B1 \
        --is-linux
    
    # Create an App Service resource.
    az webapp create \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --plan $APPSERVICE_PLAN \
        --runtime "TOMCAT:10.0-java11"
    
  3. WAR パッケージを App Service にデプロイします。

    az webapp deploy \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --src-path target/app.war \
        --type war
    

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

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

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

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

次に、Service Connector を使用して、システム割り当てマネージド ID で Postgres データベースにアプリを接続します。

この接続を行うには、az webapp connection create コマンドを実行します。

az webapp connection create postgres-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $POSTGRESQL_HOST \
    --database $DATABASE_NAME \
    --system-identity \
    --client-type java

このコマンドは、Web アプリと PostgreSQL サーバーの間の接続を作成し、システム割り当てマネージド ID を使用して認証を管理します。

次に、アプリ設定を更新し、接続文字列にプラグインを追加します。

export AZURE_POSTGRESQL_CONNECTIONSTRING=$(\
    az webapp config appsettings list \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
    | jq -c -r '.[] \
    | select ( .name == "AZURE_POSTGRESQL_CONNECTIONSTRING" ) \
    | .value')

az webapp config appsettings set \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --settings 'CATALINA_OPTS=-DdbUrl="'"${AZURE_POSTGRESQL_CONNECTIONSTRING}"'&authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin"'

サンプル 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 アプリの実行の詳細について開発者ガイドで確認してください。

カスタム ドメインと証明書を使用してアプリをセキュリティで保護する方法について説明します。