Руководство. Подключение к Postgre База данных SQL из приложения контейнера Java Quarkus без секретов с помощью управляемого удостоверения
Приложения контейнеров Azure предоставляют управляемое удостоверение для приложения, которое является решением для защиты доступа к База данных Azure для PostgreSQL и другим службам Azure. Управляемые удостоверения в контейнерных приложениях делают приложение более безопасным, устраняя секреты из приложения, например учетные данные в переменных среды.
В этом руководстве описан процесс создания, настройки, развертывания и масштабирования приложений контейнеров Java в Azure. В конце этого руководства у вас будет приложение Quarkus, которое хранит данные в базе данных PostgreSQL с управляемым удостоверением, запущенным в приложениях контейнеров.
Освещаются следующие темы:
- Настройте приложение Quarkus для проверки подлинности с помощью идентификатора Microsoft Entra с помощью Postgre База данных SQL.
- Создайте реестр контейнеров Azure и отправьте в него образ приложения Java.
- Создайте приложение-контейнер в Azure.
- Создайте базу данных PostgreSQL в Azure.
- Подключитесь к Postgre База данных SQL с управляемым удостоверением с помощью соединителя служб.
Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.
1. Предварительные требования
2. Создание реестра контейнеров
Создайте группу ресурсов с помощью команды az group create. Группа ресурсов Azure является логическим контейнером, в котором происходит развертывание ресурсов Azure и управление ими.
В следующем примере создается группа ресурсов с именем myResourceGroup
в регионе "Восточная часть США Azure".
az group create --name myResourceGroup --location eastus
Создайте экземпляр реестра контейнеров Azure с помощью команды az acr create . Имя реестра должно быть уникальным в Azure, содержащее 5–50 буквенно-цифровых символов. Все буквы должны быть указаны в нижнем регистре. В следующем примере mycontainerregistry007
используется. Замените его уникальным значением.
az acr create \
--resource-group myResourceGroup \
--name mycontainerregistry007 \
--sku Basic
3. Клонирование примера приложения и подготовка образа контейнера
В этом руководстве используется пример приложения со списком фруктов с веб-интерфейсом пользователя, который вызывает REST API Quarkus, поддерживаемый Базой данных Azure для PostgreSQL. Код для приложения можно найти на сайте GitHub. Дополнительные сведения о написании приложений Java с использованием Quarkus и PostgreSQL см. в руководстве по Quarkus Hibernate ORM с Panache и руководстве по источнику данных Quarkus.
Выполните следующие команды в терминале, чтобы клонировать репозиторий и настроить среду примера приложения.
git clone https://github.com/quarkusio/quarkus-quickstarts
cd quarkus-quickstarts/hibernate-orm-panache-quickstart
Изменение проекта
Добавьте необходимые зависимости в файл BOM проекта.
<dependency> <groupId>com.azure</groupId> <artifactId>azure-identity-providers-jdbc-postgresql</artifactId> <version>1.0.0-beta.1</version> </dependency>
Настройте свойства приложения Quarkus.
Конфигурация Quarkus находится в файле src/main/resources/application.properties . Откройте этот файл в редакторе и просмотрите несколько свойств по умолчанию. Свойства, которые имеют префикс
%prod
, используются только при создании и развертывании приложения, например, при развертывании в Службе приложений Azure. При локальном запуске приложения свойства%prod
игнорируются. Аналогичным образом свойства%dev
используются в режиме динамического написания кода или разработки Quarkus, а свойства%test
используются во время непрерывного тестирования.Удалите существующее содержимое в application.properties и замените следующим образом, чтобы настроить базу данных для режимов разработки, тестирования и рабочей среды:
quarkus.package.type=uber-jar 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=${AZURE_CLIENT_NAME} %dev.quarkus.datasource.jdbc.url=jdbc:postgresql://${DBHOST}.postgres.database.azure.com:5432/${DBNAME}?\ authenticationPluginClassName=com.azure.identity.providers.postgresql.AzureIdentityPostgresqlAuthenticationPlugin\ &sslmode=require\ &azure.clientId=${AZURE_CLIENT_ID}\ &azure.clientSecret=${AZURE_CLIENT_SECRET}\ &azure.tenantId=${AZURE_TENANT_ID} %prod.quarkus.datasource.username=${AZURE_MI_NAME} %prod.quarkus.datasource.jdbc.url=jdbc:postgresql://${DBHOST}.postgres.database.azure.com:5432/${DBNAME}?\ authenticationPluginClassName=com.azure.identity.providers.postgresql.AzureIdentityPostgresqlAuthenticationPlugin\ &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-providers-core::jar,\ com.azure:azure-identity-providers-jdbc-postgresql::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
Создание и отправка образа Docker в реестр контейнеров
Создание образа контейнера.
Выполните следующую команду, чтобы создать образ приложения Quarkus. Необходимо пометить его полным именем сервера входа в реестр. Имя сервера входа находится в формате <registry-name.azurecr.io> (должно быть всеми строчными регистрами), например mycontainerregistry007.azurecr.io. Замените имя собственным именем реестра.
mvnw quarkus:add-extension -Dextensions="container-image-jib" mvnw clean package -Pnative -Dquarkus.native.container-build=true -Dquarkus.container-image.build=true -Dquarkus.container-image.registry=mycontainerregistry007 -Dquarkus.container-image.name=quarkus-postgres-passwordless-app -Dquarkus.container-image.tag=v1
Войдите в реестр.
Перед отправкой образов контейнеров необходимо войти в реестр. Для этого используйте команду [az acr login][az-acr-login]. Укажите только имя ресурса реестра при входе в Azure CLI. Не используйте при этом полное имя сервера для входа.
az acr login --name <registry-name>
По завершении команда возвращает сообщение
Login Succeeded
.Отправьте образ в реестр.
Используйте [docker push][docker-push], чтобы отправить образ в экземпляр реестра. Замените значение
mycontainerregistry007
именем сервера входа для экземпляра реестра. В этом примере создается репозиторийquarkus-postgres-passwordless-app
, содержащийquarkus-postgres-passwordless-app:v1
образ.docker push mycontainerregistry007/quarkus-postgres-passwordless-app:v1
4. Создание приложения-контейнера в Azure
Создайте экземпляр контейнерных приложений, выполнив следующую команду. Замените значение переменных среды фактическим именем и расположением, которое вы хотите использовать.
RESOURCE_GROUP="myResourceGroup" LOCATION="eastus" CONTAINERAPPS_ENVIRONMENT="my-environment" az containerapp env create \ --resource-group $RESOURCE_GROUP \ --name $CONTAINERAPPS_ENVIRONMENT \ --location $LOCATION
Создайте приложение-контейнер с изображением приложения, выполнив следующую команду. Замените значения заполнителей на собственные значения. Сведения об учетной записи администратора реестра контейнеров см. в статье "Проверка подлинности с помощью реестра контейнеров Azure"
CONTAINER_IMAGE_NAME=quarkus-postgres-passwordless-app:v1 REGISTRY_SERVER=mycontainerregistry007 REGISTRY_USERNAME=<REGISTRY_USERNAME> REGISTRY_PASSWORD=<REGISTRY_PASSWORD> az containerapp create \ --resource-group $RESOURCE_GROUP \ --name my-container-app \ --image $CONTAINER_IMAGE_NAME \ --environment $CONTAINERAPPS_ENVIRONMENT \ --registry-server $REGISTRY_SERVER \ --registry-username $REGISTRY_USERNAME \ --registry-password $REGISTRY_PASSWORD
5. Создание и подключение базы данных PostgreSQL с подключением к удостоверениям
Затем создайте Postgre База данных SQL и настройте приложение контейнера для подключения к Postgre База данных SQL с управляемым удостоверением, назначаемого системой. Приложение Quarkus подключается к этой базе данных и сохраняет свои данные при выполнении, сохраняя состояние приложения независимо от того, где выполняется приложение.
Создайте службу базы данных.
DB_SERVER_NAME='msdocs-quarkus-postgres-webapp-db' ADMIN_USERNAME='demoadmin' ADMIN_PASSWORD='<admin-password>' az postgres flexible-server create \ --resource-group $RESOURCE_GROUP \ --name $DB_SERVER_NAME \ --location $LOCATION \ --admin-user $DB_USERNAME \ --admin-password $DB_PASSWORD \ --sku-name GP_Gen5_2
В приведенной выше команде Azure CLI используются следующие параметры:
resource-group → используйте то же имя группы ресурсов, где вы создали веб-приложение, например
msdocs-quarkus-postgres-webapp-rg
.name → имя сервера базы данных PostgreSQL. Это имя должно быть уникальным для всех областей Azure (конечная точка сервера преобразуется в
https://<name>.postgres.database.azure.com
). Допустимые символы:A
-Z
,0
-9
и-
. Рекомендуется использовать сочетание названия компании и идентификатора сервера. (msdocs-quarkus-postgres-webapp-db
)Расположение → используйте то же расположение, которое использовалось для веб-приложения.
admin-user → имя учетной записи пользователя с правами администратора. Нельзя использовать
azure_superuser
,admin
,administrator
,root
,guest
илиpublic
. Например, можно использоватьdemoadmin
.пароль администратора → пароль пользователя администратора. Он должен содержать от 8 до 128 символов из трех следующих категорий: английские прописные буквы, строчные буквы, цифры и не буквенно-цифровые символы.
Внимание
При создании имен пользователей или паролей символ
$
не используется. Далее в этом руководстве вы создадите переменные среды с этими значениями, где$
символ имеет особое значение в контейнере Linux, используемом для запуска приложений Java.public-access →
None
который задает для сервера режим общего доступа без использования правил брандмауэра. Правила будут созданы на более позднем этапе.sku-name → имя ценовой категории и конфигурации вычисления, например
GP_Gen5_2
. Дополнительные сведения см. на странице цен на Базу данных Azure для PostgreSQL.
Создайте базу данных с именем
fruits
в службе PostgreSQL с помощью этой команды:az postgres flexible-server db create \ --resource-group $RESOURCE_GROUP \ --server-name $DB_SERVER_NAME \ --database-name fruits
Установите расширение без пароля соединителя службы для Azure CLI:
az extension add --name serviceconnector-passwordless --upgrade
Подключите базу данных к приложению-контейнеру с управляемым удостоверением, назначаемое системой, с помощью команды подключения.
az containerapp connection create postgres-flexible \ --resource-group $RESOURCE_GROUP \ --name my-container-app \ --target-resource-group $RESOURCE_GROUP \ --server $DB_SERVER_NAME \ --database fruits \ --managed-identity
6. Просмотр изменений
URL-адрес приложения (FQDN) можно найти с помощью следующей команды:
az containerapp list --resource-group $RESOURCE_GROUP
Когда на новой веб-странице отображается список фруктов, приложение подключается к базе данных с помощью управляемого удостоверения. Теперь вы сможете редактировать список фруктов, как и раньше.
Очистка ресурсов
На предыдущем шаге вы создали ресурсы Azure в группе ресурсов. Если эти ресурсы вам не понадобятся в будущем, вы можете удалить группу ресурсов, выполнив следующую команду в Cloud Shell:
az group delete --name myResourceGroup
Ее выполнение может занять до минуты.
Следующие шаги
Дополнительные сведения о запуске приложений Java в Azure см. в руководстве разработчика.