Share via


Självstudie: Anslut till PostgreSQL Database från en Java Quarkus-containerapp utan hemligheter med hjälp av en hanterad identitet

Azure Container Apps tillhandahåller en hanterad identitet för din app, vilket är en nyckelfärdig lösning för att skydda åtkomsten till Azure Database for PostgreSQL och andra Azure-tjänster. Hanterade identiteter i Container Apps gör din app säkrare genom att eliminera hemligheter från din app, till exempel autentiseringsuppgifter i miljövariablerna.

Den här självstudien beskriver hur du skapar, konfigurerar, distribuerar och skalar Java-containerappar i Azure. I slutet av den här självstudien har du ett Quarkus-program som lagrar data i en PostgreSQL-databas med en hanterad identitet som körs i Container Apps.

Vad du kommer att lära dig:

  • Konfigurera en Quarkus-app för att autentisera med hjälp av Microsoft Entra-ID med en PostgreSQL-databas.
  • Skapa ett Azure-containerregister och skicka en Java-appavbildning till det.
  • Skapa en containerapp i Azure.
  • Skapa en PostgreSQL-databas i Azure.
  • Anslut till en PostgreSQL-databas med hanterad identitet med hjälp av Service Anslut or.

Om du inte har en Azure-prenumeration skapar du ett kostnadsfritt Azure-konto innan du börjar.

1. Förutsättningar

2. Skapa ett containerregister

Skapa en resursgrupp med kommandot az group create. En Azure-resursgrupp är en logisk container där Azure-resurser distribueras och hanteras.

I följande exempel skapas en resursgrupp med namnet myResourceGroup i Azure-regionen USA, östra.

az group create --name myResourceGroup --location eastus

Skapa en Azure-containerregisterinstans med kommandot az acr create . Registernamnet måste vara unikt i Azure och innehålla 5–50 alfanumeriska tecken. Alla bokstäver måste anges i gemener. I följande exempel mycontainerregistry007 används. Uppdatera det här till ett unikt värde.

az acr create \
    --resource-group myResourceGroup \
    --name mycontainerregistry007 \
    --sku Basic

3. Klona exempelappen och förbered containeravbildningen

I den här självstudien används en exempelapp för fruktlistan med ett webbgränssnitt som anropar ett Quarkus REST API som backas upp av Azure Database for PostgreSQL. Koden för appen är tillgänglig på GitHub. Mer information om hur du skriver Java-appar med Quarkus och PostgreSQL finns i Quarkus Hibernate ORM med Panache Guide och Quarkus Datasource Guide.

Kör följande kommandon i terminalen för att klona exempelrepo och konfigurera exempelappmiljön.

git clone https://github.com/quarkusio/quarkus-quickstarts
cd quarkus-quickstarts/hibernate-orm-panache-quickstart

Ändra projektet

  1. Lägg till nödvändiga beroenden i projektets BOM-fil.

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity-providers-jdbc-postgresql</artifactId>
        <version>1.0.0-beta.1</version>
    </dependency>
    
  2. Konfigurera quarkus-appegenskaperna.

    Quarkus-konfigurationen finns i filen src/main/resources/application.properties . Öppna den här filen i redigeringsprogrammet och observera flera standardegenskaper. Egenskaperna som prefixet har %prod används endast när programmet skapas och distribueras, till exempel när det distribueras till Azure App Service. När programmet körs lokalt %prod ignoreras egenskaperna. %dev På samma sätt används egenskaper i Quarkus Live Coding/Dev-läge, och %test egenskaper används under kontinuerlig testning.

    Ta bort det befintliga innehållet i application.properties och ersätt med följande för att konfigurera databasen för utvecklings-, test- och produktionslägen:

    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
    

Skapa och push-överföra en Docker-avbildning till containerregistret

  1. Skapa containeravbildningen.

    Kör följande kommando för att skapa Quarkus-appbilden. Du måste tagga den med det fullständigt kvalificerade namnet på registerinloggningsservern. Inloggningsservernamnet är i formatet registry-name.azurecr.io> (måste vara alla gemener), till exempel mycontainerregistry007.azurecr.io.< Ersätt namnet med ditt eget registernamn.

    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
    
  2. Logga in på registret.

    Innan du skickar containeravbildningar måste du logga in i registret. Det gör du med kommandot [az acr login][az-acr-login]. Ange endast namnet på registerresursen när du loggar in med Azure CLI. Använd inte det fullständigt kvalificerade inloggningsservernamnet.

    az acr login --name <registry-name>
    

    Kommandot returnerar meddelandet Login Succeeded när det har slutförts.

  3. Push-överför avbildningen till registret.

    Använd [docker push][docker-push] för att skicka avbildningen till registerinstansen. Ersätt mycontainerregistry007 med inloggningsservernamnet för registerinstansen. Det här exemplet skapar lagringsplatsen quarkus-postgres-passwordless-app som innehåller avbildningen quarkus-postgres-passwordless-app:v1 .

    docker push mycontainerregistry007/quarkus-postgres-passwordless-app:v1
    

