Tutorial: Usar um serviço PostgreSQL para desenvolvimento
Artigo 07/03/2024
5 contribuidores
Comentários
Neste artigo
Os Aplicativos de Contêiner do Azure permitem que você se conecte a serviços de desenvolvimento e nível de produção para fornecer uma ampla variedade de funcionalidades para seus aplicativos.
Neste tutorial, você aprenderá a usar um serviço PostgreSQL de desenvolvimento com Container Apps.
Os comandos da CLI do Azure e os fragmentos de modelo 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 seus aplicativos de serviço e contêiner
Criar um serviço PostgreSQL
Criar e usar um aplicativo de linha de comando para usar o serviço dev PostgreSQL
Criar um aplicativo pgweb
Gravar dados no banco de dados PostgreSQL
Pré-requisitos
Instale a CLI do Azure .
Opcional: CLI do Desenvolvedor do Azure para seguir as instruções do AZD.
Nota
Para uma implantação de um comando, pule para a última azd
etapa do modelo.
Configurar
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"
As variáveis a seguir permitem que você use a CLI para implantar o modelo Bicep.
RESOURCE_GROUP="postgres-dev"
LOCATION="northcentralus"
Para o Bicep, comece criando um arquivo chamado postgres-dev.bicep
e, em seguida, adicione parâmetros com os seguintes valores padrão.
targetScope = 'resourceGroup'
param location string = resourceGroup().location
param appEnvironmentName string = 'aca-env'
param pgSvcName string = 'postgres01'
param pgsqlCliAppName string = 'psql-cloud-cli-app'
Ao implantar o modelo de bíceps em qualquer estágio, você pode usar o az deployment group create
comando.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Defina suas variáveis iniciais.
AZURE_ENV_NAME="azd-postgres-dev"
LOCATION="northcentralus"
Use os valores para inicializar um modelo mínimo azd
.
azd init \
--environment "$AZURE_ENV_NAME" \
--location "$LOCATION" \
--no-prompt
Nota
AZURE_ENV_NAME
é diferente do nome do ambiente Container App. Neste contexto, AZURE_ENV_NAME
in azd
é para todos os recursos em um modelo. Esses recursos incluem recursos não associados a Aplicativos de Contêiner. Você cria um nome diferente para o ambiente de aplicativos de contêiner.
Em seguida, crie infra/main.bicep
e defina parâmetros para uso posterior.
param appEnvironmentName string = 'aca-env'
param pgSvcName string = 'postgres01'
param pgsqlCliAppName string = 'psql-cloud-cli-app'
Iniciar sessão no Azure.
az login
Atualize a CLI para a versão mais recente.
az upgrade
Atualize o Bicep para a versão mais recente.
az bicep upgrade
Adicionar extensão th containerapp
.
az extension add --name containerapp --upgrade
Registre os namespaces necessários.
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
Criar um ambiente de aplicativos de contêiner
Crie um grupo de recursos.
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
Ao implantar o modelo de bíceps em qualquer estágio, você pode usar o az deployment group create
comando.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Nenhuma configuração especial é necessária para gerenciar grupos de recursos no azd
. O azd
comando obtém o grupo de recursos do AZURE_ENV_NAME
/--environment
valor.
Você pode testar o modelo mínimo com o up
comando.
azd up
A execução deste comando cria um grupo de recursos vazio.
Crie um ambiente de aplicativos de contêiner.
az containerapp env create \
--name "$ENVIRONMENT" \
--resource-group "$RESOURCE_GROUP" \
--location "$LOCATION"
Adicione os seguintes valores ao seu postgres-dev.bicep
ficheiro.
resource appEnvironment 'Microsoft.App/managedEnvironments@2023-04-01-preview' = {
name: appEnvironmentName
location: location
properties: {
appLogsConfiguration: {
destination: 'azure-monitor'
}
}
}
A CLI do Azure cria automaticamente um espaço de trabalho do Log Analytics para cada ambiente. Para gerar um espaço de trabalho usando um modelo Bicep, declare explicitamente o ambiente e vincule-o no modelo. Esta etapa torna sua implantação mais estável, mesmo que ao custo de ser um pouco detalhada.
Adicione os seguintes valores ao seu ambiente.
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
}
}
}
}
Os modelos utilizados utilizam azd
módulos bicep.
Crie uma pasta chamada ./infra/core/host
e, em seguida, crie um ./infra/core/host/container-apps-environment.bicep
módulo com o seguinte conteúdo.
param name string
param location string = resourceGroup().location
param tags object = {}
resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2022-10-01' = {
name: '${name}-log-analytics'
location: location
tags: tags
properties: {
sku: {
name: 'PerGB2018'
}
}
}
resource appEnvironment 'Microsoft.App/managedEnvironments@2023-04-01-preview' = {
name: name
location: location
tags: tags
properties: {
appLogsConfiguration: {
destination: 'log-analytics'
logAnalyticsConfiguration: {
customerId: logAnalytics.properties.customerId
sharedKey: logAnalytics.listKeys().primarySharedKey
}
}
}
}
output appEnvironmentId string = appEnvironment.id
./infra/main.bicep
No arquivo, carregue o módulo usando os seguintes valores.
module appEnvironment './core/host/container-apps-environment.bicep' = {
name: 'appEnvironment'
scope: rg
params: {
name: appEnvironmentName
location: location
tags: tags
}
}
Para implementar o modelo, execute azd up
.
Criar um serviço PostgreSQL
Crie um serviço PostgreSQL.
az containerapp add-on postgres create \
--name "$PG_SVC" \
--resource-group "$RESOURCE_GROUP" \
--environment "$ENVIRONMENT"
Adicione os seguintes valores a postgres-dev.bicep
.
resource postgres 'Microsoft.App/containerApps@2023-04-01-preview' = {
name: pgSvcName
location: location
properties: {
environmentId: appEnvironment.id
configuration: {
service: {
type: 'postgres'
}
}
}
}
output postgresLogs string = 'az containerapp logs show -n ${postgres.name} -g ${resourceGroup().name} --follow --tail 30'
Para implantar o modelo bicep, execute az deployment group create
.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
O comando output postgresLogs
gera um comando CLI que você pode executar para exibir logs do PostgreSQL após a implantação.
Você pode executar o comando para exibir os logs de inicialização do novo serviço postgres.
Crie um arquivo de ./infra/core/host/container-app-service.bicep
módulo com o seguinte conteúdo.
param name string
param location string = resourceGroup().location
param tags object = {}
param environmentId string
param serviceType string
resource service 'Microsoft.App/containerApps@2023-04-01-preview' = {
name: name
location: location
tags: tags
properties: {
environmentId: environmentId
configuration: {
service: {
type: serviceType
}
}
}
}
output serviceId string = service.id
Em seguida, atualize o arquivo de ./infra/main.bicep
módulo com a seguinte declaração.
module postgres './core/host/container-app-service.bicep' = {
name: 'postgres'
scope: rg
params: {
name: pgSvcName
location: location
tags: tags
environmentId: appEnvironment.outputs.appEnvironmentId
serviceType: 'postgres'
}
}
Em seguida, implante o modelo usando azd up
o .
`azd up`
Exibir saída de log da instância do Postgres
Use o comando para exibir mensagens de logs
log.
az containerapp logs show \
--name $PG_SVC \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
O exemplo de bíceps anterior inclui uma saída para o comando visualizar os logs.
Por exemplo:
[
"az containerapp logs show -n postgres01 -g postgres-dev --follow --tail 30"
]
Se você não tiver o comando, poderá usar o nome do serviço para exibir os logs usando a CLI.
az containerapp logs show \
--name $PG_SVC \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
Use o comando logs para exibir os logs
az containerapp logs show \
--name postgres01 \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
Criar um aplicativo para testar o serviço
Ao criar o aplicativo, você começa criando um aplicativo de depuração para usar a psql
CLI para se conectar à instância do PostgreSQL.
Crie um psql
aplicativo que se vincule 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"
Adicione os seguintes valores a postgres-dev.bicep
.
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
}
}
}
}
output pgsqlCliExec string = 'az containerapp exec -n ${pgsqlCli.name} -g ${resourceGroup().name} --revision ${pgsqlCli.properties.latestRevisionName} --command /bin/bash'
Gorjeta
A saída pgsqlCliExec
gera um comando CLI para exec no aplicativo de teste após a implantação.
Crie um módulo em ./infra/core/host/container-app.bicep
e adicione os seguintes valores.
param name string
param location string = resourceGroup().location
param tags object = {}
param environmentId string
param serviceId string = ''
param containerName string
param containerImage string
param containerCommands array = []
param containerArgs array = []
param minReplicas int
param maxReplicas int
param targetPort int = 0
param externalIngress bool = false
resource app 'Microsoft.App/containerApps@2023-04-01-preview' = {
name: name
location: location
tags: tags
properties: {
environmentId: environmentId
configuration: {
ingress: targetPort > 0 ? {
targetPort: targetPort
external: externalIngress
} : null
}
template: {
serviceBinds: !empty(serviceId) ? [
{
serviceId: serviceId
}
] : null
containers: [
{
name: containerName
image: containerImage
command: !empty(containerCommands) ? containerCommands : null
args: !empty(containerArgs) ? containerArgs : null
}
]
scale: {
minReplicas: minReplicas
maxReplicas: maxReplicas
}
}
}
}
Agora, use o módulo adicionando ./infra/main.bicep
os seguintes valores.
module psqlCli './core/host/container-app.bicep' = {
name: 'psqlCli'
scope: rg
params: {
name: pgsqlCliAppName
location: location
tags: tags
environmentId: appEnvironment.outputs.appEnvironmentId
serviceId: postgres.outputs.serviceId
containerImage: 'mcr.microsoft.com/k8se/services/postgres:14'
containerName: 'psql'
maxReplicas: 1
minReplicas: 1
containerCommands: [ '/bin/sleep', 'infinity' ]
}
}
Implante o modelo com azd up
o .
azd up
Execute o comando CLI exec
para se conectar ao aplicativo de teste.
az containerapp exec \
--name $PSQL_CLI_APP \
--resource-group $RESOURCE_GROUP \
--command /bin/bash
O exemplo anterior do Bicep inclui uma saída que mostra como executar o aplicativo.
Por exemplo:
[
"az containerapp logs show -n postgres01 -g postgres-dev --follow --tail 30",
"az containerapp exec -n psql-cloud-cli-app -g postgres-dev --command /bin/bash"
]
Se você não tiver o comando, poderá usar o nome do aplicativo para executar o aplicativo usando o exec
comando.
az containerapp exec \
--name $PSQL_CLI_APP \
--resource-group $RESOURCE_GROUP \
--command /bin/bash
az containerapp exec \
--name psql-cloud-cli-app \
--resource-group $RESOURCE_GROUP \
--command /bin/bash
Quando você usa --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 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...
Nós psql
para nos conectarmos ao serviço
psql $POSTGRES_URL
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;
Usando um serviço de desenvolvimento com um aplicativo existente
Se você já tiver um aplicativo que usa PostgreSQL, poderá alterar a forma como as informações de conexã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...
Usando a CLI (ou Bicep), você pode atualizar o aplicativo a ser adicionado --bind $PG_SVC
para usar o serviço de desenvolvimento.
Vinculação ao serviço de desenvolvimento
Implante o pgweb para exibir e gerenciar a instância do PostgreSQL.
Veja Bicep ou azd
exemplo.
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 pgwebUrl string = 'https://${pgweb.properties.configuration.ingress.fqdn}'
Implante o modelo de bíceps com o mesmo comando.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
O comando Bicep retorna uma URL. Copie este URL para o navegador para visitar o site implantado.
Atualize ./infra/main.bicep
com os seguintes valores.
module pgweb './core/host/container-app.bicep' = {
name: 'pgweb'
scope: rg
params: {
name: 'pgweb'
location: location
tags: tags
environmentId: appEnvironment.outputs.appEnvironmentId
serviceId: postgres.outputs.serviceId
containerImage: 'docker.io/sosedoff/pgweb:latest'
containerName: 'pgweb'
maxReplicas: 1
minReplicas: 1
containerCommands: [ '/bin/sh' ]
containerArgs: [
'-c'
'PGWEB_DATABASE_URL=$POSTGRES_URL /usr/bin/pgweb --bind=0.0.0.0 --listen=8081'
]
targetPort: 8081
externalIngress: true
}
}
Implante o modelo com azd up
o .
azd up
Implantar todos os recursos
Use os exemplos a seguir para se 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 postgres-dev.bicep
arquivo com esse 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 implantar 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
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
Clean up resources (Limpar recursos)
Quando terminar, execute o seguinte comando para excluir o grupo de recursos que contém os recursos dos Aplicativos de Contêiner.
Atenção
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