Tutorial: Conectar-se ao Banco de Dados PostgreSQL de um Aplicativo de Contêiner do Java Quarkus sem segredos usando uma identidade gerenciada
Aplicativos de Contêiner do Azure fornece uma identidade gerenciada para seu aplicativo, que é uma solução perfeita para proteger o acesso a oBanco de Dados do Azure para PostgreSQL e outros serviços do Azure. As identidades gerenciadas em Aplicativos de Contêiner tornam seu aplicativo mais seguro eliminando segredos de seu aplicativo, como credenciais nas variáveis de ambiente.
Este tutorial orienta você no processo de criação, configuração, implantação e colocação em escala de aplicativos de contêiner Java no Azure. No final desse tutorial, você verá um aplicativo Quarkus armazenando dados em um banco de dados PostgreSQL com uma identidade gerenciada em execução nos Aplicativos de Contêiner.
O que você aprende:
- Configure um aplicativo Quarkus para autenticar usando o Microsoft Entra ID com um banco de dados PostgreSQL.
- Criar um registro de contêiner do Azure e enviar uma imagem de aplicativo Java por push para ele.
- Criar um aplicativo de contêiner no Azure.
- Criar um banco de dados PostgreSQL no Azure.
- Conecte-se a um Banco de Dados PostgreSQL com identidade gerenciada usando o Conector de serviço.
Caso você não tenha uma assinatura do Azure, crie uma conta gratuita do Azure antes de começar.
1. Pré-requisitos
- CLI do Azure versão 2.45.0 ou posterior.
- Git
- Java JDK
- Maven
- Docker
2. Criar um registro de contêiner
Crie um grupo de recursos com o comando az group create. Um grupo de recursos do Azure é um contêiner lógico no qual os recursos do Azure são implantados e gerenciados.
O exemplo a seguir cria um grupo de recursos chamado myResourceGroup
na região Leste dos EUA do Azure.
RESOURCE_GROUP="myResourceGroup"
LOCATION="eastus"
az group create --name $RESOURCE_GROUP --location $LOCATION
Crie uma instância de registro de contêiner do Azure usando o comando az acr create e recupere seu servidor de login usando o comando az acr show. O nome do registro deve ser exclusivo no Azure e conter de 5 a 50 caracteres alfanuméricos. Todas as letras devem ser especificados em minúsculas. No exemplo a seguir, mycontainerregistry007
é usado. Atualize-o para um valor exclusivo.
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. Clonar o aplicativo de amostra e preparar a imagem de contêiner
Este tutorial usa um aplicativo de lista Fruits de exemplo com uma interface do usuário da Web que chama uma API REST do Quarkus com suporte do Banco de Dados do Azure para PostgreSQL. O código para o aplicativo está disponível no GitHub. Para saber mais sobre como escrever aplicativos Java usando Quarkus e PostgreSQL, consulte o ORM Quarkus Hibernate com o Guia do Panache e o Guia de Fonte de Dados do Quarkus.
Execute os seguintes comandos no seu terminal para clonar o repositório de exemplo e configurar o ambiente de aplicativo de exemplo.
git clone https://github.com/quarkusio/quarkus-quickstarts
cd quarkus-quickstarts/hibernate-orm-panache-quickstart
Modifique seu projeto
Adicione as dependências necessárias ao arquivo POM do seu projeto.
<dependency> <groupId>com.azure</groupId> <artifactId>azure-identity-extensions</artifactId> <version>1.1.20</version> </dependency>
Configure as propriedades do aplicativo Quarkus.
A configuração do Quarkus está localizada no arquivo src/main/resources/application.properties. Abra esse arquivo em seu editor e observe várias propriedades padrão. As propriedades prefixadas são
%prod
usadas somente quando o aplicativo é criado e implantado, por exemplo, quando implantado em Serviço de Aplicativo do Azure. Quando o aplicativo é executado localmente, as propriedades%prod
são ignoradas. Da mesma forma, as propriedades%dev
são usadas no modo Live Coding/Dev do Quarkus e as propriedades%test
são usadas durante testes contínuos.Exclua o conteúdo existente em application.properties e substitua pelo seguinte para configurar nosso banco de dados para modos de desenvolvimento, teste e produção:
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
Crie e envie uma imagem do Docker para o registro de contêiner
Compile a imagem de contêiner.
Execute o comando a seguir para criar a imagem de aplicativo Quarkus. Você deve marcá-lo com o nome totalmente qualificado de seu servidor de login de registro.
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}
Efetue logon no registro.
Antes de efetuar push de imagens de contêiner, efetue login no registro. Para fazer isso, use o comando [az acr login][az-acr-login].
az acr login --name $REGISTRY_NAME
O comando retorna uma mensagem
Login Succeeded
na conclusão.Efetue push da imagem para o registro.
Use
docker push
para enviar a imagem por push para a instância do Registro. Este exemplo cria o repositórioquarkus-postgres-passwordless-app
, que contém a imagemquarkus-postgres-passwordless-app:v1
.docker push $CONTAINER_IMAGE
4. Criar um aplicativo de contêiner no Azure
Crie uma instância de Aplicativos de Contêiner executando o comando a seguir. Certifique-se de substituir o valor das variáveis de ambiente pelo nome e local reais que deseja usar.
CONTAINERAPPS_ENVIRONMENT="my-environment" az containerapp env create \ --resource-group $RESOURCE_GROUP \ --name $CONTAINERAPPS_ENVIRONMENT \ --location $LOCATION
Crie um aplicativo de contêiner com a imagem do seu aplicativo executando o seguinte comando:
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
Observação
As opções
--registry-username
e--registry-password
ainda são suportadas, mas não são recomendadas porque usar o sistema de identidade é mais seguro.
5. Criar e conectar um banco de dados PostgreSQL com conectividade de identidade
Em seguida, crie um banco de dados PostgreSQL e configure seu aplicativo de contêiner para se conectar a um banco de dados PostgreSQL com uma identidade gerenciada atribuída pelo sistema. O aplicativo Quarkus se conecta a esse banco de dados e armazena seus dados durante a execução, persistindo o estado do aplicativo independentemente de onde você o executar.
Crie o serviço de banco de dados.
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
Observação
As opções
--admin-user
e--admin-password
ainda são suportadas, mas não são recomendadas porque usar o sistema de identidade é mais seguro.Os seguintes parâmetros são usados no comando acima da CLI do Azure:
- grupo de recursos → Use o mesmo nome de grupo de recursos no qual você criou o aplicativo Web - por exemplo,
msdocs-quarkus-postgres-webapp-rg
. - nome → o nome do servidor de banco de dados PostgreSQL. Esse nome deve ser exclusivo em todo o Azure (o ponto de extremidade do servidor se torna
https://<name>.postgres.database.azure.com
). Os caracteres permitidos sãoA
-Z
,0
-9
e-
. Um bom padrão é usar uma combinação do nome da empresa e um identificador do servidor. (msdocs-quarkus-postgres-webapp-db
) - local → usa o mesmo local usado para o aplicativo Web. Altere para um local diferente se não funcionar.
- public-access →
None
que define o servidor no modo de acesso público sem regras de firewall. As regras são criadas em uma etapa posterior. - sku-name → O nome do tipo de preço e configuração de computação - por exemplo,
Standard_B1ms
. Para obter mais informações, confira Preços do Banco de Dados do Azure para PostgreSQL. - tier →.A camada de computação do servidor. Para obter mais informações, confira Preços do Banco de Dados do Azure para PostgreSQL.
- active-directory-auth →
Enabled
para habilitar a autenticação do Microsoft Entra.
- grupo de recursos → Use o mesmo nome de grupo de recursos no qual você criou o aplicativo Web - por exemplo,
Crie um banco de dados nomeado
fruits
dentro do serviço Postgres com este comando:DB_NAME=fruits az postgres flexible-server db create \ --resource-group $RESOURCE_GROUP \ --server-name $DB_SERVER_NAME \ --database-name $DB_NAME
Instale a extensão sem senha do Conector de Serviço para a CLI do Azure:
az extension add --name serviceconnector-passwordless --upgrade --allow-preview true
Conecte o banco de dados ao aplicativo de contêiner com uma identidade gerenciada atribuída pelo sistema usando o comando de conexão.
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. Examinar as alterações
Você pode encontrar a URL do aplicativo (FQDN) usando o seguinte comando:
echo https://$(az containerapp show \
--name $APP_NAME \
--resource-group $RESOURCE_GROUP \
--query properties.configuration.ingress.fqdn \
--output tsv)
Quando a nova página da Web mostra sua lista de frutas, seu aplicativo está se conectando ao banco de dados usando a identidade gerenciada. Agora você deve poder editar a lista de frutas como antes.
Limpar os recursos
Nas etapas anteriores, você criou os recursos do Azure em um grupo de recursos. Se você acha que não precisará desses recursos no futuro, exclua o grupo de recursos executando o seguinte comando no Cloud Shell:
az group delete --name myResourceGroup
Esse comando pode demorar um pouco para ser executado.
Próximas etapas
Saiba mais sobre como executar aplicativos Java no Azure no guia do desenvolvedor.