Esercitazione: Usare un servizio PostgreSQL per lo sviluppo
Articolo 06/23/2023
4 contributori
Commenti e suggerimenti
In questo articolo
App Contenitore di Azure consente di connettersi a servizi di sviluppo e di livello di produzione per offrire un'ampia gamma di funzionalità alle applicazioni.
In questa esercitazione si apprenderà come usare un servizio PostgreSQL di sviluppo con app contenitore.
I comandi dell'interfaccia della riga di comando di Azure e i frammenti di modello Bicep sono disponibili in questa esercitazione. Se si usa Bicep, è possibile aggiungere tutti i frammenti a un singolo file Bicep e distribuire il modello contemporaneamente .
Creare un ambiente app contenitore per distribuire le app del servizio e del contenitore
Creare un servizio PostgreSQL
Creare e usare un'app da riga di comando per usare il servizio PostgreSQL di sviluppo
Creare un'app pgweb
Scrivere dati nel database PostgreSQL
Prerequisiti
Installazione
Definire le variabili per i valori comuni.
RESOURCE_GROUP="postgres-dev"
LOCATION="northcentralus"
ENVIRONMENT="aca-env"
PG_SVC="postgres01"
PSQL_CLI_APP="psql-cloud-cli-app"
Le variabili seguenti consentono di usare l'interfaccia della riga di comando per distribuire il modello Bicep.
RESOURCE_GROUP="postgres-dev"
LOCATION="northcentralus"
Per Bicep, iniziare creando un file denominato postgres-dev.bicep
, quindi aggiungere parametri con i valori predefiniti seguenti.
targetScope = 'resourceGroup'
param location string = resourceGroup().location
param appEnvironmentName string = 'aca-env'
param pgSvcName string = 'postgres01'
param pgsqlCliAppName string = 'psql-cloud-cli-app'
Quando si distribuisce il modello bicep in qualsiasi fase, è possibile usare il az deployment group create
comando .
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Definire le variabili iniziali.
AZURE_ENV_NAME="azd-postgres-dev"
LOCATION="northcentralus"
Usare i valori per inizializzare un modello minimo azd
.
azd init \
--environment "$AZURE_ENV_NAME" \
--location "$LOCATION" \
--no-prompt
Nota
AZURE_ENV_NAME
è diverso dal nome dell'ambiente dell'app contenitore. In questo contesto, AZURE_ENV_NAME
in azd
è per tutte le risorse in un modello. Queste risorse includono risorse non associate ad App contenitore. Si crea un nome diverso per l'ambiente App contenitore.
Successivamente, creare infra/main.bicep
e definire i parametri per un uso successivo.
param appEnvironmentName string = 'aca-env'
param pgSvcName string = 'postgres01'
param pgsqlCliAppName string = 'psql-cloud-cli-app'
Accedere ad Azure.
az login
Aggiornare l'interfaccia della riga di comando alla versione più recente.
az upgrade
Aggiornare Bicep alla versione più recente.
az bicep upgrade
Aggiungere l'estensione containerapp
.
az extension add --name containerapp --upgrade
Registrare gli spazi dei nomi necessari.
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
Creare un ambiente di app contenitore
Crea un gruppo di risorse.
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
Quando si distribuisce il modello bicep in qualsiasi fase, è possibile usare il az deployment group create
comando .
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Non è necessaria alcuna configurazione speciale per la gestione dei gruppi di risorse in azd
. Il azd
comando ottiene il gruppo di risorse dal AZURE_ENV_NAME
/--environment
valore .
È possibile testare il modello minimo con il up
comando .
azd up
L'esecuzione di questo comando crea un gruppo di risorse vuoto.
Creare un ambiente app contenitore.
az containerapp env create \
--name "$ENVIRONMENT" \
--resource-group "$RESOURCE_GROUP" \
--location "$LOCATION"
Aggiungere i valori seguenti al postgres-dev.bicep
file.
resource appEnvironment 'Microsoft.App/managedEnvironments@2023-04-01-preview' = {
name: appEnvironmentName
location: location
properties: {
appLogsConfiguration: {
destination: 'azure-monitor'
}
}
}
L'interfaccia della riga di comando di Azure crea automaticamente un'area di lavoro Log Analytics per ogni ambiente. Per generare un'area di lavoro usando un modello Bicep, dichiarare in modo esplicito l'ambiente e collegarlo al modello. Questo passaggio rende la distribuzione più stabile, anche se a costo di essere leggermente dettagliata.
Aggiungere i valori seguenti all'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
}
}
}
}
I modelli usati da azd
usano moduli bicep .
Creare una cartella denominata ./infra/core/host
, quindi creare un ./infra/core/host/container-apps-environment.bicep
modulo con il contenuto seguente.
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
Nel file caricare il modulo usando i valori seguenti.
module appEnvironment './core/host/container-apps-environment.bicep' = {
name: 'appEnvironment'
scope: rg
params: {
name: appEnvironmentName
location: location
tags: tags
}
}
Eseguire azd up
per distribuire il modello.
Creare un servizio PostgreSQL
Creare un servizio PostgreSQL.
az containerapp add-on postgres create \
--name "$PG_SVC" \
--resource-group "$RESOURCE_GROUP" \
--environment "$ENVIRONMENT"
Aggiungere i valori seguenti 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'
Per distribuire il modello bicep, eseguire az deployment group create
.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Il comando di output postgresLogs
restituisce un comando dell'interfaccia della riga di comando che è possibile eseguire per visualizzare i log di PostgreSQL dopo la distribuzione.
È possibile eseguire il comando per visualizzare i log di inizializzazione del nuovo servizio Postgres.
Creare un ./infra/core/host/container-app-service.bicep
file di modulo con il contenuto seguente.
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
Aggiornare quindi il file del ./infra/main.bicep
modulo con la dichiarazione seguente.
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'
}
}
Distribuire quindi il modello usando azd up
.
`azd up`
Visualizzare l'output del log dall'istanza di Postgres
Usare il logs
comando per visualizzare i messaggi di log.
az containerapp logs show \
--name $PG_SVC \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
L'esempio bicep precedente include un output per il comando per visualizzare i log.
Ad esempio:
[
"az containerapp logs show -n postgres01 -g postgres-dev --follow --tail 30"
]
Se il comando non è disponibile, è possibile usare il nome del servizio per visualizzare i log usando l'interfaccia della riga di comando.
az containerapp logs show \
--name $PG_SVC \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
usare il comando logs per visualizzare i log
az containerapp logs show \
--name postgres01 \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
Creare un'app per testare il servizio
Quando si crea l'app, si inizia creando un'app di debug per usare l'interfaccia della psql
riga di comando per connettersi all'istanza di PostgreSQL.
Creare un'app psql
associata al servizio 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"
Aggiungere i valori seguenti 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'
Suggerimento
L'output pgsqlCliExec
restituisce un comando dell'interfaccia della riga di comando da eseguire nell'app di test dopo la distribuzione.
Creare un modulo in ./infra/core/host/container-app.bicep
e aggiungere i valori seguenti.
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
}
}
}
}
Usare ora il modulo in ./infra/main.bicep
aggiungendo i valori seguenti.
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' ]
}
}
Distribuire il modello con azd up
.
azd up
Eseguire il comando dell'interfaccia della riga exec
di comando per connettersi all'app di test.
az containerapp exec \
--name $PSQL_CLI_APP \
--resource-group $RESOURCE_GROUP \
--command /bin/bash
L'esempio bicep precedente include l'output che illustra come eseguire l'app.
Ad esempio:
[
"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 non si ha il comando, è possibile usare il nome dell'app per eseguire l'applicazione usando il 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 si usa --bind
o serviceBinds
nell'app di test, le informazioni di connessione vengono inserite nell'ambiente dell'applicazione. Dopo aver eseguito la connessione al contenitore di test, è possibile controllare i valori usando il 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...
Per psql
connettersi al servizio
psql $POSTGRES_URL
Creare una tabella denominata accounts
e inserire dati.
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;
Uso di un servizio di sviluppo con un'app esistente
Se si dispone già di un'app che usa PostgreSQL, è possibile modificare il modo in cui vengono caricate le informazioni di connessione.
Creare prima di tutto le variabili di ambiente seguenti.
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 l'interfaccia della riga di comando (o Bicep) è possibile aggiornare l'app da aggiungere --bind $PG_SVC
per usare il servizio di sviluppo.
Associazione al servizio di sviluppo
Distribuire pgweb per visualizzare e gestire l'istanza di PostgreSQL.
Vedere Bicep o azd
esempio.
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}'
Distribuire il modello bicep con lo stesso comando.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Il comando Bicep restituisce un URL. Copiare questo URL nel browser per visitare il sito distribuito.
Aggiornare ./infra/main.bicep
con i valori seguenti.
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
}
}
Distribuire il modello con azd up
.
azd up
Distribuire tutte le risorse
Usare gli esempi seguenti per distribuire tutte le risorse contemporaneamente.
Bicep
Il modello Bicep seguente contiene tutte le risorse di questa esercitazione.
È possibile creare un postgres-dev.bicep
file con questo contenuto.
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}'
Usare l'interfaccia della riga di comando di Azure per distribuire il modello.
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
Interfaccia della riga di comando per sviluppatori di Azure
Un modello finale è disponibile in GitHub.
Usare azd up
per distribuire il modello.
git clone https://github.com/Azure-Samples/aca-dev-service-postgres-azd
cd aca-dev-service-postgres-azd
azd up
Pulire le risorse
Al termine, eseguire il comando seguente per eliminare il gruppo di risorse contenente le risorse di App contenitore.
Attenzione
Il comando seguente elimina il gruppo di risorse specificato e tutte le risorse contenute all'interno. Se nel gruppo di risorse specificato sono presenti anche risorse diverse da quelle usate in questa esercitazione, verranno eliminate.
az group delete \
--resource-group $RESOURCE_GROUP