Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Os Aplicativos de Contêiner do Azure fornecem uma identidade gerenciada para seu aplicativo, que é uma solução turn-key para proteger o acesso ao Banco 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ê pelo processo de criação, configuração, implantação e dimensionamento de aplicativos de contêiner Java no Azure. No final deste tutorial, você tem um aplicativo Quarkus armazenando dados em um banco de dados PostgreSQL com uma identidade gerenciada em execução em Aplicativos de Contêiner.
O que você aprende:
- Configure uma aplicação Quarkus para autenticar-se com o Microsoft Entra ID com uma base de dados PostgreSQL.
- Crie uma instância do Registro de Contêiner do Azure e envie por push uma imagem do aplicativo Java para ela.
- Crie um aplicativo de contêiner no Azure.
- Crie um banco de dados PostgreSQL no Azure.
- Conecte-se a um banco de dados PostgreSQL com identidade gerenciada usando o Service Connector.
Se não tiver uma conta do Azure, crie uma conta gratuita antes de começar.
1. Pré-requisitos
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 contentor lógico no qual os recursos do Azure são implementados e geridos.
O exemplo a seguir cria um grupo de recursos nomeado myResourceGroup na região Azure Leste dos EUA.
RESOURCE_GROUP="myResourceGroup"
LOCATION="eastus"
az group create --name $RESOURCE_GROUP --location $LOCATION
Crie uma instância do Registro de Contêiner do Azure usando o comando az acr create e recupere seu servidor de logon usando o comando az acr show . O nome do registo tem de ser exclusivo no Azure e conter de 5 a 50 carateres alfanuméricos. Todas as letras devem ser especificadas em minúsculas. No exemplo a seguir, mycontainerregistry007 é usado. Atualize 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. Clone o aplicativo de exemplo e prepare a imagem do contêiner
Este tutorial usa um aplicativo de lista de frutas de exemplo, com uma interface Web de utilizador que invoca uma API REST do Quarkus, suportada pelo Banco de Dados do Azure para PostgreSQL. O código do aplicativo está disponível no GitHub. Para saber mais sobre como escrever aplicativos Java usando Quarkus e PostgreSQL, consulte o Quarkus Hibernate ORM with Panache Guide e o Quarkus Datasource Guide.
Execute os seguintes comandos em seu terminal para clonar o repositório de exemplo e configurar o ambiente do aplicativo de exemplo.
git clone https://github.com/quarkusio/quarkus-quickstarts
cd quarkus-quickstarts/hibernate-orm-panache-quickstart
Modificar o 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.2.0</version> </dependency>Configure as propriedades do aplicativo Quarkus.
A configuração do Quarkus está localizada no arquivo src/main/resources/application.properties . Abra este arquivo em seu editor e observe várias propriedades padrão. As propriedades prefixadas com
%prodsão usadas somente quando o aplicativo é criado e implantado, por exemplo, quando implantado no Serviço de Aplicativo do Azure. Quando o aplicativo é executado localmente,%prodas propriedades são ignoradas. Da mesma forma,%devas propriedades são usadas no modo Live Coding / Dev do Quarkus, e%testas propriedades são usadas durante testes contínuos.Exclua o conteúdo existente em application.properties e substitua pelo seguinte para configurar o banco de dados para os 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
Criar e carregar uma imagem do Docker para o registo de contentores
Crie a imagem do contêiner.
Execute o seguinte comando para criar a imagem do aplicativo Quarkus. Você deve marcá-lo com o nome totalmente qualificado do seu servidor de login do 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}Inicie sessão no registo da aplicação.
Antes de enviar imagens de contêiner, você deve fazer login no registro. Para fazer isso, use o comando [az acr login][az-acr-login].
az acr login --name $REGISTRY_NAMEO comando devolve uma mensagem de
Login Succeededdepois de estar concluído.Envie a imagem para o registo.
Use
docker pushpara enviar a imagem para a instância do Registro. Este exemplo cria oquarkus-postgres-passwordless-apprepositório, contendo aquarkus-postgres-passwordless-app:v1imagem.docker push $CONTAINER_IMAGE
4. Criar um aplicativo de contêiner no Azure
Crie uma instância de Container Apps executando o seguinte comando. Certifique-se de substituir o valor das variáveis de ambiente pelo nome real e local que você deseja usar.
CONTAINERAPPS_ENVIRONMENT="my-environment" az containerapp env create \ --resource-group $RESOURCE_GROUP \ --name $CONTAINERAPPS_ENVIRONMENT \ --location $LOCATIONCrie um aplicativo de contêiner com a imagem do 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 1Nota
As opções
--registry-usernamee--registry-passwordainda são suportadas, mas não são recomendadas porque usar o sistema de identidade é mais seguro.
5. Crie e conecte 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, não importa onde você execute o aplicativo.
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 EnabledNota
As opções
--admin-usere--admin-passwordainda 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 da CLI do Azure acima:
-
grupo de recursos → Use o mesmo nome do grupo de recursos no qual criou a aplicação web - por exemplo,
msdocs-quarkus-postgres-webapp-rg. -
name → O nome do servidor de banco de dados PostgreSQL. Esse nome deve ser exclusivo em todo o Azure (o ponto de extremidade do servidor passará a ser
https://<name>.postgres.database.azure.com). Os caracteres permitidos sãoA-Z,0-9e .-Um bom padrão é usar uma combinação do nome da sua empresa e do identificador do servidor. (msdocs-quarkus-postgres-webapp-db) - localização → Use o mesmo local usado para o aplicativo Web. Mude para um local diferente se não funcionar.
- →
Noneque 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 da camada de preços e da configuração de computação - por exemplo,
Standard_B1ms. Para obter mais informações, consulte os preços do Azure Base de Dados para PostgreSQL. - camada → A camada de computação do servidor. Para obter mais informações, consulte os preços do Azure Base de Dados para PostgreSQL.
-
active-directory-auth →
Enabledpara habilitar a autenticação do Microsoft Entra.
-
grupo de recursos → Use o mesmo nome do grupo de recursos no qual criou a aplicação web - por exemplo,
Crie um banco de dados nomeado
fruitsdentro do serviço PostgreSQL com este comando:DB_NAME=fruits az postgres flexible-server db create \ --resource-group $RESOURCE_GROUP \ --server-name $DB_SERVER_NAME \ --database-name $DB_NAMEInstale a extensão sem senha do Service Connector para a CLI do Azure:
az extension add --name serviceconnector-passwordless --upgrade --allow-preview trueConecte o banco de dados ao aplicativo contêiner com uma identidade gerenciada atribuída ao sistema, usando o comando connection.
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. Reveja 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 ser capaz de editar a lista de frutas como antes.
Limpar recursos
Nos passos anteriores, criou os recursos do Azure num grupo de recursos. Se achar que não vai precisar destes recursos no futuro, execute o seguinte comando no Cloud Shell para eliminar o grupo de recursos:
az group delete --name myResourceGroup
Esse comando pode levar um minuto para ser executado.
Próximos passos
Saiba mais sobre como executar aplicativos Java no Azure no guia do desenvolvedor.