Tutoriel : Utiliser un service PostgreSQL pour le développement
Article 06/28/2023
5 contributeurs
Commentaires
Dans cet article
Azure Container Apps vous permet de vous connecter à des services de développement et de production pour fournir une grande variété de fonctionnalités à vos applications.
Dans ce tutoriel, vous allez apprendre à utiliser un service PostgreSQL de développement avec Container Apps.
Les commandes Azure CLI et les fragments de modèle Bicep sont présentés dans ce tutoriel. Si vous utilisez Bicep, vous pouvez ajouter tous les fragments à un seul fichier Bicep et déployer le modèle en même temps .
Créer un environnement Container Apps pour déployer vos applications de service et de conteneur
Créer un service PostgreSQL
Créez et utilisez une application en ligne de commande pour utiliser le service dev PostgreSQL
Créez une application pgweb
Écrivez des données dans la base de données PostgreSQL
Prérequis
Notes
Pour un déploiement de commande, passez à la dernière azd
étape du modèle .
Programme d’installation
Définissez des variables pour les valeurs communes.
RESOURCE_GROUP="postgres-dev"
LOCATION="northcentralus"
ENVIRONMENT="aca-env"
PG_SVC="postgres01"
PSQL_CLI_APP="psql-cloud-cli-app"
Les variables suivantes vous permettent d’utiliser l’interface CLI pour déployer le modèle Bicep.
RESOURCE_GROUP="postgres-dev"
LOCATION="northcentralus"
Pour Bicep, commencez par créer un fichier appelé postgres-dev.bicep
, puis ajoutez des paramètres avec les valeurs par défaut suivantes.
targetScope = 'resourceGroup'
param location string = resourceGroup().location
param appEnvironmentName string = 'aca-env'
param pgSvcName string = 'postgres01'
param pgsqlCliAppName string = 'psql-cloud-cli-app'
Lorsque vous déployez le modèle bicep à n’importe quel stade, vous pouvez utiliser la commande az deployment group create
.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Définissez vos variables initiales.
AZURE_ENV_NAME="azd-postgres-dev"
LOCATION="northcentralus"
Utilisez les valeurs pour initialiser un modèle minimal azd
.
azd init \
--environment "$AZURE_ENV_NAME" \
--location "$LOCATION" \
--no-prompt
Notes
AZURE_ENV_NAME
est différent du nom de l’environnement de Container App. Dans ce contexte, AZURE_ENV_NAME
dans azd
s’applique à toutes les ressources d’un modèle. Ces ressources incluent des ressources qui ne sont pas associées à Container Apps. Vous créez un nom différent pour l’environnement Container Apps.
Ensuite, créez infra/main.bicep
et définissez des paramètres pour une utilisation ultérieure.
param appEnvironmentName string = 'aca-env'
param pgSvcName string = 'postgres01'
param pgsqlCliAppName string = 'psql-cloud-cli-app'
Connectez-vous à Azure.
az login
Effectuez une mise à niveau de l'interface CLI vers la version la plus récente.
az upgrade
Effectuez une mise à niveau de Bicep vers la version la plus récente.
az bicep upgrade
Ajoutez l’extension containerapp
.
az extension add --name containerapp --upgrade
Inscrivez les espaces de noms requis.
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
Créer un environnement Container Apps
Créez un groupe de ressources.
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
Lorsque vous déployez le modèle bicep à n’importe quel stade, vous pouvez utiliser la commande az deployment group create
.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Aucune configuration spéciale n’est nécessaire pour la gestion des groupes de ressources dans azd
. La commande azd
obtient le groupe de ressources à partir de la valeur AZURE_ENV_NAME
/--environment
.
Vous pouvez tester le modèle minimal avec la commande up
.
azd up
L’exécution de cette commande crée un groupe de ressources vide.
Créez un environnement Container Apps.
az containerapp env create \
--name "$ENVIRONMENT" \
--resource-group "$RESOURCE_GROUP" \
--location "$LOCATION"
Ajoutez les valeurs suivantes à votre fichier postgres-dev.bicep
.
resource appEnvironment 'Microsoft.App/managedEnvironments@2023-04-01-preview' = {
name: appEnvironmentName
location: location
properties: {
appLogsConfiguration: {
destination: 'azure-monitor'
}
}
}
Azure CLI crée automatiquement un espace de travail Log Analytics pour chaque environnement. Pour générer un espace de travail à l’aide d’un modèle Bicep, vous déclarez explicitement l’environnement et créez un lien vers celui-ci dans le modèle. Cette étape rend votre déploiement plus stable, même si elle est un peu détaillée.
Ajoutez les valeurs suivantes à votre environnement.
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
}
}
}
}
Les modèles utilisés par azd
utilisent des modules bicep .
Créez un dossier nommé ./infra/core/host
, puis créez un module ./infra/core/host/container-apps-environment.bicep
avec le contenu suivant.
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
Dans le fichier ./infra/main.bicep
, chargez le module à l’aide des valeurs suivantes.
module appEnvironment './core/host/container-apps-environment.bicep' = {
name: 'appEnvironment'
scope: rg
params: {
name: appEnvironmentName
location: location
tags: tags
}
}
Exécutez azd up
pour déployer le modèle.
Créer un service PostgreSQL
Créez un service PostgreSQL.
az containerapp add-on postgres create \
--name "$PG_SVC" \
--resource-group "$RESOURCE_GROUP" \
--environment "$ENVIRONMENT"
Ajoutez les valeurs suivantes à 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'
Pour déployer le modèle bicep, exécutez az deployment group create
.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
La commande de sortie postgresLogs
génère une commande CLI que vous pouvez exécuter pour afficher les journaux PostgreSQL après le déploiement.
Vous pouvez exécuter la commande pour afficher les journaux d’initialisation du nouveau service postgres.
Créez un fichier de module ./infra/core/host/container-app-service.bicep
avec le contenu suivant.
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
Ensuite, mettez à jour le fichier de module ./infra/main.bicep
avec la déclaration suivante.
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'
}
}
Déployez ensuite le modèle en utilisant azd up
.
`azd up`
Affichez la sortie du journal à partir de l’instance Postgres
Utilisez la commande logs
pour afficher les messages du journal.
az containerapp logs show \
--name $PG_SVC \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
L’exemple bicep précédent inclut une sortie pour la commande permettant d’afficher les journaux.
Par exemple :
[
"az containerapp logs show -n postgres01 -g postgres-dev --follow --tail 30"
]
Si vous ne disposez pas de la commande, vous pouvez utiliser le nom du service pour consulter les journaux à l’aide de l’interface CLI.
az containerapp logs show \
--name $PG_SVC \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
utilisez la commande logs pour afficher les journaux
az containerapp logs show \
--name postgres01 \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
Créez une application pour tester le service
Lorsque vous créez l’application, vous commencez par créer une application de débogage pour utiliser l’interface CLI psql
afin de vous connecter à l’instance PostgreSQL.
Créer une application psql
qui se lie au service 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"
Ajoutez les valeurs suivantes à 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'
Conseil
La sortie pgsqlCliExec
génère une commande CLI à exécuter dans l’application de test après son déploiement.
Créez un module sous ./infra/core/host/container-app.bicep
et ajoutez les valeurs suivantes.
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
}
}
}
}
À présent, utilisez le module dans ./infra/main.bicep
en ajoutant les valeurs suivantes.
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' ]
}
}
Déployez le modèle en utilisant azd up
.
azd up
Exécutez la commande CLI exec
pour vous connecter à l’application de test.
az containerapp exec \
--name $PSQL_CLI_APP \
--resource-group $RESOURCE_GROUP \
--command /bin/bash
L’exemple Bicep précédent inclut une sortie qui vous montre comment exécuter l’application.
Par exemple :
[
"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 vous ne disposez pas de la commande, vous pouvez utiliser le nom de l’application pour lancer l’application à l’aide de la commande 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
Lorsque vous utilisez --bind
ou serviceBinds
dans l’application de test, les informations de connexion sont injectées dans l’environnement de l’application. Une fois que vous vous êtes connecté au conteneur de test, vous pouvez inspecter les valeurs à l’aide de la commande 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...
Utilisez psql
pour vous connecter au service
psql $POSTGRES_URL
Créez un tableau nommé accounts
et insérez des données.
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;
Utilisation d’un service de développement avec une application existante
Si vous disposez déjà d’une application qui utilise PostgreSQL, vous pouvez modifier le mode de chargement des informations de connexion.
Tout d’abord, créez les variables d’environnement suivantes.
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...
A l’aide de l’interface CLI (ou Bicep) vous pouvez mettre à jour l’application pour ajouter --bind $PG_SVC
afin d’utiliser le service dev.
Liaison au service de développement
Déployez pgweb pour afficher et gérer les instance PostgreSQL.
Consultez Bicep ou l’exemple 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}'
Déployez le modèle bicep avec la même commande.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
La commande Bicep renvoie une URL. Copiez cette URL dans votre navigateur pour visiter le site déployé.
Mettez à jour ./infra/main.bicep
à l’aide des valeurs suivantes.
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
}
}
Déployez le modèle en utilisant azd up
.
azd up
Déployez toutes les ressources
Utilisez les exemples suivants si vous souhaitez déployer toutes les ressources en même temps.
Bicep
Le modèle Bicep suivant contient toutes les ressources de ce tutoriel.
Vous pouvez créer un fichier postgres-dev.bicep
avec le contenu suivant.
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}'
Utilisez Azure CLI pour déployer le modèle.
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
Un modèle final est disponible sur GitHub.
Utilisez azd up
pour déployer le modèle.
git clone https://github.com/Azure-Samples/aca-dev-service-postgres-azd
cd aca-dev-service-postgres-azd
azd up
Nettoyer les ressources
Une fois que vous avez terminé, exécutez la commande suivante pour supprimer le groupe de ressources qui contient vos ressources Container Apps.
Attention
La commande suivante supprime le groupe de ressources spécifié et toutes les ressources qu’il contient. Si des ressources en dehors du cadre de ce tutoriel existent dans le groupe de ressources spécifié, elles seront également supprimées.
az group delete \
--resource-group $RESOURCE_GROUP