Tutorial: usar um serviço PostgreSQL para desenvolvimento

Os Aplicativos de Contêiner do Azure permitem que você se conecte aos serviços de desenvolvimento e de nível de produção para fornecer uma ampla variedade de funcionalidades aos seus aplicativos.

Neste tutorial, você aprenderá a usar um serviço PostgreSQL de desenvolvimento com Aplicativos de Contêiner.

Os comandos da CLI do Azure e os fragmentos de modelo do Bicep são apresentados neste tutorial. Se você usar o Bicep, poderá adicionar todos os fragmentos a um único arquivo Bicep e implantar o modelo de uma só vez.

  • Criar um ambiente de Aplicativos de Contêiner para implantar seu serviço e seus aplicativos de contêiner
  • Criar um serviço do PostgreSQL
  • Criar e usar um aplicativo de linha de comando para usar o serviço PostgreSQL de desenvolvimento
  • Criar um aplicativo pgweb
  • Gravar dados no banco de dados PostgreSQL

Pré-requisitos

Observação

Para uma implantação de comando, pule para a última azd etapa do modelo.

Configuração

  1. Defina variáveis para valores comuns.

    RESOURCE_GROUP="postgres-dev"
    LOCATION="northcentralus"
    ENVIRONMENT="aca-env"
    PG_SVC="postgres01"
    PSQL_CLI_APP="psql-cloud-cli-app"
    
  2. Fazer logon no Azure.

    az login
    
  3. Atualize a CLI para a versão mais recente.

    az upgrade
    
  4. Atualize o Bicep para a versão mais recente.

    az bicep upgrade
    
  5. Adicione a extensão containerapp.

    az extension add --name containerapp --upgrade
    
  6. Registre os namespaces necessários.

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

Criar um ambiente dos Aplicativos de Contêiner

  1. Crie um grupo de recursos.

    az group create \
        --name "$RESOURCE_GROUP" \
        --location "$LOCATION"
    
  2. Criar um ambiente dos Aplicativos de Contêiner.

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

Criar um serviço do PostgreSQL

  1. Criar um serviço do PostgreSQL.

    az containerapp add-on postgres create \
        --name "$PG_SVC" \
        --resource-group "$RESOURCE_GROUP" \
        --environment "$ENVIRONMENT"
    
  2. Exibir a saída do log da instância de Postgres

    Use o comando logs para exibir mensagens de log.

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

    Captura de tela dos logs de serviço PostgreSQL do aplicativo de contêiner.

Criar um aplicativo para testar o serviço

Ao criar o aplicativo, você começa criando um aplicativo de depuração para usar a CLI psql e conectar a instância do PostgreSQL.

  1. Criar um aplicativo psql que se vincula ao serviço 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. Execute o comando exec da CLI para se conectar ao aplicativo de teste.

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

    Ao usar --bind ou serviceBinds no aplicativo de teste, as informações de conexão são injetadas no ambiente do aplicativo. Depois de se conectar ao contêiner de teste, você pode inspecionar os valores usando o comando env.

    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. Nós para nos psql conectarmos ao serviço

    psql $POSTGRES_URL
    

    Captura de tela do aplicativo de contêiner usando pqsql para se conectar a um serviço PostgreSQL.

  4. Criar uma tabela de nome accounts e inserir dados.

    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;
    

    Captura de tela de um aplicativo de contêiner usando pgsql para se conectar ao PostgreSQL e criar uma tabela e semar dados.

Usando um serviço de desenvolvimento com um aplicativo existente

Se você já tiver um aplicativo que usa o PostgreSQL, poderá alterar a forma como as informações de conexão são carregadas.

Primeiro, crie as variáveis de ambiente a seguir.

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

Usando a CLI (ou o Bicep), você pode atualizar o aplicativo para adicionar --bind $PG_SVC e usar o serviço de desenvolvimento.

Associação ao serviço de desenvolvimento

Implante pgweb para exibir e gerenciar a instância do PostgreSQL.

Consulte o Bicep ou o exemplo azd.

Captura de tela do aplicativo pgweb Container conectando-se ao serviço PostgreSQL.

Implantar todos os recursos

Use os exemplos a seguir para se você quiser implantar todos os recursos de uma só vez.

Bicep

O modelo Bicep a seguir contém todos os recursos neste tutorial.

Você pode criar um arquivo postgres-dev.bicep com este conteúdo.

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

Use a CLI do Azure para implantá-lo no modelo.

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

CLI do Desenvolvedor do Azure

Um modelo final está disponível no GitHub.

Use azd up para implantar o modelo.

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

Limpar os recursos

Quando terminar, execute o comando a seguir para excluir o grupo de recursos que contém os recursos dos seus Aplicativos de Contêiner.

Cuidado

O comando a seguir exclui o grupo de recursos especificado e todos os recursos contidos nele. Se existirem recursos fora do escopo deste tutorial no grupo de recursos especificado, eles também serão excluídos.

az group delete \
    --resource-group $RESOURCE_GROUP