Share via


Tutorial: Verwenden eines PostgreSQL-Diensts für die Entwicklung

Mit Azure Container Apps können Sie eine Verbindung mit Entwicklungs- und Produktionsdiensten herstellen, um eine Vielzahl von Funktionen für Ihre Anwendungen bereitzustellen.

In diesem Tutorial erfahren Sie, wie Sie einen PostgreSQL-Entwicklungsdienst mit Container Apps verwenden.

Dieses Tutorial enthält Azure CLI-Befehle und Bicep-Vorlagenfragmente. Wenn Sie Bicep verwenden, können Sie alle Fragmente einer einzelnen Bicep-Datei hinzufügen und die Vorlage auf einmal bereitstellen.

  • Erstellen einer Container-Apps-Umgebung zur Bereitstellung Ihrer Dienste und Container-Apps
  • Erstellen eines PostgreSQL-Dienstes
  • Erstellen und Verwenden einer Befehlszeilenanwendung für die Verwendung des PostgreSQL-Entwicklungsdiensts
  • Erstellen einer pgweb-App
  • Schreiben von Daten in die PostgreSQL-Datenbank

Voraussetzungen

Hinweis

Für eine Bereitstellung mit einem Befehl springen Sie direkt zum letzten azd-Vorlagenschritt.

Einrichten

  1. Definieren Sie Variablen für gemeinsame Werte.

    RESOURCE_GROUP="postgres-dev"
    LOCATION="northcentralus"
    ENVIRONMENT="aca-env"
    PG_SVC="postgres01"
    PSQL_CLI_APP="psql-cloud-cli-app"
    
  2. Melden Sie sich bei Azure an.

    az login
    
  3. Führen Sie für die CLI ein Upgrade auf die aktuelle Version durch.

    az upgrade
    
  4. Aktualisieren Sie Bicep auf die aktuelle Version.

    az bicep upgrade
    
  5. Fügen Sie die Erweiterung containerapp hinzu.

    az extension add --name containerapp --upgrade
    
  6. Registrieren Sie die erforderlichen Namespaces.

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

Erstellen einer Container-Apps-Umgebung

  1. Erstellen Sie eine Ressourcengruppe.

    az group create \
        --name "$RESOURCE_GROUP" \
        --location "$LOCATION"
    
  2. Erstellen Sie eine Container Apps-Umgebung.

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

Erstellen eines PostgreSQL-Dienstes

  1. Erstellen Sie einen PostgreSQL-Dienst.

    az containerapp add-on postgres create \
        --name "$PG_SVC" \
        --resource-group "$RESOURCE_GROUP" \
        --environment "$ENVIRONMENT"
    
  2. Anzeigen der Protokollausgabe aus der Postgres-Instanz

    Verwenden Sie den Befehl logs, um Protokollnachrichten anzuzeigen.

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

    Screenshot der PostgreSQL-Dienstprotokolle der Container-App

Erstellen einer App zum Testen des Diensts

Wenn Sie die App erstellen, erstellen Sie zunächst eine Debug-App, um die psql-CLI zum Herstellen einer Verbindung mit der PostgreSQL-Instanz zu verwenden.

  1. Erstellen Sie eine psql-Anwendung, die an den PostgreSQL-Dienst gebunden ist.

    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. Führen Sie den CLI-Befehl exec zum Herstellen einer Verbindung mit der Testanwendung aus.

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

    Wenn Sie in der Test-App --bind oder serviceBinds verwenden, werden die Verbindungsinformationen in die Anwendungsumgebung eingefügt. Nachdem Sie eine Verbindung mit dem Testcontainer hergestellt haben, können Sie die Werte mithilfe des Befehls env untersuchen.

    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. Verwenden Sie psql, um eine Verbindung mit dem Dienst herzustellen.

    psql $POSTGRES_URL
    

    Screenshot einer Container-App, die pgsql verwendet, um eine Verbindung zu einem PostgreSQL-Dienst herzustellen

  4. Erstellen Sie eine Tabelle mit dem Namen accounts und fügen Sie Daten ein.

    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;
    

    Screenshot einer Container-App, die pgsql verwendet, um sich mit PostgreSQL zu verbinden und eine Tabelle mit einigen Daten zu erstellen

Verwenden eines Entwicklungsdienstes bei einer vorhandenen Anwendung

Wenn Sie bereits über eine App verfügen, die PostgreSQL verwendet, können Sie ändern, wie Verbindungsinformationen geladen werden.

Legen Sie zunächst die folgenden Umgebungsvariablen fest.

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...

Anschließend können Sie die Anwendung mithilfe der CLI (oder Bicep) aktualisieren, um --bind $PG_SVC hinzuzufügen, um den erstellten Entwicklungsdienst zu verwenden.

Bindung an den Entwicklungsdienst

Stellen Sie pgweb bereit, um die PostgreSQL-Instanz anzuzeigen und zu verwalten.

Siehe Bicep oder das Beispiel azd.

Screenshot der pgweb-Container App, die eine Verbindung zum PostgreSQL-Dienst herstellt

Bereitstellen aller Ressourcen

Verwenden Sie die folgenden Beispiele, wenn Sie alle Ressourcen gleichzeitig bereitstellen möchten.

Bicep

Die folgende Bicep-Vorlage enthält alle Ressourcen für dieses Tutorial.

Erstellen Sie eine Datei postgres-dev.bicep mit dem folgenden Inhalt.

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}'

Verwenden Sie die Azure CLI, um die Vorlage bereitzustellen.

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

Eine finale Vorlage finden Sie auf GitHub.

Verwenden Sie azd up zum Bereitstellen der Vorlage.

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

Bereinigen von Ressourcen

Führen Sie anschließend den folgenden Befehl aus, um die Ressourcengruppe zu löschen, die Ihre Container Apps-Ressourcen enthält.

Achtung

Mit dem folgenden Befehl werden die angegebene Ressourcengruppe und alle darin enthaltenen Ressourcen gelöscht. Falls in der angegebenen Ressourcengruppe Ressourcen enthalten sind, die nicht zum Umfang dieses Tutorials gehören, werden sie ebenfalls gelöscht.

az group delete \
    --resource-group $RESOURCE_GROUP