チュートリアル: シークレットを使わず、マネージド ID を使って Java Quarkus コンテナー アプリから PostgreSQL Database に接続する
Azure Container Apps からアプリ用にマネージド ID も提供されます。これは、Azure Database for PostgreSQL やその他の Azure サービスへのアクセスをセキュリティで保護するためのターンキー ソリューションです。 Container Apps のマネージド ID を使って環境変数列内の認証情報などのシークレットをアプリから排除することで、アプリのセキュリティを強化できます。
このチュートリアルでは、Azure で Java コンテナー アプリを構築、構成、デプロイ、スケーリングするプロセスを、順を追って説明します。 このチュートリアルの最後には、Container Apps 上で実行されるマネージド ID を使用して PostgreSQL データベースにデータを格納する Quarkus アプリケーションが完成します。
学習する内容:
- PostgreSQL データベースで Microsoft Entra ID を使って認証するように Quarkus アプリを構成する。
- Azure コンテナー レジストリを作成し、Java アプリ イメージをそこにプッシュする。
- Azure でコンテナー アプリを作成する。
- Azure で PostgreSQL データベースを作成する。
- サービス コネクタを使い、マネージド ID を使って PostgreSQL データベースに接続する。
Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。
1.前提条件
2. コンテナー レジストリを作成する
az group create コマンドを使用して、リソース グループを作成します。 Azure リソース グループとは、Azure リソースのデプロイと管理に使用する論理コンテナーです。
次の例では、myResourceGroup
という名前のリソース グループを米国東部リージョンに作成します。
RESOURCE_GROUP="myResourceGroup"
LOCATION="eastus"
az group create --name $RESOURCE_GROUP --location $LOCATION
az acr create コマンドを使用して Azure コンテナー レジストリ インスタンスを作成し、az acr show コマンドを使用してそのログイン サーバーを取得します。 レジストリの名前は Azure 内で一意にする必要があり、英数字で 5 ~ 50 文字にする必要があります。 すべての文字は、小文字で指定する必要があります。 次の例では、mycontainerregistry007
が使用されています。 これを一意の値に更新します。
REGISTRY_NAME=mycontainerregistry007
az acr create \
--resource-group $RESOURCE_GROUP \
--name $REGISTRY_NAME \
--sku Basic
REGISTRY_SERVER=$(az acr show \
--name $REGISTRY_NAME \
--query 'loginServer' \
--output tsv | tr -d '\r')
3. サンプル アプリをクローンし、コンテナー イメージを準備する
このチュートリアルでは、Azure Database for PostgreSQL を基盤とする Quarkus REST API を呼び出す Web UI を備えた、サンプルの Fruits リスト アプリを使用します。 このアプリのコードは、GitHub で入手できます。 Quarkus と PostgreSQL を使用して Java アプリを作成する方法の詳細については、『『Quarkus の Hibernate ORM with Panache ガイド』および『Quarkus のデータソース ガイド』を参照してください。
お使いのターミナルで次のコマンドを実行して、サンプル リポジトリを複製し、サンプル アプリの環境をセットアップします。
git clone https://github.com/quarkusio/quarkus-quickstarts
cd quarkus-quickstarts/hibernate-orm-panache-quickstart
プロジェクトを変更する
必要な依存関係をプロジェクトの POM ファイルに追加します。
<dependency> <groupId>com.azure</groupId> <artifactId>azure-identity-extensions</artifactId> <version>1.1.20</version> </dependency>
Quarkus アプリのプロパティを構成します。
Quarkus の構成は、src/main/resources/application.properties ファイルにあります。 エディターでこのファイルを開き、いくつかの既定のプロパティを確認します。
%prod
のプレフィックスが付いたプロパティは、アプリケーションがビルドおよびデプロイされている場合 (たとえば、Azure App Service にデプロイされている場合) にのみ使用されます。 アプリケーションをローカルで実行すると、%prod
プロパティは無視されます。 同様に、%dev
プロパティは Quarkus のライブ コーディング/開発モードで使用され、%test
プロパティは継続的なテスト中に使用されます。application.properties 内の既存のコンテンツを削除し、次の内容に置き換えて、開発モード、テスト モード、運用モード用にデータベースを構成します。
quarkus.hibernate-orm.database.generation=drop-and-create quarkus.datasource.db-kind=postgresql quarkus.datasource.jdbc.max-size=8 quarkus.datasource.jdbc.min-size=2 quarkus.hibernate-orm.log.sql=true quarkus.hibernate-orm.sql-load-script=import.sql quarkus.datasource.jdbc.acquisition-timeout = 10 %dev.quarkus.datasource.username=${CURRENT_USERNAME} %dev.quarkus.datasource.jdbc.url=jdbc:postgresql://${AZURE_POSTGRESQL_HOST}:${AZURE_POSTGRESQL_PORT}/${AZURE_POSTGRESQL_DATABASE}?\ authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin\ &sslmode=require %prod.quarkus.datasource.username=${AZURE_POSTGRESQL_USERNAME} %prod.quarkus.datasource.jdbc.url=jdbc:postgresql://${AZURE_POSTGRESQL_HOST}:${AZURE_POSTGRESQL_PORT}/${AZURE_POSTGRESQL_DATABASE}?\ authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin\ &sslmode=require %dev.quarkus.class-loading.parent-first-artifacts=com.azure:azure-core::jar,\ com.azure:azure-core-http-netty::jar,\ io.projectreactor.netty:reactor-netty-core::jar,\ io.projectreactor.netty:reactor-netty-http::jar,\ io.netty:netty-resolver-dns::jar,\ io.netty:netty-codec::jar,\ io.netty:netty-codec-http::jar,\ io.netty:netty-codec-http2::jar,\ io.netty:netty-handler::jar,\ io.netty:netty-resolver::jar,\ io.netty:netty-common::jar,\ io.netty:netty-transport::jar,\ io.netty:netty-buffer::jar,\ com.azure:azure-identity::jar,\ com.azure:azure-identity-extensions::jar,\ com.fasterxml.jackson.core:jackson-core::jar,\ com.fasterxml.jackson.core:jackson-annotations::jar,\ com.fasterxml.jackson.core:jackson-databind::jar,\ com.fasterxml.jackson.dataformat:jackson-dataformat-xml::jar,\ com.fasterxml.jackson.datatype:jackson-datatype-jsr310::jar,\ org.reactivestreams:reactive-streams::jar,\ io.projectreactor:reactor-core::jar,\ com.microsoft.azure:msal4j::jar,\ com.microsoft.azure:msal4j-persistence-extension::jar,\ org.codehaus.woodstox:stax2-api::jar,\ com.fasterxml.woodstox:woodstox-core::jar,\ com.nimbusds:oauth2-oidc-sdk::jar,\ com.nimbusds:content-type::jar,\ com.nimbusds:nimbus-jose-jwt::jar,\ net.minidev:json-smart::jar,\ net.minidev:accessors-smart::jar,\ io.netty:netty-transport-native-unix-common::jar,\ net.java.dev.jna:jna::jar
Docker イメージをビルドしてコンテナー レジストリにプッシュする
コンテナー イメージをビルドします。
次のコマンドを実行して Quarkus アプリ イメージをビルドします。 レジストリ ログイン サーバーの完全修飾名を使ってタグ付けする必要があります。
CONTAINER_IMAGE=${REGISTRY_SERVER}/quarkus-postgres-passwordless-app:v1 mvn quarkus:add-extension -Dextensions="container-image-jib" mvn clean package -Dquarkus.container-image.build=true -Dquarkus.container-image.image=${CONTAINER_IMAGE}
レジストリにログインします。
コンテナー イメージをプッシュするには、あらかじめレジストリにログインしておく必要があります。 そのためには、[az acr login][az-acr-login] コマンドを使います。
az acr login --name $REGISTRY_NAME
このコマンドが完了すると、
Login Succeeded
というメッセージが返されます。イメージをレジストリにプッシュします。
docker push
を使用してイメージをレジストリ インスタンスにプッシュします。 この例では、quarkus-postgres-passwordless-app
レポジトリを作成します。これには、quarkus-postgres-passwordless-app:v1
イメージが含まれています。docker push $CONTAINER_IMAGE
4. Azure でコンテナー アプリを作成する
次のコマンドを実行して Container Apps インスタンスを作成します。 環境変数の値は、使用する実際の名前と場所に置き換えてください。
CONTAINERAPPS_ENVIRONMENT="my-environment" az containerapp env create \ --resource-group $RESOURCE_GROUP \ --name $CONTAINERAPPS_ENVIRONMENT \ --location $LOCATION
次のコマンドを実行し、アプリ イメージを使用してコンテナー アプリを作成します。
APP_NAME=my-container-app az containerapp create \ --resource-group $RESOURCE_GROUP \ --name $APP_NAME \ --image $CONTAINER_IMAGE \ --environment $CONTAINERAPPS_ENVIRONMENT \ --registry-server $REGISTRY_SERVER \ --registry-identity system \ --ingress 'external' \ --target-port 8080 \ --min-replicas 1
Note
オプション
--registry-username
と--registry-password
は引き続きサポートされていますが、ID システムを使用する方が安全であるため、推奨されません。
5. PostgreSQL データベースを作成し、ID 接続を使って接続する
次に、PostgreSQL Database を作成し、システム割り当てマネージド ID を使って PostgreSQL Database に接続するようにコンテナー アプリを構成します。 Quarkus アプリはこのデータベースに接続し、実行時にそのデータを格納し、アプリケーションを実行する場所に関係なくアプリケーションの状態が永続化されます。
データベース サービスを作成します。
DB_SERVER_NAME='msdocs-quarkus-postgres-webapp-db' az postgres flexible-server create \ --resource-group $RESOURCE_GROUP \ --name $DB_SERVER_NAME \ --location $LOCATION \ --public-access None \ --sku-name Standard_B1ms \ --tier Burstable \ --active-directory-auth Enabled
Note
オプション
--admin-user
と--admin-password
は引き続きサポートされていますが、ID システムを使用する方が安全であるため、推奨されません。上記の Azure CLI コマンドでは、次のパラメーターが使用されます。
- resource-group → Web アプリを作成したのと同じリソース グループ名を使用します (例:
msdocs-quarkus-postgres-webapp-rg
)。 - name → PostgreSQL データベース サーバー名。 この名前は、Azure 全体で一意である必要があります (サーバー エンドポイントは
https://<name>.postgres.database.azure.com
になります)。 有効な文字は、A
-Z
、0
-9
、および-
です。 会社名とサーバー識別子を組み合わせて使用すると、適切なパターンになります。 (msdocs-quarkus-postgres-webapp-db
) - location → Web アプリに使用したのと同じ場所を使用します。 動作しない場合は、別の場所に変更します。
- public-access →
None
とします。これにより、ファイアウォール規則のないパブリック アクセス モードでサーバーを設定します。 ルールは、後の手順で作成します。 - sku-name → 価格レベルとコンピューティング構成の名前 (例:
Standard_B1ms
)。 詳しくは、「Azure Database for PostgreSQL の価格」をご覧ください。 - tier → サーバーのコンピューティング レベル。 詳しくは、「Azure Database for PostgreSQL の価格」をご覧ください。
- active-directory-auth →
Enabled
にすると Microsoft Entra 認証が有効になります。
- resource-group → Web アプリを作成したのと同じリソース グループ名を使用します (例:
次のコマンドを使用して、PostgreSQL サービス内に
fruits
という名前のデータベースを作成します。DB_NAME=fruits az postgres flexible-server db create \ --resource-group $RESOURCE_GROUP \ --server-name $DB_SERVER_NAME \ --database-name $DB_NAME
Azure CLI 用 Service Connector パスワードレス拡張機能をインストールします。
az extension add --name serviceconnector-passwordless --upgrade --allow-preview true
connection コマンドを使い、システム割り当てマネージド ID を使ってコンテナー アプリにデータベースを接続します。
az containerapp connection create postgres-flexible \ --resource-group $RESOURCE_GROUP \ --name $APP_NAME \ --target-resource-group $RESOURCE_GROUP \ --server $DB_SERVER_NAME \ --database $DB_NAME \ --system-identity \ --container $APP_NAME
6. 変更内容を確認する
アプリケーションの URL (FQDN) は、次のコマンドを使って見つけることができます。
echo https://$(az containerapp show \
--name $APP_NAME \
--resource-group $RESOURCE_GROUP \
--query properties.configuration.ingress.fqdn \
--output tsv)
新しい Web ページに fruits リストを表示するとき、アプリはマネージド ID を使用してデータベースに接続しています。 以前と同様に fruits リストを編集できるようになりました。
リソースをクリーンアップする
前の手順では、リソース グループ内に Azure リソースを作成しました。 これらのリソースが将来必要になると想定していない場合、Cloud Shell で次のコマンドを実行して、リソース グループを削除します。
az group delete --name myResourceGroup
このコマンドの実行には、少し時間がかかる場合があります。
次のステップ
開発者ガイドの Azure 上で Java アプリを実行する方法を確認します。