Tutorial: usar um serviço PostgreSQL para desenvolvimento
Artigo 06/23/2023
5 colaboradores
Comentários
Neste artigo
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
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"
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 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 bicep em qualquer estágio, você pode usar o comando az deployment group create
.
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
Observação
AZURE_ENV_NAME
é diferente do nome do ambiente do Aplicativo de Contêiner. Neste contexto, AZURE_ENV_NAME
em azd
é para todos os recursos em um modelo. Esses recursos incluem recursos não associados aos 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'
Fazer logon 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
Adicione a extensão 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 dos 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 bicep em qualquer estágio, você pode usar o comando az deployment group create
.
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 comando azd
obtém o grupo de recursos do valor AZURE_ENV_NAME
/--environment
.
Você pode testar o modelo mínimo com o comando up
.
azd up
Executar esse comando cria um grupo de recursos vazio.
Criar um ambiente dos Aplicativos de Contêiner.
az containerapp env create \
--name "$ENVIRONMENT" \
--resource-group "$RESOURCE_GROUP" \
--location "$LOCATION"
Adicione os seguintes valores ao arquivo postgres-dev.bicep
.
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 workspace do Log Analytics para cada ambiente. Para gerar um workspace usando um modelo do Bicep, você declara explicitamente o ambiente e o link para ele 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 usados pelo azd
usam módulos bicep .
Crie uma pasta chamada ./infra/core/host
, em seguida, crie um módulo ./infra/core/host/container-apps-environment.bicep
com o conteúdo a seguir.
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
No arquivo ./infra/main.bicep
, carregue o módulo usando os valores a seguir.
module appEnvironment './core/host/container-apps-environment.bicep' = {
name: 'appEnvironment'
scope: rg
params: {
name: appEnvironmentName
location: location
tags: tags
}
}
Para implantar o modelo, execute azd up
.
Criar um serviço do PostgreSQL
Criar um serviço do 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 de saída postgresLogs
gera um comando da 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 módulo ./infra/core/host/container-app-service.bicep
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 módulo ./infra/main.bicep
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 seguinda, implante o modelo usando azd up
.
`azd up`
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
O exemplo anterior do bicep inclui uma saída para o comando para exibir 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 de 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 CLI psql
e conectar a instância do PostgreSQL.
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"
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'
Dica
A saída pgsqlCliExec
produzirá um comando da CLI para execução no aplicativo de teste depois que ele for implantado.
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 em ./infra/main.bicep
adicionando os valores a seguir.
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
.
azd up
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
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á obter o nome do aplicativo para executar o aplicativo usando o comando exec
.
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
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...
Nós para nos psql
conectarmos ao serviço
psql $POSTGRES_URL
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;
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
.
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 do Bicep com o mesmo comando.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
O comando do Bicep retorna uma URL. Copie essa 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
.
azd up
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