Dela via


Självstudie: Använda en PostgreSQL-tjänst för utveckling

Med Azure Container Apps kan du ansluta till tjänster i utvecklings- och produktionsklass för att tillhandahålla en mängd olika funktioner till dina program.

I den här självstudien lär du dig att använda en PostgreSQL-tjänst för utveckling med Container Apps.

Azure CLI-kommandon och Bicep-mallfragment finns med i den här självstudien. Om du använder Bicep kan du lägga till alla fragment i en enda Bicep-fil och distribuera mallen samtidigt.

  • Skapa en Container Apps-miljö för att distribuera dina tjänst- och containerappar
  • Skapa en PostgreSQL-tjänst
  • Skapa och använda en kommandoradsapp för att använda dev PostgreSQL-tjänsten
  • Skapa en pgweb-app
  • Skriva data till PostgreSQL-databasen

Förutsättningar

Kommentar

För en distribution med ett kommando går du vidare till det sista azd mallsteget.

Ställ in

  1. Definiera variabler för vanliga värden.

    RESOURCE_GROUP="postgres-dev"
    LOCATION="northcentralus"
    ENVIRONMENT="aca-env"
    PG_SVC="postgres01"
    PSQL_CLI_APP="psql-cloud-cli-app"
    
  2. Logga in på Azure.

    az login
    
  3. Uppgradera CLI till den senaste versionen.

    az upgrade
    
  4. Uppgradera Bicep till den senaste versionen.

    az bicep upgrade
    
  5. Lägg till det här containerapp tillägget.

    az extension add --name containerapp --upgrade
    
  6. Registrera nödvändiga namnområden.

    az provider register --namespace Microsoft.App
    
    az provider register --namespace Microsoft.OperationalInsights
    

Skapa en Container Apps-miljö

  1. Skapa en resursgrupp.

    az group create \
        --name "$RESOURCE_GROUP" \
        --location "$LOCATION"
    
  2. Skapa en Container Apps-miljö.

    az containerapp env create \
      --name "$ENVIRONMENT" \
      --resource-group "$RESOURCE_GROUP" \
      --location "$LOCATION"
    

Skapa en PostgreSQL-tjänst

  1. Skapa en PostgreSQL-tjänst.

    az containerapp add-on postgres create \
        --name "$PG_SVC" \
        --resource-group "$RESOURCE_GROUP" \
        --environment "$ENVIRONMENT"
    
  2. Visa loggutdata från Postgres-instansen

    logs Använd kommandot för att visa loggmeddelanden.

    az containerapp logs show \
        --name $PG_SVC \
        --resource-group $RESOURCE_GROUP \
        --follow --tail 30
    

    Skärmbild av postgreSQL-tjänstloggar för containerappen.

Skapa en app för att testa tjänsten

När du skapar appen börjar du med att skapa en felsökningsapp för att använda psql CLI för att ansluta till PostgreSQL-instansen.

  1. Skapa en psql app som binder till PostgreSQL-tjänsten.

    az containerapp create \
        --name "$PSQL_CLI_APP" \
        --image mcr.microsoft.com/k8se/services/postgres:14 \
        --bind "$PG_SVC" \
        --environment "$ENVIRONMENT" \
        --resource-group "$RESOURCE_GROUP" \
        --min-replicas 1 \
        --max-replicas 1 \
        --command "/bin/sleep" "infinity"
    
  2. Kör CLI-kommandot exec för att ansluta till testappen.

    az containerapp exec \
        --name $PSQL_CLI_APP \
        --resource-group $RESOURCE_GROUP \
        --command /bin/bash
    

    När du använder --bind eller serviceBinds i testappen matas anslutningsinformationen in i programmiljön. När du ansluter till testcontainern kan du kontrollera värdena med hjälp av env kommandot .

    env | grep "^POSTGRES_"
    
    POSTGRES_HOST=postgres01
    POSTGRES_PASSWORD=AiSf...
    POSTGRES_SSL=disable
    POSTGRES_URL=postgres://postgres:AiSf...@postgres01:5432/postgres?sslmode=disable
    POSTGRES_DATABASE=postgres
    POSTGRES_PORT=5432
    POSTGRES_USERNAME=postgres
    POSTGRES_CONNECTION_STRING=host=postgres01 database=postgres user=postgres password=AiSf...
    
  3. Vi psql ansluter till tjänsten

    psql $POSTGRES_URL
    

    Skärmbild av containerappen som använder pgsql för att ansluta till en PostgreSQL-tjänst.

  4. Skapa en tabell med namnet accounts och infoga data.

    postgres=# CREATE TABLE accounts (
        user_id serial PRIMARY KEY,
        username VARCHAR ( 50 ) UNIQUE NOT NULL,
        email VARCHAR ( 255 ) UNIQUE NOT NULL,
        created_on TIMESTAMP NOT NULL,
        last_login TIMESTAMP 
    );
    
    postgres=# INSERT INTO accounts (username, email, created_on)
    VALUES
    ('user1', 'user1@example.com', current_timestamp),
    ('user2', 'user2@example.com', current_timestamp),
    ('user3', 'user3@example.com', current_timestamp);
    
    postgres=# SELECT * FROM accounts;
    

    Skärmbild av containerappen med pgsql connect till PostgreSQL och skapa en tabell och hämta data.

