Tutorial: Verwenden eines PostgreSQL-Diensts für die Entwicklung
Artikel 06/27/2023
4 Mitwirkende
Feedback
In diesem Artikel
Mit Azure Container Apps können Sie eine Verbindung mit Entwicklungs- und Produktionsdiensten herstellen, um eine Vielzahl von Funktionen für Ihre Anwendungen bereitzustellen.
In diesem Tutorial erfahren Sie, wie Sie einen PostgreSQL-Entwicklungsdienst mit Container Apps verwenden.
Dieses Tutorial enthält Azure CLI-Befehle und Bicep-Vorlagenfragmente. Wenn Sie Bicep verwenden, können Sie alle Fragmente einer einzelnen Bicep-Datei hinzufügen und die Vorlage auf einmal bereitstellen .
Erstellen einer Container-Apps-Umgebung zur Bereitstellung Ihrer Dienste und Container-Apps
Erstellen eines PostgreSQL-Dienstes
Erstellen und Verwenden einer Befehlszeilenanwendung für die Verwendung des PostgreSQL-Entwicklungsdiensts
Erstellen einer pgweb -App
Schreiben von Daten in die PostgreSQL-Datenbank
Voraussetzungen
Hinweis
Für eine Bereitstellung mit einem Befehl springen Sie direkt zum letzten azd
-Vorlagenschritt .
Einrichten
Definieren Sie Variablen für gemeinsame Werte.
RESOURCE_GROUP="postgres-dev"
LOCATION="northcentralus"
ENVIRONMENT="aca-env"
PG_SVC="postgres01"
PSQL_CLI_APP="psql-cloud-cli-app"
Mit den folgenden Variablen können Sie die CLI verwenden, um die Bicep-Vorlage bereitzustellen.
RESOURCE_GROUP="postgres-dev"
LOCATION="northcentralus"
Für Bicep erstellen Sie zunächst eine Datei namens postgres-dev.bicep
und fügen dann Parameter mit den folgenden Standardwerten hinzu.
targetScope = 'resourceGroup'
param location string = resourceGroup().location
param appEnvironmentName string = 'aca-env'
param pgSvcName string = 'postgres01'
param pgsqlCliAppName string = 'psql-cloud-cli-app'
Da Sie die Bicep-Vorlage in jeder Phase einsetzen, können Sie den Befehl az deployment group create
verwenden.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Definieren Sie Ihre Anfangsvariablen.
AZURE_ENV_NAME="azd-postgres-dev"
LOCATION="northcentralus"
Verwenden Sie die Werte, um eine minimale azd
-Vorlage zu initialisieren.
azd init \
--environment "$AZURE_ENV_NAME" \
--location "$LOCATION" \
--no-prompt
Hinweis
AZURE_ENV_NAME
unterscheidet sich vom Namen der Container-App-Umgebung. In diesem Zusammenhang steht AZURE_ENV_NAME
in azd
für alle Ressourcen in einer Vorlage. Dazu gehören auch Ressourcen, die nicht mit Container Apps verbunden sind. Sie erstellen einen anderen Namen für die Container Apps-Umgebung.
Als Nächstes erstellen Sie infra/main.bicep
und definieren Sie Parameter für die spätere Verwendung.
param appEnvironmentName string = 'aca-env'
param pgSvcName string = 'postgres01'
param pgsqlCliAppName string = 'psql-cloud-cli-app'
Melden Sie sich bei Azure an.
az login
Führen Sie für die CLI ein Upgrade auf die aktuelle Version durch.
az upgrade
Aktualisieren Sie Bicep auf die aktuelle Version.
az bicep upgrade
Fügen Sie die Erweiterung containerapp
hinzu.
az extension add --name containerapp --upgrade
Registrieren Sie die erforderlichen Namespaces.
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
Erstellen einer Container-Apps-Umgebung
Erstellen Sie eine Ressourcengruppe.
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
Da Sie die Bicep-Vorlage in jeder Phase einsetzen, können Sie den Befehl az deployment group create
verwenden.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Für die Verwaltung von Ressourcengruppen in azd
ist kein spezielles Setup erforderlich. Der Befehl azd
ruft die Ressourcengruppe aus dem Wert AZURE_ENV_NAME
/--environment
ab.
Sie können die minimale Vorlage jedoch mit Befehl up
testen.
azd up
Durch Ausführen dieses Befehls wird eine leere Ressourcengruppe erstellt.
Erstellen Sie eine Container Apps-Umgebung.
az containerapp env create \
--name "$ENVIRONMENT" \
--resource-group "$RESOURCE_GROUP" \
--location "$LOCATION"
Fügen Sie der Datei postgres-dev.bicep
die folgenden Werte hinzu.
resource appEnvironment 'Microsoft.App/managedEnvironments@2023-04-01-preview' = {
name: appEnvironmentName
location: location
properties: {
appLogsConfiguration: {
destination: 'azure-monitor'
}
}
}
Die Azure CLI erstellt automatisch einen Log Analytics-Arbeitsbereich für jede Umgebung. Um einen Arbeitsbereich mithilfe einer Bicep-Vorlage zu generieren, deklarieren Sie die Umgebung explizit und verknüpfen sie in der Vorlage. Dieser Schritt macht Ihre Bereitstellung stabiler, auch wenn er ein wenig umständlich ist.
Fügen Sie Ihrer Umgebung die folgenden Werte hinzu.
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
}
}
}
}
Die von azd
verwendeten Vorlagen verwenden Bicep-Module .
Erstellen Sie einen Ordner mit dem Namen ./infra/core/host
und erstellen Sie dann ein ./infra/core/host/container-apps-environment.bicep
-Modul mit dem folgenden Inhalt.
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
Laden Sie das Modul in der ./infra/main.bicep
-Datei mit den folgenden Werten.
module appEnvironment './core/host/container-apps-environment.bicep' = {
name: 'appEnvironment'
scope: rg
params: {
name: appEnvironmentName
location: location
tags: tags
}
}
Führen Sie azd up
aus, um die Vorlage bereitzustellen.
Erstellen eines PostgreSQL-Dienstes
Erstellen Sie einen PostgreSQL-Dienst.
az containerapp add-on postgres create \
--name "$PG_SVC" \
--resource-group "$RESOURCE_GROUP" \
--environment "$ENVIRONMENT"
Fügen Sie der Datei postgres-dev.bicep
die folgenden Werte hinzu.
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'
Führen Sie az deployment group create
aus, um die Bicep-Vorlage bereitzustellen.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Der Ausgabebefehl postgresLogs
gibt einen CLI-Befehl aus, den Sie ausführen können, um nach der Bereitstellung PostgreSQL-Protokolle anzuzeigen.
Sie können den Befehl ausführen, um die Initialisierungsprotokolle des neuen Postgres-Diensts anzuzeigen.
Erstellen Sie eine Moduldatei ./infra/core/host/container-app-service.bicep
mit folgendem Inhalt.
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
Aktualisieren Sie als Nächstes die Moduldatei ./infra/main.bicep
mit der folgenden Deklaration.
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'
}
}
Stellen Sie dann mithilfe von azd up
die Vorlage bereit.
`azd up`
Anzeigen der Protokollausgabe aus der Postgres-Instanz
Verwenden Sie den Befehl logs
, um Protokollnachrichten anzuzeigen.
az containerapp logs show \
--name $PG_SVC \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
Das vorherige Bicep-Beispiel enthält eine Ausgabe für den Befehl zum Anzeigen der Protokolle.
Beispiel:
[
"az containerapp logs show -n postgres01 -g postgres-dev --follow --tail 30"
]
Wenn Sie den Befehl nicht haben, können Sie den Dienstnamen verwenden, um die Protokolle über die CLI abzurufen.
az containerapp logs show \
--name $PG_SVC \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
Verwenden sie den Befehl „logs“, um die Protokolle anzuzeigen.
az containerapp logs show \
--name postgres01 \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
Erstellen einer App zum Testen des Diensts
Wenn Sie die App erstellen, erstellen Sie zunächst eine Debug-App, um die psql
-CLI zum Herstellen einer Verbindung mit der PostgreSQL-Instanz zu verwenden.
Erstellen Sie eine psql
-Anwendung, die an den PostgreSQL-Dienst gebunden ist.
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"
Fügen Sie der Datei postgres-dev.bicep
die folgenden Werte hinzu.
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'
Tipp
Die Ausgabe pgsqlCliExec
gibt einen CLI-Befehl aus, der nach der Bereitstellung in der Testanwendung ausgeführt werden soll.
Erstellen Sie unter ./infra/core/host/container-app.bicep
ein Modul und fügen Sie die folgenden Werte hinzu.
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
}
}
}
}
Verwenden Sie nun das Modul in ./infra/main.bicep
, indem Sie die folgenden Werte hinzufügen.
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' ]
}
}
Stellen Sie die Vorlage mithilfe von azd up
bereit.
azd up
Führen Sie den CLI-Befehl exec
zum Herstellen einer Verbindung mit der Testanwendung aus.
az containerapp exec \
--name $PSQL_CLI_APP \
--resource-group $RESOURCE_GROUP \
--command /bin/bash
Das vorherige Bicep-Beispiel enthält eine Ausgabe, die zeigt, wie Sie die App ausführen.
Beispiel:
[
"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"
]
Wenn Sie den Befehl nicht haben, können Sie den Anwendungsnamen verwenden, um die Anwendung mit dem Befehl exec
auszuführen.
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
Wenn Sie in der Test-App --bind
oder serviceBinds
verwenden, werden die Verbindungsinformationen in die Anwendungsumgebung eingefügt. Nachdem Sie eine Verbindung mit dem Testcontainer hergestellt haben, können Sie die Werte mithilfe des Befehls env
untersuchen.
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...
Verwenden Sie psql
, um eine Verbindung mit dem Dienst herzustellen.
psql $POSTGRES_URL
Erstellen Sie eine Tabelle mit dem Namen accounts
und fügen Sie Daten ein.
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;
Verwenden eines Entwicklungsdienstes bei einer vorhandenen Anwendung
Wenn Sie bereits über eine App verfügen, die PostgreSQL verwendet, können Sie ändern, wie Verbindungsinformationen geladen werden.
Legen Sie zunächst die folgenden Umgebungsvariablen fest.
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...
Anschließend können Sie die Anwendung mithilfe der CLI (oder Bicep) aktualisieren, um --bind $PG_SVC
hinzuzufügen, um den erstellten Entwicklungsdienst zu verwenden.
Bindung an den Entwicklungsdienst
Stellen Sie pgweb bereit, um die PostgreSQL-Instanz anzuzeigen und zu verwalten.
Siehe Bicep oder das Beispiel 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}'
Stellen Sie die Bicep-Vorlage mit demselben Befehl bereit.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Der Bicep-Befehl gibt eine URL zurück. Kopieren Sie diese URL in Ihren Browser, um die bereitgestellte Website zu besuchen.
Aktualisieren Sie ./infra/main.bicep
mit den folgenden Werten.
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
}
}
Stellen Sie die Vorlage mithilfe von azd up
bereit.
azd up
Bereitstellen aller Ressourcen
Verwenden Sie die folgenden Beispiele, wenn Sie alle Ressourcen gleichzeitig bereitstellen möchten.
Bicep
Die folgende Bicep-Vorlage enthält alle Ressourcen für dieses Tutorial.
Erstellen Sie eine Datei postgres-dev.bicep
mit dem folgenden Inhalt.
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}'
Verwenden Sie die Azure CLI, um die Vorlage bereitzustellen.
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
Eine finale Vorlage finden Sie auf GitHub.
Verwenden Sie azd up
zum Bereitstellen der Vorlage.
git clone https://github.com/Azure-Samples/aca-dev-service-postgres-azd
cd aca-dev-service-postgres-azd
azd up
Bereinigen von Ressourcen
Führen Sie anschließend den folgenden Befehl aus, um die Ressourcengruppe zu löschen, die Ihre Container Apps-Ressourcen enthält.
Achtung
Mit dem folgenden Befehl werden die angegebene Ressourcengruppe und alle darin enthaltenen Ressourcen gelöscht. Falls in der angegebenen Ressourcengruppe Ressourcen enthalten sind, die nicht zum Umfang dieses Tutorials gehören, werden sie ebenfalls gelöscht.
az group delete \
--resource-group $RESOURCE_GROUP