Samouczek: używanie usługi PostgreSQL do programowania
Artykuł 06/23/2023
Współautorzy: 4
Opinia
W tym artykule
Usługa Azure Container Apps umożliwia łączenie się z usługami programowania i klasy produkcyjnej w celu zapewnienia szerokiej gamy funkcji aplikacji.
Z tego samouczka dowiesz się, jak używać usługi PostgreSQL w usłudze Container Apps.
W tym samouczku przedstawiono polecenia interfejsu wiersza polecenia platformy Azure i fragmenty szablonów Bicep. Jeśli używasz Bicep, możesz dodać wszystkie fragmenty do pojedynczego pliku Bicep i wdrożyć szablon jednocześnie .
Tworzenie środowiska usługi Container Apps w celu wdrożenia aplikacji usługi i kontenera
Tworzenie usługi PostgreSQL
Tworzenie i używanie aplikacji wiersza polecenia do korzystania z usługi dev PostgreSQL
Tworzenie aplikacji pgweb
Zapisywanie danych w bazie danych PostgreSQL
Wymagania wstępne
Uwaga
W przypadku jednego wdrożenia polecenia przejdź do ostatniego azd
kroku szablonu .
Konfigurowanie
Zdefiniuj zmienne dla typowych wartości.
RESOURCE_GROUP="postgres-dev"
LOCATION="northcentralus"
ENVIRONMENT="aca-env"
PG_SVC="postgres01"
PSQL_CLI_APP="psql-cloud-cli-app"
Poniższe zmienne umożliwiają wdrożenie szablonu Bicep przy użyciu interfejsu wiersza polecenia.
RESOURCE_GROUP="postgres-dev"
LOCATION="northcentralus"
W przypadku Bicep zacznij od utworzenia pliku o nazwie postgres-dev.bicep
, a następnie dodaj parametry z następującymi wartościami domyślnymi.
targetScope = 'resourceGroup'
param location string = resourceGroup().location
param appEnvironmentName string = 'aca-env'
param pgSvcName string = 'postgres01'
param pgsqlCliAppName string = 'psql-cloud-cli-app'
Podczas wdrażania szablonu bicep na dowolnym etapie możesz użyć az deployment group create
polecenia .
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Zdefiniuj zmienne początkowe.
AZURE_ENV_NAME="azd-postgres-dev"
LOCATION="northcentralus"
Użyj wartości, aby zainicjować minimalny azd
szablon.
azd init \
--environment "$AZURE_ENV_NAME" \
--location "$LOCATION" \
--no-prompt
Uwaga
AZURE_ENV_NAME
różni się od nazwy środowiska aplikacji kontenera. W tym kontekście AZURE_ENV_NAME
element in azd
jest przeznaczony dla wszystkich zasobów w szablonie. Te zasoby obejmują zasoby, które nie są skojarzone z usługą Container Apps. Utworzysz inną nazwę dla środowiska Container Apps.
Następnie utwórz infra/main.bicep
i zdefiniuj parametry do późniejszego użycia.
param appEnvironmentName string = 'aca-env'
param pgSvcName string = 'postgres01'
param pgsqlCliAppName string = 'psql-cloud-cli-app'
Loguje się do platformy Azure.
az login
Uaktualnij interfejs wiersza polecenia do najnowszej wersji.
az upgrade
Uaktualnij program Bicep do najnowszej wersji.
az bicep upgrade
Dodaj rozszerzenie th containerapp
.
az extension add --name containerapp --upgrade
Zarejestruj wymagane przestrzenie nazw.
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
Tworzenie środowiska usługi Container Apps
Utwórz grupę zasobów.
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
Podczas wdrażania szablonu bicep na dowolnym etapie możesz użyć az deployment group create
polecenia .
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Do zarządzania grupami zasobów w programie azd
nie jest wymagana żadna specjalna konfiguracja. Polecenie azd
pobiera grupę zasobów z AZURE_ENV_NAME
/--environment
wartości.
Możesz przetestować minimalny szablon za pomocą up
polecenia .
azd up
Uruchomienie tego polecenia powoduje utworzenie pustej grupy zasobów.
Tworzenie środowiska usługi Container Apps.
az containerapp env create \
--name "$ENVIRONMENT" \
--resource-group "$RESOURCE_GROUP" \
--location "$LOCATION"
Dodaj następujące wartości do postgres-dev.bicep
pliku.
resource appEnvironment 'Microsoft.App/managedEnvironments@2023-04-01-preview' = {
name: appEnvironmentName
location: location
properties: {
appLogsConfiguration: {
destination: 'azure-monitor'
}
}
}
Interfejs wiersza polecenia platformy Azure automatycznie tworzy obszar roboczy usługi Log Analytics dla każdego środowiska. Aby wygenerować obszar roboczy przy użyciu szablonu Bicep, jawnie zadeklarujesz środowisko i połączysz go z nim w szablonie. Ten krok sprawia, że wdrożenie jest bardziej stabilne, nawet jeśli koszt jest trochę pełny.
Dodaj następujące wartości do środowiska.
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
}
}
}
}
Szablony używane przez azd
moduły bicep .
Utwórz folder o nazwie ./infra/core/host
, a następnie utwórz ./infra/core/host/container-apps-environment.bicep
moduł z następującą zawartością.
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
W pliku załaduj ./infra/main.bicep
moduł przy użyciu następujących wartości.
module appEnvironment './core/host/container-apps-environment.bicep' = {
name: 'appEnvironment'
scope: rg
params: {
name: appEnvironmentName
location: location
tags: tags
}
}
Uruchom polecenie azd up
, aby wdrożyć szablon.
Tworzenie usługi PostgreSQL
Utwórz usługę PostgreSQL.
az containerapp add-on postgres create \
--name "$PG_SVC" \
--resource-group "$RESOURCE_GROUP" \
--environment "$ENVIRONMENT"
Dodaj następujące wartości do 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'
Aby wdrożyć szablon bicep, uruchom polecenie az deployment group create
.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Polecenie wyjściowe postgresLogs
zwraca polecenie interfejsu wiersza polecenia, które można uruchomić, aby wyświetlić dzienniki postgreSQL po wdrożeniu.
Możesz uruchomić polecenie , aby wyświetlić dzienniki inicjowania nowej usługi postgres.
Utwórz plik modułu ./infra/core/host/container-app-service.bicep
z następującą zawartością.
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
Następnie zaktualizuj plik modułu ./infra/main.bicep
przy użyciu następującej deklaracji.
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'
}
}
Następnie wdróż szablon przy użyciu polecenia azd up
.
`azd up`
Wyświetlanie danych wyjściowych dziennika z wystąpienia bazy danych Postgres
Użyj polecenia , logs
aby wyświetlić komunikaty dziennika.
az containerapp logs show \
--name $PG_SVC \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
Poprzedni przykład bicep zawiera dane wyjściowe polecenia, aby wyświetlić dzienniki.
Na przykład:
[
"az containerapp logs show -n postgres01 -g postgres-dev --follow --tail 30"
]
Jeśli nie masz polecenia, możesz użyć nazwy usługi, aby wyświetlić dzienniki przy użyciu interfejsu wiersza polecenia.
az containerapp logs show \
--name $PG_SVC \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
użyj polecenia logs, aby wyświetlić dzienniki
az containerapp logs show \
--name postgres01 \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
Tworzenie aplikacji do testowania usługi
Po utworzeniu aplikacji zaczniesz od utworzenia aplikacji debugowania, aby używać interfejsu psql
wiersza polecenia do nawiązywania połączenia z wystąpieniem bazy danych PostgreSQL.
Utwórz aplikację powiązaną psql
z usługą 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"
Dodaj następujące wartości do 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'
Porada
Dane wyjściowe pgsqlCliExec
wyprowadzają polecenie interfejsu wiersza polecenia, aby wykonać polecenie exec w aplikacji testowej po wdrożeniu.
Utwórz moduł w obszarze ./infra/core/host/container-app.bicep
i dodaj następujące wartości.
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
}
}
}
}
Teraz użyj modułu w ./infra/main.bicep
programie, dodając następujące wartości.
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' ]
}
}
Wdróż szablon przy użyciu polecenia azd up
.
azd up
Uruchom polecenie interfejsu wiersza polecenia exec
, aby nawiązać połączenie z aplikacją testowa.
az containerapp exec \
--name $PSQL_CLI_APP \
--resource-group $RESOURCE_GROUP \
--command /bin/bash
Poprzedni przykład Bicep zawiera dane wyjściowe, które pokazują, jak uruchomić aplikację.
Na przykład:
[
"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"
]
Jeśli nie masz polecenia , możesz użyć nazwy aplikacji do uruchomienia aplikacji przy użyciu exec
polecenia .
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
W przypadku korzystania z --bind
aplikacji testowej lub serviceBinds
w aplikacji testowej informacje o połączeniu są wstrzykiwane do środowiska aplikacji. Po nawiązaniu połączenia z kontenerem testowym możesz sprawdzić wartości przy użyciu env
polecenia .
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...
Aby psql
nawiązać połączenie z usługą
psql $POSTGRES_URL
Utwórz tabelę o nazwie accounts
i wstaw dane.
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;
Używanie usługi dewelopera z istniejącą aplikacją
Jeśli masz już aplikację korzystającą z bazy danych PostgreSQL, możesz zmienić sposób ładowania informacji o połączeniu.
Najpierw utwórz następujące zmienne środowiskowe.
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...
Za pomocą interfejsu wiersza polecenia (lub Bicep) możesz zaktualizować aplikację, aby dodać --bind $PG_SVC
aplikację do korzystania z usługi dewelopera.
Wiązanie z usługą dewelopera
Wdróż aplikację pgweb , aby wyświetlić wystąpienie bazy danych PostgreSQL i zarządzać nim.
Zobacz Bicep lub azd
przykład.
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}'
Wdróż szablon bicep za pomocą tego samego polecenia.
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file postgres-dev.bicep
Polecenie Bicep zwraca adres URL. Skopiuj ten adres URL do przeglądarki, aby przejść do wdrożonej witryny.
Zaktualizuj ./infra/main.bicep
przy użyciu następujących wartości.
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
}
}
Wdróż szablon przy użyciu azd up
polecenia .
azd up
Wdrażanie wszystkich zasobów
Skorzystaj z poniższych przykładów, aby wdrożyć wszystkie zasoby jednocześnie.
Bicep
Poniższy szablon Bicep zawiera wszystkie zasoby w tym samouczku.
Możesz utworzyć postgres-dev.bicep
plik z tą zawartością.
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}'
Użyj interfejsu wiersza polecenia platformy Azure, aby wdrożyć go w szablonie.
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
Ostateczny szablon jest dostępny w witrynie GitHub.
Użyj polecenia azd up
, aby wdrożyć szablon.
git clone https://github.com/Azure-Samples/aca-dev-service-postgres-azd
cd aca-dev-service-postgres-azd
azd up
Czyszczenie zasobów
Po zakończeniu uruchom następujące polecenie, aby usunąć grupę zasobów zawierającą zasoby usługi Container Apps.
Przestroga
Następujące polecenie usuwa określoną grupę zasobów i wszystkie zawarte w niej zasoby. Jeśli zasoby spoza zakresu tego samouczka istnieją w określonej grupie zasobów, zostaną również usunięte.
az group delete \
--resource-group $RESOURCE_GROUP