Kurz: Použití služby PostgreSQL pro vývoj
Článek 06/23/2023
Přispěvatelé: 4
Váš názor
V tomto článku
Azure Container Apps umožňuje připojit se ke službám na úrovni vývoje a produkce a poskytovat tak vašim aplikacím širokou škálu funkcí.
V tomto kurzu se naučíte používat službu PostgreSQL pro vývoj s využitím aplikací kontejneru.
V tomto kurzu najdete příkazy Azure CLI a fragmenty šablon Bicep. Pokud používáte Bicep, můžete přidat všechny fragmenty do jednoho souboru Bicep a nasadit šablonu všechny najednou .
Vytvoření prostředí Container Apps pro nasazení aplikací služby a kontejneru
Vytvoření služby PostgreSQL
Vytvoření a použití aplikace příkazového řádku k používání služby PostgreSQL pro vývoj
Vytvoření aplikace pgweb
Zápis dat do databáze PostgreSQL
Požadavky
Poznámka
Pokud chcete nasadit jeden příkaz, přejděte k poslednímu azd
kroku šablony .
Nastavení
Definujte proměnné pro společné hodnoty.
RESOURCE_GROUP="postgres-dev"
LOCATION="northcentralus"
ENVIRONMENT="aca-env"
PG_SVC="postgres01"
PSQL_CLI_APP="psql-cloud-cli-app"
Následující proměnné umožňují použít rozhraní příkazového řádku k nasazení šablony Bicep.
RESOURCE_GROUP="postgres-dev"
LOCATION="northcentralus"
Pro Bicep začněte vytvořením souboru s názvem postgres-dev.bicep
a pak přidejte parametry s následujícími výchozími hodnotami.
targetScope = 'resourceGroup'
param location string = resourceGroup().location
param appEnvironmentName string = 'aca-env'
param pgSvcName string = 'postgres01'
param pgsqlCliAppName string = 'psql-cloud-cli-app'
Při nasazování šablony bicep v libovolné fázi můžete použít az deployment group create
příkaz .
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Definujte počáteční proměnné.
AZURE_ENV_NAME="azd-postgres-dev"
LOCATION="northcentralus"
Hodnoty použijte k inicializaci minimální azd
šablony.
azd init \
--environment "$AZURE_ENV_NAME" \
--location "$LOCATION" \
--no-prompt
Poznámka
AZURE_ENV_NAME
se liší od názvu prostředí aplikace kontejneru. V tomto kontextu AZURE_ENV_NAME
je in azd
pro všechny prostředky v šabloně. Tyto prostředky zahrnují prostředky, které nejsou přidružené k aplikacím kontejneru. Pro prostředí Container Apps vytvoříte jiný název.
Dále vytvořte infra/main.bicep
a definujte parametry pro pozdější použití.
param appEnvironmentName string = 'aca-env'
param pgSvcName string = 'postgres01'
param pgsqlCliAppName string = 'psql-cloud-cli-app'
Přihlásí se k Azure.
az login
Upgradujte rozhraní příkazového řádku na nejnovější verzi.
az upgrade
Upgradujte Bicep na nejnovější verzi.
az bicep upgrade
Přidejte rozšíření containerapp
.
az extension add --name containerapp --upgrade
Registrace požadovaných oborů názvů
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
Vytvoření prostředí Container Apps
Vytvořte skupinu prostředků.
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
Při nasazování šablony bicep v libovolné fázi můžete použít az deployment group create
příkaz .
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Pro správu skupin prostředků v azd
nástroji není potřeba žádné zvláštní nastavení. Příkaz azd
získá skupinu prostředků z AZURE_ENV_NAME
/--environment
hodnoty .
Minimální šablonu můžete otestovat pomocí up
příkazu .
azd up
Spuštěním tohoto příkazu se vytvoří prázdná skupina prostředků.
Vytvořte prostředí Container Apps.
az containerapp env create \
--name "$ENVIRONMENT" \
--resource-group "$RESOURCE_GROUP" \
--location "$LOCATION"
Do souboru přidejte následující hodnoty postgres-dev.bicep
.
resource appEnvironment 'Microsoft.App/managedEnvironments@2023-04-01-preview' = {
name: appEnvironmentName
location: location
properties: {
appLogsConfiguration: {
destination: 'azure-monitor'
}
}
}
Azure CLI pro každé prostředí automaticky vytvoří pracovní prostor služby Log Analytics. Pokud chcete vygenerovat pracovní prostor pomocí šablony Bicep, musíte prostředí explicitně deklarovat a propojit ho v šabloně. Díky tomuto kroku bude vaše nasazení stabilnější, i když bude trochu podrobné.
Do svého prostředí přidejte následující hodnoty.
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
}
}
}
}
Šablony používané nástrojem azd
používají moduly bicep .
Vytvořte složku s názvem ./infra/core/host
a pak vytvořte ./infra/core/host/container-apps-environment.bicep
modul s následujícím obsahem.
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
Do souboru načtěte modul pomocí následujících hodnot.
module appEnvironment './core/host/container-apps-environment.bicep' = {
name: 'appEnvironment'
scope: rg
params: {
name: appEnvironmentName
location: location
tags: tags
}
}
Spuštěním příkazu azd up
šablonu nasaďte.
Vytvoření služby PostgreSQL
Vytvořte službu PostgreSQL.
az containerapp add-on postgres create \
--name "$PG_SVC" \
--resource-group "$RESOURCE_GROUP" \
--environment "$ENVIRONMENT"
Do přidejte následující hodnoty 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'
Pokud chcete nasadit šablonu bicep, spusťte příkaz az deployment group create
.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
postgresLogs
Výstupní příkaz vypíše příkaz rozhraní příkazového řádku, který můžete spustit a zobrazit protokoly PostgreSQL po nasazení.
Spuštěním příkazu můžete zobrazit protokoly inicializace nové služby postgres.
Vytvořte ./infra/core/host/container-app-service.bicep
soubor modulu s následujícím obsahem.
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
Dále aktualizujte ./infra/main.bicep
soubor modulu následující deklarací.
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'
}
}
Pak šablonu nasaďte pomocí azd up
příkazu .
`azd up`
Zobrazení výstupu protokolu z instance Postgres
Pomocí příkazu logs
zobrazte zprávy protokolu.
az containerapp logs show \
--name $PG_SVC \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
Předchozí příklad nástroje bicep obsahuje výstup příkazu pro zobrazení protokolů.
Příklad:
[
"az containerapp logs show -n postgres01 -g postgres-dev --follow --tail 30"
]
Pokud příkaz nemáte, můžete k zobrazení protokolů použít název služby pomocí rozhraní příkazového řádku.
az containerapp logs show \
--name $PG_SVC \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
K zobrazení protokolů použijte příkaz logs.
az containerapp logs show \
--name postgres01 \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
Vytvoření aplikace pro testování služby
Při vytváření aplikace začnete vytvořením ladicí aplikace, která použije rozhraní příkazového psql
řádku pro připojení k instanci PostgreSQL.
Vytvořte psql
aplikaci, která vytvoří vazbu na službu 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"
Do přidejte následující hodnoty 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'
Tip
Výstupem pgsqlCliExec
je příkaz rozhraní příkazového řádku, který po nasazení provede spuštění do testovací aplikace.
V části ./infra/core/host/container-app.bicep
vytvořte modul a přidejte následující hodnoty.
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
}
}
}
}
Teď použijte modul v souboru ./infra/main.bicep
přidáním následujících hodnot.
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' ]
}
}
Nasaďte šablonu pomocí azd up
příkazu .
azd up
Spuštěním příkazu rozhraní příkazového řádku exec
se připojte k testovací aplikaci.
az containerapp exec \
--name $PSQL_CLI_APP \
--resource-group $RESOURCE_GROUP \
--command /bin/bash
Předchozí příklad Bicep obsahuje výstup, který ukazuje, jak aplikaci spustit.
Příklad:
[
"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"
]
Pokud tento příkaz nemáte, můžete aplikaci spustit pomocí exec
příkazu s názvem aplikace.
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
Při použití --bind
nebo serviceBinds
v testovací aplikaci se informace o připojení vloží do prostředí aplikace. Po připojení k testovacímu kontejneru můžete hodnoty zkontrolovat pomocí env
příkazu .
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...
Připojíme se ke službě.psql
psql $POSTGRES_URL
Vytvořte tabulku s názvem accounts
a vložte 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;
Použití vývojové služby s existující aplikací
Pokud už máte aplikaci, která používá PostgreSQL, můžete změnit způsob načítání informací o připojení.
Nejprve vytvořte následující proměnné prostředí.
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...
Pomocí rozhraní příkazového řádku (nebo Bicep) můžete aplikaci aktualizovat tak, aby používala --bind $PG_SVC
vývojovou službu.
Vazba na službu pro vývoj
Nasaďte pgweb pro zobrazení a správu instance PostgreSQL.
Viz Bicep nebo azd
příklad.
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}'
Nasaďte šablonu bicep pomocí stejného příkazu.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Příkaz Bicep vrátí adresu URL. Pokud chcete navštívit nasazený web, zkopírujte tuto adresu URL do prohlížeče.
Aktualizujte ./infra/main.bicep
následujícími hodnotami.
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
}
}
Nasaďte šablonu pomocí azd up
příkazu .
azd up
Nasazení všech prostředků
Pokud chcete nasadit všechny prostředky najednou, použijte následující příklady.
Bicep
Následující šablona Bicep obsahuje všechny prostředky v tomto kurzu.
Můžete vytvořit postgres-dev.bicep
soubor s tímto obsahem.
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}'
K nasazení šablony použijte Azure CLI.
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
Konečná šablona je k dispozici na GitHubu.
Použijte azd up
k nasazení šablony.
git clone https://github.com/Azure-Samples/aca-dev-service-postgres-azd
cd aca-dev-service-postgres-azd
azd up
Vyčištění prostředků
Jakmile budete hotovi, spuštěním následujícího příkazu odstraňte skupinu prostředků, která obsahuje vaše prostředky Container Apps.
Upozornění
Následující příkaz odstraní zadanou skupinu prostředků a všechny prostředky v ní obsažené. Pokud v zadané skupině prostředků existují prostředky mimo rozsah tohoto kurzu, odstraní se také.
az group delete \
--resource-group $RESOURCE_GROUP