Självstudie: Använda en PostgreSQL-tjänst för utveckling
Artikel 07/03/2024
5 deltagare
Feedback
I den här artikeln
Med Azure Container Apps kan du ansluta till tjänster i utvecklings- och produktionsklass för att tillhandahålla en mängd olika funktioner till dina program.
I den här självstudien lär du dig att använda en PostgreSQL-tjänst för utveckling med Container Apps.
Azure CLI-kommandon och Bicep-mallfragment finns med i den här självstudien. Om du använder Bicep kan du lägga till alla fragment i en enda Bicep-fil och distribuera mallen samtidigt .
Skapa en Container Apps-miljö för att distribuera dina tjänst- och containerappar
Skapa en PostgreSQL-tjänst
Skapa och använda en kommandoradsapp för att använda dev PostgreSQL-tjänsten
Skapa en pgweb-app
Skriva data till PostgreSQL-databasen
Förutsättningar
Kommentar
För en distribution med ett kommando går du vidare till det sista azd
mallsteget .
Ställ in
Definiera variabler för vanliga värden.
RESOURCE_GROUP="postgres-dev"
LOCATION="northcentralus"
ENVIRONMENT="aca-env"
PG_SVC="postgres01"
PSQL_CLI_APP="psql-cloud-cli-app"
Med följande variabler kan du använda CLI för att distribuera Bicep-mallen.
RESOURCE_GROUP="postgres-dev"
LOCATION="northcentralus"
För Bicep börjar du med att skapa en fil med namnet postgres-dev.bicep
och lägger sedan till parametrar med följande standardvärden.
targetScope = 'resourceGroup'
param location string = resourceGroup().location
param appEnvironmentName string = 'aca-env'
param pgSvcName string = 'postgres01'
param pgsqlCliAppName string = 'psql-cloud-cli-app'
När du distribuerar bicep-mallen i alla steg kan du använda az deployment group create
kommandot .
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Definiera dina inledande variabler.
AZURE_ENV_NAME="azd-postgres-dev"
LOCATION="northcentralus"
Använd värdena för att initiera en minimal azd
mall.
azd init \
--environment "$AZURE_ENV_NAME" \
--location "$LOCATION" \
--no-prompt
Kommentar
AZURE_ENV_NAME
skiljer sig från containerappens miljönamn. I det här sammanhanget AZURE_ENV_NAME
gäller in azd
för alla resurser i en mall. Dessa resurser omfattar resurser som inte är associerade med Container Apps. Du skapar ett annat namn för Container Apps-miljön.
infra/main.bicep
Skapa och definiera sedan parametrar för senare användning.
param appEnvironmentName string = 'aca-env'
param pgSvcName string = 'postgres01'
param pgsqlCliAppName string = 'psql-cloud-cli-app'
Logga in på Azure.
az login
Uppgradera CLI till den senaste versionen.
az upgrade
Uppgradera Bicep till den senaste versionen.
az bicep upgrade
Lägg till det här containerapp
tillägget.
az extension add --name containerapp --upgrade
Registrera nödvändiga namnområden.
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
Skapa en Container Apps-miljö
Skapa en resursgrupp.
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
När du distribuerar bicep-mallen i alla steg kan du använda az deployment group create
kommandot .
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Ingen särskild konfiguration krävs för att hantera resursgrupper i azd
. Kommandot azd
hämtar resursgruppen från värdet/AZURE_ENV_NAME
--environment
.
Du kan testa den minimala mallen up
med kommandot .
azd up
När du kör det här kommandot skapas en tom resursgrupp.
Skapa en Container Apps-miljö.
az containerapp env create \
--name "$ENVIRONMENT" \
--resource-group "$RESOURCE_GROUP" \
--location "$LOCATION"
Lägg till följande värden i postgres-dev.bicep
filen.
resource appEnvironment 'Microsoft.App/managedEnvironments@2023-04-01-preview' = {
name: appEnvironmentName
location: location
properties: {
appLogsConfiguration: {
destination: 'azure-monitor'
}
}
}
Azure CLI skapar automatiskt en Log Analytics-arbetsyta för varje miljö. Om du vill generera en arbetsyta med hjälp av en Bicep-mall deklarerar du uttryckligen miljön och länkar till den i mallen. Det här steget gör distributionen stabilare, även om den är lite utförlig.
Lägg till följande värden i din miljö.
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
}
}
}
}
De mallar som används av azd
bicep-moduler .
Skapa en mapp med namnet ./infra/core/host
och skapa sedan en ./infra/core/host/container-apps-environment.bicep
modul med följande innehåll.
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
Läs in modulen ./infra/main.bicep
i filen med hjälp av följande värden.
module appEnvironment './core/host/container-apps-environment.bicep' = {
name: 'appEnvironment'
scope: rg
params: {
name: appEnvironmentName
location: location
tags: tags
}
}
Distribuera mallen genom att köra azd up
.
Skapa en PostgreSQL-tjänst
Skapa en PostgreSQL-tjänst.
az containerapp add-on postgres create \
--name "$PG_SVC" \
--resource-group "$RESOURCE_GROUP" \
--environment "$ENVIRONMENT"
Lägg till följande värden i 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'
Om du vill distribuera bicep-mallen kör du az deployment group create
.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Utdatakommandot postgresLogs
matar ut ett CLI-kommando som du kan köra för att visa PostgreSQL-loggar efter distributionen.
Du kan köra kommandot för att visa initieringsloggarna för den nya postgres-tjänsten.
Skapa en ./infra/core/host/container-app-service.bicep
modulfil med följande innehåll.
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
Uppdatera ./infra/main.bicep
sedan modulfilen med följande 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'
}
}
Distribuera sedan mallen med .azd up
`azd up`
Visa loggutdata från Postgres-instansen
logs
Använd kommandot för att visa loggmeddelanden.
az containerapp logs show \
--name $PG_SVC \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
Föregående bicep-exempel innehåller utdata för kommandot för att visa loggarna.
Till exempel:
[
"az containerapp logs show -n postgres01 -g postgres-dev --follow --tail 30"
]
Om du inte har kommandot kan du använda tjänstnamnet för att visa loggarna med hjälp av CLI.
az containerapp logs show \
--name $PG_SVC \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
använd loggkommandot för att visa loggarna
az containerapp logs show \
--name postgres01 \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
Skapa en app för att testa tjänsten
När du skapar appen börjar du med att skapa en felsökningsapp för att använda psql
CLI för att ansluta till PostgreSQL-instansen.
Skapa en psql
app som binder till PostgreSQL-tjänsten.
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"
Lägg till följande värden i 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'
Dricks
Utdata matar pgsqlCliExec
ut ett CLI-kommando som ska distribueras till testappen efter distributionen.
Skapa en modul under ./infra/core/host/container-app.bicep
och lägg till följande värden.
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
}
}
}
}
Använd nu modulen i ./infra/main.bicep
genom att lägga till följande värden.
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' ]
}
}
Distribuera mallen med azd up
.
azd up
Kör CLI-kommandot exec
för att ansluta till testappen.
az containerapp exec \
--name $PSQL_CLI_APP \
--resource-group $RESOURCE_GROUP \
--command /bin/bash
Föregående Bicep-exempel innehåller utdata som visar hur du kör appen.
Till exempel:
[
"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"
]
Om du inte har kommandot kan du använda appnamnet för att köra programmet med kommandot 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
När du använder --bind
eller serviceBinds
i testappen matas anslutningsinformationen in i programmiljön. När du ansluter till testcontainern kan du kontrollera värdena med hjälp av env
kommandot .
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...
Vi psql
ansluter till tjänsten
psql $POSTGRES_URL
Skapa en tabell med namnet accounts
och infoga data.
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;
Använda en utvecklingstjänst med en befintlig app
Om du redan har en app som använder PostgreSQL kan du ändra hur anslutningsinformation läses in.
Skapa först följande miljövariabler.
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...
Med hjälp av CLI (eller Bicep) kan du uppdatera appen att lägga --bind $PG_SVC
till för att använda dev-tjänsten.
Bindning till utvecklingstjänsten
Distribuera pgweb för att visa och hantera PostgreSQL-instansen.
Se Bicep eller azd
exempel.
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}'
Distribuera bicep-mallen med samma kommando.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Bicep-kommandot returnerar en URL. Kopiera den här URL:en till webbläsaren för att besöka den distribuerade webbplatsen.
Uppdatera ./infra/main.bicep
med följande värden.
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
}
}
Distribuera mallen med azd up
.
azd up
Distribuera alla resurser
Använd följande exempel om du vill distribuera alla resurser samtidigt.
Bicep
Följande Bicep-mall innehåller alla resurser i den här självstudien.
Du kan skapa en postgres-dev.bicep
fil med det här innehållet.
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}'
Använd Azure CLI för att distribuera mallen.
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
En slutlig mall finns på GitHub.
Använd azd up
för att distribuera mallen.
git clone https://github.com/Azure-Samples/aca-dev-service-postgres-azd
cd aca-dev-service-postgres-azd
azd up
Rensa resurser
När du är klar kör du följande kommando för att ta bort resursgruppen som innehåller dina Container Apps-resurser.
Varning
Följande kommando tar bort den angivna resursgruppen och alla resurser som ingår i den. Om det finns resurser utanför omfånget för den här självstudien i den angivna resursgruppen tas de också bort.
az group delete \
--resource-group $RESOURCE_GROUP