Share via


Tutorial: Utilizar um serviço PostgreSQL para desenvolvimento

O Azure Container Apps permite-lhe ligar-se a serviços de programação e de nível de produção para fornecer uma grande variedade de funcionalidades às suas aplicações.

Neste tutorial, vai aprender a utilizar um serviço PostgreSQL de desenvolvimento com o Container Apps.

Neste tutorial, os comandos da CLI do Azure e os fragmentos de modelos do Bicep estão em destaque. Se utilizar o Bicep, pode adicionar todos os fragmentos a um único ficheiro Bicep e implementar o modelo de uma só vez.

  • Criar um ambiente de Container Apps para implementar o seu serviço e aplicações de contentor
  • Criar um serviço PostgreSQL
  • Criar e utilizar uma aplicação de linha de comandos para utilizar o serviço PostgreSQL dev
  • Criar uma aplicação pgweb
  • Escrever dados na base de dados PostgreSQL

Pré-requisitos

Nota

Para uma implementação de um comando, avance para o último azdpasso do modelo.

Configuração

  1. Definir 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. Iniciar sessão 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 th containerapp .

    az extension add --name containerapp --upgrade
    
  6. Registe os espaços de nomes necessários.

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

Criar um ambiente de Container Apps

  1. Crie um grupo de recursos.

    az group create \
        --name "$RESOURCE_GROUP" \
        --location "$LOCATION"
    
  2. Criar um ambiente de Container Apps.

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

Criar um serviço PostgreSQL

  1. Crie um serviço PostgreSQL.

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

    Utilize o logs comando para ver mensagens de registo.

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

    Captura de ecrã a mostrar os registos do serviço PostgreSQL da aplicação de contentor.

Criar uma aplicação para testar o serviço

Quando cria a aplicação, começa por criar uma aplicação de depuração para utilizar a psql CLI para ligar à instância do PostgreSQL.

  1. Crie uma psql aplicação 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 da CLI exec para ligar à aplicação de teste.

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

    Quando utiliza --bind ou serviceBinds na aplicação de teste, as informações de ligação são injetadas no ambiente da aplicação. Depois de ligar ao contentor de teste, pode inspecionar os valores com o env comando .

    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. Para nos psql ligarmos ao serviço

    psql $POSTGRES_URL
    

    Captura de ecrã da aplicação de contentor com pgsql para ligar a um serviço PostgreSQL.

  4. Crie uma tabela com o nome accounts e insira 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 ecrã da aplicação de contentor com pgsql connect to PostgreSQL (Ligar ao PostgreSQL) e criar uma tabela e propagar alguns dados.

Utilizar um serviço de programador com uma aplicação existente

Se já tiver uma aplicação que utiliza o PostgreSQL, pode alterar a forma como as informações de ligação são carregadas.

Primeiro, crie as seguintes variáveis de ambiente.

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

Com a CLI (ou Bicep), pode atualizar a aplicação para adicionar --bind $PG_SVC para utilizar o serviço de desenvolvimento.

Enlace ao serviço de programador

Implemente pgweb para ver e gerir a instância do PostgreSQL.

Veja Bicep ou azd exemplo.

Captura de ecrã a mostrar a aplicação pgweb Container App a ligar ao serviço PostgreSQL.

Implementar todos os recursos

Utilize os seguintes exemplos para se pretender implementar todos os recursos de uma só vez.

Bicep

O seguinte modelo do Bicep contém todos os recursos neste tutorial.

Pode criar um postgres-dev.bicep ficheiro 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}'

Utilize a CLI do Azure para implementar o 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

Azure Developer CLI

Está disponível um modelo final no GitHub.

Utilize azd up para implementar 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

Assim que terminar, execute o seguinte comando para eliminar o grupo de recursos que contém os recursos do Container Apps.

Atenção

O seguinte comando elimina o grupo de recursos especificado e todos os recursos contidos no mesmo. Se existirem recursos fora do âmbito deste tutorial no grupo de recursos especificado, também serão eliminados.

az group delete \
    --resource-group $RESOURCE_GROUP