Tutorial: Utilizar um serviço PostgreSQL para desenvolvimento
Artigo 06/27/2023
4 contribuidores
Comentários
Neste artigo
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 azd
passo do modelo .
Configuração
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 seguintes variáveis permitem-lhe utilizar a CLI para implementar o modelo bicep.
RESOURCE_GROUP="postgres-dev"
LOCATION="northcentralus"
Para o Bicep, comece por criar um ficheiro chamado postgres-dev.bicep
e, em seguida, adicione parâmetros com os seguintes valores predefinidos.
targetScope = 'resourceGroup'
param location string = resourceGroup().location
param appEnvironmentName string = 'aca-env'
param pgSvcName string = 'postgres01'
param pgsqlCliAppName string = 'psql-cloud-cli-app'
À medida que implementa o modelo de bíceps em qualquer fase, pode utilizar o az deployment group create
comando .
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Defina as variáveis iniciais.
AZURE_ENV_NAME="azd-postgres-dev"
LOCATION="northcentralus"
Utilize 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 da Aplicação de Contentor. Neste contexto, AZURE_ENV_NAME
no azd
é para todos os recursos num modelo. Estes recursos incluem recursos não associados às Container Apps. Pode criar um nome diferente para o ambiente das Container Apps.
Em seguida, crie infra/main.bicep
e defina parâmetros para utilização 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
Adicione a extensão th containerapp
.
az extension add --name containerapp --upgrade
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
Crie um grupo de recursos.
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
À medida que implementa o modelo de bíceps em qualquer fase, pode utilizar o az deployment group create
comando .
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Não é necessária nenhuma configuração especial para gerir grupos de recursos no azd
. O azd
comando obtém o grupo de recursos do AZURE_ENV_NAME
/--environment
valor.
Pode testar o modelo mínimo com o up
comando .
azd up
Executar este comando cria um grupo de recursos vazio.
Criar um ambiente de Container Apps.
az containerapp env create \
--name "$ENVIRONMENT" \
--resource-group "$RESOURCE_GROUP" \
--location "$LOCATION"
Adicione os seguintes valores ao ficheiro 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 uma área de trabalho do Log Analytics para cada ambiente. Para gerar uma área de trabalho com um modelo do Bicep, declare explicitamente o ambiente e ligue-o ao mesmo no modelo. Este passo torna a sua implementação mais estável, mesmo que seja um pouco verbosa.
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 através azd
da utilização de módulos bicep .
Crie uma pasta com o nome ./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 ficheiro, carregue o módulo com 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 implementar 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
produz um comando da CLI que pode executar para ver os registos do PostgreSQL após a implementação.
Pode executar o comando para ver os registos de inicialização do novo serviço postgres.
Crie um ficheiro 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 ficheiro do ./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, implemente o modelo com azd up
.
`azd up`
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
O exemplo de bíceps anterior inclui uma saída para o comando ver os registos.
Por exemplo:
[
"az containerapp logs show -n postgres01 -g postgres-dev --follow --tail 30"
]
Se não tiver o comando, pode utilizar o nome do serviço para ver os registos com a CLI.
az containerapp logs show \
--name $PG_SVC \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
utilizar o comando de registos para ver os registos
az containerapp logs show \
--name postgres01 \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
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.
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"
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
O resultado pgsqlCliExec
produz um comando da CLI para efetuar um executivo na aplicação de teste após a implementaçã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, utilize o módulo no ./infra/main.bicep
ao adicionar 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' ]
}
}
Implementar o modelo com azd up
.
azd up
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
O exemplo anterior do Bicep inclui uma saída que lhe mostra como executar a aplicação.
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 não tiver o comando, pode utilizar o nome da aplicação para executar a aplicação com 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 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...
Para nos psql
ligarmos 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;
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.
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}'
Implemente 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 devolve um URL. Copie este URL para o browser para visitar o site implementado.
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
}
}
Implementar o modelo com azd up
.
azd up
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