Tutorial: uso de un servicio PostgreSQL para el desarrollo
Artículo 06/23/2023
4 colaboradores
Comentarios
En este artículo
Azure Container Apps permite conectarse a los servicios de desarrollo y de nivel de producción para proporcionar una amplia variedad de funcionalidades a las aplicaciones.
En este tutorial, aprenderá a usar un servicio de PostgreSQL de desarrollo con Container Apps.
Los comandos de la CLI de Azure y los fragmentos de plantilla de Bicep se incluyen en este tutorial. Si usa Bicep, puede agregar todos los fragmentos a un único archivo de Bicep e implementar la plantilla a la vez .
Crear un entorno de Container Apps para implementar el servicio y las aplicaciones de contenedor
Crear un servicio PostgreSQL
Crear y utilizar una aplicación de línea de comandos para utilizar el servicio de PostgreSQL de desarrollo
Creación de una aplicación pgweb
Escritura de datos en la base de datos de PostgreSQL
Prerrequisitos
Configurar
Defina variables para valores comunes.
RESOURCE_GROUP="postgres-dev"
LOCATION="northcentralus"
ENVIRONMENT="aca-env"
PG_SVC="postgres01"
PSQL_CLI_APP="psql-cloud-cli-app"
Las siguientes variables permiten usar la CLI para implementar la plantilla de Bicep.
RESOURCE_GROUP="postgres-dev"
LOCATION="northcentralus"
Para Bicep, empiece por crear un archivo llamado postgres-dev.bicep
. A continuación, añádale parámetros con los siguientes valores por defecto.
targetScope = 'resourceGroup'
param location string = resourceGroup().location
param appEnvironmentName string = 'aca-env'
param pgSvcName string = 'postgres01'
param pgsqlCliAppName string = 'psql-cloud-cli-app'
A medida que implemente la plantilla de bicep en cualquier fase, puede usar el comando az deployment group create
.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Defina las variables iniciales.
AZURE_ENV_NAME="azd-postgres-dev"
LOCATION="northcentralus"
Use los valores para inicializar una plantilla de azd
mínima.
azd init \
--environment "$AZURE_ENV_NAME" \
--location "$LOCATION" \
--no-prompt
Nota:
AZURE_ENV_NAME
es diferente del nombre del entorno de Aplicación de contenedor. En este contexto, AZURE_ENV_NAME
en azd
es para todos los recursos de una plantilla. Estos recursos incluyen recursos que no están asociados a Container Apps. Cree un nombre diferente para el entorno de Container Apps.
A continuación, cree infra/main.bicep
y defina parámetros para su uso posterior.
param appEnvironmentName string = 'aca-env'
param pgSvcName string = 'postgres01'
param pgsqlCliAppName string = 'psql-cloud-cli-app'
Inicie sesión en Azure.
az login
Actualice la CLI a la última versión.
az upgrade
Actualice a la versión más reciente de Bicep.
az bicep upgrade
Agregue la extensión containerapp
.
az extension add --name containerapp --upgrade
Registre espacios de nombres necesarios.
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
Creación de un entorno de Container Apps
Cree un grupo de recursos.
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
A medida que implemente la plantilla de bicep en cualquier fase, puede usar el comando az deployment group create
.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
No se necesita ninguna configuración especial para administrar grupos de recursos en azd
. El comando azd
obtiene el grupo de recursos del valor AZURE_ENV_NAME
/--environment
.
Puede probar la plantilla mínima con el comando up
.
azd up
Al ejecutar este comando se crea un grupo de recursos vacío.
Creación de un entorno de Container Apps.
az containerapp env create \
--name "$ENVIRONMENT" \
--resource-group "$RESOURCE_GROUP" \
--location "$LOCATION"
Agregue los siguientes valores al archivo postgres-dev.bicep
.
resource appEnvironment 'Microsoft.App/managedEnvironments@2023-04-01-preview' = {
name: appEnvironmentName
location: location
properties: {
appLogsConfiguration: {
destination: 'azure-monitor'
}
}
}
La CLI de Azure crea automáticamente un espacio de trabajo de Log Analytics para cada entorno. Para generar un área de trabajo mediante una plantilla de Bicep, declare explícitamente el entorno y vincule a él en la plantilla. Este paso hace que la implementación sea más estable, aunque a costa de ser un poco detallado.
Agregue los siguientes valores al entorno.
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
}
}
}
}
Las plantillas usadas por azd
usan módulos de bicep .
Cree una carpeta denominada ./infra/core/host
y, a continuación, cree un módulo ./infra/core/host/container-apps-environment.bicep
con el siguiente contenido.
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
En el archivo ./infra/main.bicep
, cargue el módulo con los valores siguientes.
module appEnvironment './core/host/container-apps-environment.bicep' = {
name: 'appEnvironment'
scope: rg
params: {
name: appEnvironmentName
location: location
tags: tags
}
}
Ejecute azd up
para implementar la plantilla.
Crear un servicio PostgreSQL
Crear un servicio de PostgreSQL.
az containerapp add-on postgres create \
--name "$PG_SVC" \
--resource-group "$RESOURCE_GROUP" \
--environment "$ENVIRONMENT"
Agregue los valores siguientes 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 la plantilla de Bicep, ejecute az deployment group create
.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
El comando de salida postgresLogs
genera un comando de la CLI que puede ejecutar para ver los registros de PostgreSQL después de la implementación.
Puede ejecutar el comando para ver los registros de inicialización del nuevo servicio postgres.
Cree un archivo de módulo de ./infra/core/host/container-app-service.bicep
con el siguiente contenido.
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
A continuación, actualice el módulo ./infra/main.bicep
con la siguiente declaración.
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'
}
}
Después, implemente la plantilla mediante azd up
.
`azd up`
Ver la salida del registro desde la instancia de Postgres
Use el comando logs
para ver los mensajes de registro.
az containerapp logs show \
--name $PG_SVC \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
En el ejemplo anterior de bicep se incluye una salida para el comando para ver los registros.
Por ejemplo:
[
"az containerapp logs show -n postgres01 -g postgres-dev --follow --tail 30"
]
Si no tiene el comando, puede usar el nombre del servicio para ver los registros mediante la CLI.
az containerapp logs show \
--name $PG_SVC \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
utilice el comando de registro para ver los registros
az containerapp logs show \
--name postgres01 \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
Creación de una aplicación para probar el servicio
Al crear la aplicación, empiece por crear una aplicación de depuración para usar la CLI de psql
para conectarse a la instancia de PostgreSQL.
Creación de una app de psql
que se conecta al servicio de 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"
Agregue los valores siguientes 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'
Sugerencia
La salida de pgsqlCliExec
muestra un comando de CLI para ejecutar en la aplicación de prueba después de la implementación.
Cree un módulo en ./infra/core/host/container-app.bicep
y añada los siguientes 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
}
}
}
}
Ahora, use el módulo en ./infra/main.bicep
agregando los valores siguientes.
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' ]
}
}
Implemente la plantilla con azd up
.
azd up
Ejecute el comando exec
de la CLI para conectarse a la aplicación de prueba.
az containerapp exec \
--name $PSQL_CLI_APP \
--resource-group $RESOURCE_GROUP \
--command /bin/bash
En el ejemplo anterior de Bicep se incluye la salida que muestra cómo ejecutar la aplicación.
Por ejemplo:
[
"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"
]
Si no tiene el comando, puede usar el nombre de la aplicación para ejecutarla mediante el 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
Al usar --bind
o serviceBinds
en la aplicación de prueba, la información de conexión se inserta en el entorno de la aplicación. Una vez que se conecte al contenedor de prueba, puede inspeccionar los valores mediante el 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...
Utilice psql
para conectarse al servicio
psql $POSTGRES_URL
Cree una tabla llamada accounts
e inserte datos.
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 de un servicio dev con una app existente
Si ya tiene una aplicación que usa PostgreSQL, puede cambiar cómo se carga la información de conexión.
Primero, agregue las siguientes variables de entorno.
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...
Luego, mediante la CLI (o Bicep) puede actualizar la aplicación para añadir --bind $PG_SVC
para usar el servicio de desarrollo.
Enlace al servicio de desarrollo
Implemente pgweb para ver y administrar la instancia de PostgreSQL.
Vea Bicep o el ejemplo de 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}'
Implemente la plantilla de Bicep con el mismo comando.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
El comando de Bicep devuelve una dirección URL. Copie esta dirección URL en el explorador para visitar el sitio implementado.
Actualice ./infra/main.bicep
con los siguientes 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
}
}
Implemente la plantilla con azd up
.
azd up
Implementar todos los recursos
Use los ejemplos siguientes si desea implementar todos los recursos a la vez.
Bicep
La siguiente plantilla de Bicep contiene todos los recursos de este tutorial.
Puede crear un archivo postgres-dev.bicep
con este contenido.
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 la CLI de Azure para implementarla en la plantilla.
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 de desarrollo de Azure
Una plantilla final está disponible en GitHub.
Use azd up
para implementar la plantilla.
git clone https://github.com/Azure-Samples/aca-dev-service-postgres-azd
cd aca-dev-service-postgres-azd
azd up
Limpieza de recursos
Cuando haya terminado, ejecute el siguiente comando para eliminar el grupo de recursos que contiene los recursos de Container Apps.
Precaución
El comando siguiente elimina el grupo de recursos especificado y todos los recursos que contiene. Si existen recursos en el grupo de recursos especificado que están fuera del ámbito de este tutorial, también se eliminarán.
az group delete \
--resource-group $RESOURCE_GROUP