4. Skapa en containerapp i Azure

  1. Skapa en Container Apps-instans genom att köra följande kommando. Se till att du ersätter värdet för miljövariablerna med det faktiska namn och den plats som du vill använda.

    RESOURCE_GROUP="myResourceGroup"
    LOCATION="eastus"
    CONTAINERAPPS_ENVIRONMENT="my-environment"
    
    az containerapp env create \
        --resource-group $RESOURCE_GROUP \
        --name $CONTAINERAPPS_ENVIRONMENT \
        --location $LOCATION
    
  2. Skapa en containerapp med din appavbildning genom att köra följande kommando. Ersätt platshållarna med värdena. Information om hur du hittar administratörskontot för containerregistret finns i Autentisera med ett Azure-containerregister

    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. Skapa och ansluta en PostgreSQL-databas med identitetsanslutning

Skapa sedan en PostgreSQL-databas och konfigurera containerappen så att den ansluter till en PostgreSQL-databas med en systemtilldelad hanterad identitet. Quarkus-appen ansluter till den här databasen och lagrar sina data när den körs, vilket bevarar programtillståndet oavsett var du kör programmet.

  1. Skapa databastjänsten.

    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
    

Följande parametrar används i ovanstående Azure CLI-kommando:

  • resource-group → Använd samma resursgruppsnamn där du skapade webbappen, till exempel msdocs-quarkus-postgres-webapp-rg.

  • namn → PostgreSQL-databasserverns namn. Det här namnet måste vara unikt i hela Azure (serverslutpunkten blir https://<name>.postgres.database.azure.com). Tillåtna tecken är A-Z,-09 och .- Ett bra mönster är att använda en kombination av företagets namn och serveridentifierare. (msdocs-quarkus-postgres-webapp-db)

  • plats → Använd samma plats som används för webbappen.

  • admin-user → Användarnamn för administratörskontot. Det får inte vara azure_superuser, admin, administrator, root, guesteller public. Till exempel, demoadmin är okej.

  • admin-password → Lösenord för administratörsanvändaren. Den måste innehålla mellan 8 och 128 tecken från tre av följande kategorier: engelska versaler, engelska gemener, siffror och icke-alfanumeriska tecken.

    Viktigt!

    När du skapar användarnamn eller lösenord använder $ du inte tecknet. Senare i den här självstudien skapar du miljövariabler med dessa värden där $ tecknet har särskild betydelse i Linux-containern som används för att köra Java-appar.

  • public-accessNone som anger servern i offentligt åtkomstläge utan brandväggsregler. Regler skapas i ett senare steg.

  • sku-name → Namnet på prisnivån och beräkningskonfigurationen, till exempel GP_Gen5_2. Mer information finns i Priser för Azure Database for PostgreSQL.

  1. Skapa en databas med namnet fruits i PostgreSQL-tjänsten med det här kommandot:

    az postgres flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $DB_SERVER_NAME \
        --database-name fruits
    
  2. Installera tillägget Service Anslut eller passwordless för Azure CLI:

    az extension add --name serviceconnector-passwordless --upgrade
    
  3. Anslut databasen till containerappen med en systemtilldelad hanterad identitet med hjälp av anslutningskommandot.

    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. Granska dina ändringar

Du hittar programmets URL (FQDN) med hjälp av följande kommando:

az containerapp list --resource-group $RESOURCE_GROUP

När den nya webbsidan visar din lista över frukter ansluter appen till databasen med hjälp av den hanterade identiteten. Nu bör du kunna redigera fruktlistan som tidigare.

Rensa resurser

I de föregående stegen skapade du Azure-resurser i en resursgrupp. Om du inte tror att du behöver dessa resurser i framtiden tar du bort resursgruppen genom att köra följande kommando i Cloud Shell:

az group delete --name myResourceGroup

Det kan några minuter att köra kommandot.

Nästa steg

Läs mer om att köra Java-appar på Azure i utvecklarguiden.