Samouczek: używanie usługi PostgreSQL do programowania

Usługa Azure Container Apps umożliwia łączenie się z usługami programowania i klasy produkcyjnej w celu zapewnienia szerokiej gamy funkcji aplikacji.

Z tego samouczka dowiesz się, jak używać usługi PostgreSQL w usłudze Container Apps.

W tym samouczku przedstawiono polecenia interfejsu wiersza polecenia platformy Azure i fragmenty szablonów Bicep. Jeśli używasz Bicep, możesz dodać wszystkie fragmenty do pojedynczego pliku Bicep i wdrożyć szablon jednocześnie.

  • Tworzenie środowiska usługi Container Apps w celu wdrożenia aplikacji usługi i kontenera
  • Tworzenie usługi PostgreSQL
  • Tworzenie i używanie aplikacji wiersza polecenia do korzystania z usługi dev PostgreSQL
  • Tworzenie aplikacji pgweb
  • Zapisywanie danych w bazie danych PostgreSQL

Wymagania wstępne

Uwaga

W przypadku jednego wdrożenia polecenia przejdź do ostatniego azdkroku szablonu.

Konfigurowanie

  1. Zdefiniuj zmienne dla typowych wartości.

    RESOURCE_GROUP="postgres-dev"
    LOCATION="northcentralus"
    ENVIRONMENT="aca-env"
    PG_SVC="postgres01"
    PSQL_CLI_APP="psql-cloud-cli-app"
    
  2. Loguje się do platformy Azure.

    az login
    
  3. Uaktualnij interfejs wiersza polecenia do najnowszej wersji.

    az upgrade
    
  4. Uaktualnij program Bicep do najnowszej wersji.

    az bicep upgrade
    
  5. Dodaj rozszerzenie th containerapp .

    az extension add --name containerapp --upgrade
    
  6. Zarejestruj wymagane przestrzenie nazw.

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

Tworzenie środowiska usługi Container Apps

  1. Utwórz grupę zasobów.

    az group create \
        --name "$RESOURCE_GROUP" \
        --location "$LOCATION"
    
  2. Tworzenie środowiska usługi Container Apps.

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

Tworzenie usługi PostgreSQL

  1. Utwórz usługę PostgreSQL.

    az containerapp add-on postgres create \
        --name "$PG_SVC" \
        --resource-group "$RESOURCE_GROUP" \
        --environment "$ENVIRONMENT"
    
  2. Wyświetlanie danych wyjściowych dziennika z wystąpienia bazy danych Postgres

    Użyj polecenia , logs aby wyświetlić komunikaty dziennika.

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

    Zrzut ekranu przedstawiający dzienniki usługi PostgreSQL aplikacji kontenera.

Tworzenie aplikacji do testowania usługi

Po utworzeniu aplikacji zaczniesz od utworzenia aplikacji debugowania, aby używać interfejsu psql wiersza polecenia do nawiązywania połączenia z wystąpieniem bazy danych PostgreSQL.

  1. Utwórz aplikację powiązaną psql z usługą PostgreSQL.

    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. Uruchom polecenie interfejsu wiersza polecenia exec , aby nawiązać połączenie z aplikacją testowa.

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

    W przypadku korzystania z --bind aplikacji testowej lub serviceBinds w aplikacji testowej informacje o połączeniu są wstrzykiwane do środowiska aplikacji. Po nawiązaniu połączenia z kontenerem testowym możesz sprawdzić wartości przy użyciu env polecenia .

    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. Aby psql nawiązać połączenie z usługą

    psql $POSTGRES_URL
    

    Zrzut ekranu przedstawiający aplikację kontenera używającą narzędzia pgsql do nawiązywania połączenia z usługą PostgreSQL.

  4. Utwórz tabelę o nazwie accounts i wstaw dane.

    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;
    

    Zrzut ekranu przedstawiający aplikację kontenera korzystającą z narzędzia pgsql connect z bazą danych PostgreSQL i utwórz tabelę i wsiej dane.

Używanie usługi dewelopera z istniejącą aplikacją

Jeśli masz już aplikację korzystającą z bazy danych PostgreSQL, możesz zmienić sposób ładowania informacji o połączeniu.

Najpierw utwórz następujące zmienne środowiskowe.

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

Za pomocą interfejsu wiersza polecenia (lub Bicep) możesz zaktualizować aplikację, aby dodać --bind $PG_SVC aplikację do korzystania z usługi dewelopera.

Wiązanie z usługą dewelopera

Wdróż aplikację pgweb , aby wyświetlić wystąpienie bazy danych PostgreSQL i zarządzać nim.

Zobacz Bicep lub azd przykład.

Zrzut ekranu przedstawiający aplikację kontenera pgweb łączącą się z usługą PostgreSQL.

Wdrażanie wszystkich zasobów

Skorzystaj z poniższych przykładów, aby wdrożyć wszystkie zasoby jednocześnie.

Bicep

Poniższy szablon Bicep zawiera wszystkie zasoby w tym samouczku.

Możesz utworzyć postgres-dev.bicep plik z tą zawartością.

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

Użyj interfejsu wiersza polecenia platformy Azure, aby wdrożyć go w szablonie.

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

Ostateczny szablon jest dostępny w witrynie GitHub.

Użyj polecenia azd up , aby wdrożyć szablon.

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

Czyszczenie zasobów

Po zakończeniu uruchom następujące polecenie, aby usunąć grupę zasobów zawierającą zasoby usługi Container Apps.

Przestroga

Następujące polecenie usuwa określoną grupę zasobów i wszystkie zawarte w niej zasoby. Jeśli zasoby spoza zakresu tego samouczka istnieją w określonej grupie zasobów, zostaną również usunięte.

az group delete \
    --resource-group $RESOURCE_GROUP