次の方法で共有


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

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

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

Azure アカウントがない場合は、開始する前に free アカウントを作成します。

前提条件

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

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

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

このコマンドの実行には 1 分かかることがあります。

次のステップ

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

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