Поделиться через


Руководство: Подключение к базе данных PostgreSQL из приложения контейнера Java Quarkus без секретов с управляемым удостоверением

Azure Container Apps предоставляет управляемую идентификацию для вашего приложения, что является готовым решением для защиты доступа к Azure Database for PostgreSQL и другим службам Azure. Управляемые удостоверения в контейнерных приложениях делают ваше приложение более безопасным, исключая необходимость использования секретов, например, необходимость указывать учетные данные в переменных среды.

В этом руководстве описан процесс создания, настройки, развертывания и масштабирования приложений контейнеров Java в Azure. В конце этого руководства у вас будет приложение Quarkus, которое хранит данные в базе данных PostgreSQL, с управляемым удостоверением, работающим в приложениях контейнеров.

Что вы узнаете:

  • Настройте приложение Quarkus для аутентификации с использованием Microsoft Entra ID и базы данных PostgreSQL.
  • Создайте реестр контейнеров Azure и отправьте в него образ приложения Java.
  • Создайте приложение-контейнер в Azure.
  • Создайте базу данных PostgreSQL в Azure.
  • Подключитесь к базе данных PostgreSQL с управляемым удостоверением с помощью сервисного соединителя.

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.

1. Предварительные требования

2. Создание реестра контейнеров

Создайте группу ресурсов с помощью команды az group create. Группа ресурсов Azure является логическим контейнером, в котором происходит развертывание ресурсов Azure и управление ими.

В следующем примере создается группа ресурсов с именем myResourceGroup в регионе "Восточная часть США Azure".

RESOURCE_GROUP="myResourceGroup"
LOCATION="eastus"

az group create --name $RESOURCE_GROUP --location $LOCATION

Создайте экземпляр реестра контейнеров Azure с помощью команды az acr create и извлеките его сервер входа с помощью команды 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. Клонирование примера приложения и подготовка образа контейнера

В этом руководстве используется пример приложения со списком фруктов с веб-интерфейсом пользователя, который вызывает 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

Изменение проекта

  1. Добавьте необходимые зависимости в POM-файл проекта.

    <dependency>
       <groupId>com.azure</groupId>
       <artifactId>azure-identity-extensions</artifactId>
       <version>1.2.0</version>
    </dependency>
    
  2. Настройте свойства приложения Quarkus.

    Конфигурация Quarkus находится в файле src/main/resources/application.properties . Откройте этот файл в редакторе и просмотрите несколько свойств по умолчанию. Свойства, которые имеют префикс %prod, используются только при создании и развертывании приложения, например, при развертывании в Службе приложений Azure. При локальном запуске приложения свойства %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 в реестр контейнеров

  1. Создание образа контейнера.

    Выполните следующую команду, чтобы создать образ приложения 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}
    
  2. Войдите в реестр.

    Перед отправкой образов контейнеров необходимо войти в реестр. Для этого используйте команду [az acr login][az-acr-login].

    az acr login --name $REGISTRY_NAME
    

    По завершении команда возвращает сообщение Login Succeeded.

  3. Отправьте образ в реестр.

    Используйте docker push для отправки образа в экземпляр реестра. В этом примере создается репозиторий quarkus-postgres-passwordless-app , содержащий quarkus-postgres-passwordless-app:v1 образ.

    docker push $CONTAINER_IMAGE
    

4. Создание приложения-контейнера в Azure

  1. Создайте экземпляр контейнерных приложений, выполнив следующую команду. Замените значение переменных среды фактическим именем и расположением, которое вы хотите использовать.

    CONTAINERAPPS_ENVIRONMENT="my-environment"
    
    az containerapp env create \
        --resource-group $RESOURCE_GROUP \
        --name $CONTAINERAPPS_ENVIRONMENT \
        --location $LOCATION
    
  2. Создайте приложение-контейнер с изображением приложения, выполнив следующую команду:

    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
    

    Примечание.

    Параметры --registry-username и --registry-password по-прежнему поддерживаются, но не рекомендуются, поскольку использование системы идентификации является более безопасным.

5. Создание и подключение базы данных PostgreSQL с идентификационным подключением

Затем создайте базу данных PostgreSQL и настройте приложение контейнера для подключения к базе данных PostgreSQL с управляемым удостоверением, назначаемым системой. Приложение Quarkus подключается к этой базе данных и сохраняет данные при выполнении, сохраняя состояние приложения независимо от того, где выполняется приложение.

  1. Создайте службу базы данных.

    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
    

    Примечание.

    Опции --admin-user и --admin-password по-прежнему поддерживаются, но их использование не рекомендуется, так как система удостоверений является более безопасным вариантом.

    В приведенной выше команде Azure CLI используются следующие параметры:

    • Используйте то же имя группы ресурсов, которое вы использовали для создания веб-приложения, например, msdocs-quarkus-postgres-webapp-rg.
    • name → имя сервера базы данных PostgreSQL. Это имя должно быть уникальным для всех областей Azure (конечная точка сервера преобразуется в https://<name>.postgres.database.azure.com). Допустимые символы: A-Z, 0-9 и -. Рекомендуется использовать сочетание названия компании и идентификатора сервера. (msdocs-quarkus-postgres-webapp-db)
    • Расположение → используйте то же расположение, которое использовалось для веб-приложения. Перейдите на другое местоположение, если это не работает.
    • public-accessNone который задает для сервера режим общего доступа без использования правил брандмауэра. Правила создаются на следующем шаге.
    • sku-name → Имя ценовой категории и конфигурации вычислений, например Standard_B1ms. Дополнительные сведения см. на странице цен на Базу данных Azure для PostgreSQL.
    • уровень → Уровень вычислений сервера. Дополнительные сведения см. на странице цен на Базу данных Azure для PostgreSQL.
    • active-directory-authEnabled для включения аутентификации Microsoft Entra.
  2. Создайте базу данных с именем fruits в службе PostgreSQL с помощью этой команды:

    DB_NAME=fruits
    az postgres flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $DB_SERVER_NAME \
        --database-name $DB_NAME
    
  3. Установите расширение "без пароля" для соединителя службы Azure CLI.

    az extension add --name serviceconnector-passwordless --upgrade --allow-preview true
    
  4. Подключите базу данных к приложению-контейнеру с управляемым удостоверением, назначаемое системой, с помощью команды подключения.

    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)

Когда на новой веб-странице появляется ваш список фруктов, ваше приложение подключается к базе данных с помощью управляемой учетной записи. Теперь вы сможете редактировать список фруктов, как и раньше.

Очистка ресурсов

На предыдущем шаге вы создали ресурсы Azure в группе ресурсов. Если эти ресурсы вам не понадобятся в будущем, вы можете удалить группу ресурсов, выполнив следующую команду в Cloud Shell:

az group delete --name myResourceGroup

Ее выполнение может занять до минуты.

Следующие шаги

Дополнительные сведения о запуске приложений Java в Azure см. в руководстве разработчика.