Använda en utvecklingstjänst med en befintlig app

Om du redan har en app som använder PostgreSQL kan du ändra hur anslutningsinformation läses in.

Skapa först följande miljövariabler.

POSTGRES_HOST=postgres01
POSTGRES_PASSWORD=AiSf...
POSTGRES_SSL=disable
POSTGRES_URL=postgres://postgres:AiSf...@postgres01:5432/postgres?sslmode=disable
POSTGRES_DATABASE=postgres
POSTGRES_PORT=5432
POSTGRES_USERNAME=postgres
POSTGRES_CONNECTION_STRING=host=postgres01 database=postgres user=postgres password=AiSf...

Med hjälp av CLI (eller Bicep) kan du uppdatera appen att lägga --bind $PG_SVC till för att använda dev-tjänsten.

Bindning till utvecklingstjänsten

Distribuera pgweb för att visa och hantera PostgreSQL-instansen.

Se Bicep eller azd exempel.

Skärmbild av pgweb Container App som ansluter till PostgreSQL-tjänsten.

Distribuera alla resurser

Använd följande exempel om du vill distribuera alla resurser samtidigt.

Bicep

Följande Bicep-mall innehåller alla resurser i den här självstudien.

Du kan skapa en postgres-dev.bicep fil med det här innehållet.

targetScope = 'resourceGroup'
param location string = resourceGroup().location
param appEnvironmentName string = 'aca-env'
param pgSvcName string = 'postgres01'
param pgsqlCliAppName string = 'psql-cloud-cli-app'

resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2022-10-01' = {
  name: '${appEnvironmentName}-log-analytics'
  location: location
  properties: {
    sku: {
      name: 'PerGB2018'
    }
  }
}

resource appEnvironment 'Microsoft.App/managedEnvironments@2023-04-01-preview' = {
  name: appEnvironmentName
  location: location
  properties: {
    appLogsConfiguration: {
      destination: 'log-analytics'
      logAnalyticsConfiguration: {
        customerId: logAnalytics.properties.customerId
        sharedKey: logAnalytics.listKeys().primarySharedKey
      }
    }
  }
}

resource postgres 'Microsoft.App/containerApps@2023-04-01-preview' = {
name: pgSvcName
  location: location
  properties: {
    environmentId: appEnvironment.id
    configuration: {
      service: {
          type: 'postgres'
      }
    }
  }
}

resource pgsqlCli 'Microsoft.App/containerApps@2023-04-01-preview' = {
  name: pgsqlCliAppName
  location: location
  properties: {
    environmentId: appEnvironment.id
    template: {
      serviceBinds: [
        {
          serviceId: postgres.id
        }
      ]
      containers: [
        {
          name: 'psql'
          image: 'mcr.microsoft.com/k8se/services/postgres:14'
          command: [ '/bin/sleep', 'infinity' ]
        }
      ]
      scale: {
        minReplicas: 1
        maxReplicas: 1
      }
    }
  }
}

resource pgweb 'Microsoft.App/containerApps@2023-04-01-preview' = {
  name: 'pgweb'
  location: location
  properties: {
    environmentId: appEnvironment.id
    configuration: {
      ingress: {
        external: true
        targetPort: 8081
      }
    }
    template: {
      serviceBinds: [
        {
          serviceId: postgres.id
          name: 'postgres'
        }
      ]
      containers: [
        {
          name: 'pgweb'
          image: 'docker.io/sosedoff/pgweb:latest'
          command: [
            '/bin/sh'
          ]
          args: [
            '-c'
            'PGWEB_DATABASE_URL=$POSTGRES_URL /usr/bin/pgweb --bind=0.0.0.0 --listen=8081'
          ]
        }
      ]
    }
  }
}

output pgsqlCliExec string = 'az containerapp exec -n ${pgsqlCli.name} -g ${resourceGroup().name} --revision ${pgsqlCli.properties.latestRevisionName} --command /bin/bash'

output postgresLogs string = 'az containerapp logs show -n ${postgres.name} -g ${resourceGroup().name} --follow --tail 30'

output pgwebUrl string = 'https://${pgweb.properties.configuration.ingress.fqdn}'

Använd Azure CLI för att distribuera mallen.

RESOURCE_GROUP="postgres-dev"
LOCATION="northcentralus"

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

az deployment group create -g $RESOURCE_GROUP \
    --query 'properties.outputs.*.value' \
    --template-file postgres-dev.bicep

Azure Developer CLI

En slutlig mall finns på GitHub.

Använd azd up för att distribuera mallen.

git clone https://github.com/Azure-Samples/aca-dev-service-postgres-azd
cd aca-dev-service-postgres-azd
azd up

Rensa resurser

När du är klar kör du följande kommando för att ta bort resursgruppen som innehåller dina Container Apps-resurser.

Varning

Följande kommando tar bort den angivna resursgruppen och alla resurser som ingår i den. Om det finns resurser utanför omfånget för den här självstudien i den angivna resursgruppen tas de också bort.

az group delete \
    --resource-group $RESOURCE_GROUP