Share via


教學課程:使用 PostgreSQL 服務進行開發

Azure Container Apps 可讓您連線到開發和生產等級的服務,為您的應用程式提供各種不同的功能。

在本教學課程中,您將瞭解如何搭配 Container Apps 使用開發 PostgreSQL 服務。

本教學課程中提供 Azure CLI 命令和 Bicep 範本片段。 如果您使用 Bicep,您可以將所有片段新增至單一 Bicep 檔案,並 一次部署範本

  • 建立 Container Apps 環境以部署您的服務和容器應用程式
  • 建立 PostgreSQL 服務
  • 建立和使用命令列應用程式以使用開發 PostgreSQL 服務
  • 建立 pgweb 應用程式
  • 將資料寫入 PostgreSQL 資料庫

必要條件

注意

針對一個命令部署,請跳至最後一個 azd範本步驟

安裝程式

  1. 定義一般值的變數。

    RESOURCE_GROUP="postgres-dev"
    LOCATION="northcentralus"
    ENVIRONMENT="aca-env"
    PG_SVC="postgres01"
    PSQL_CLI_APP="psql-cloud-cli-app"
    
  2. 登入 Azure。

    az login
    
  3. 將 CLI 升級至最新版本。

    az upgrade
    
  4. 將 Bicep 升級至最新版本。

    az bicep upgrade
    
  5. 新增延伸 containerapp 模組。

    az extension add --name containerapp --upgrade
    
  6. 註冊必要的命名空間。

    az provider register --namespace Microsoft.App
    
    az provider register --namespace Microsoft.OperationalInsights
    

建立 Container Apps 環境

  1. 建立資源群組。

    az group create \
        --name "$RESOURCE_GROUP" \
        --location "$LOCATION"
    
  2. 建立 Container Apps 環境。

    az containerapp env create \
      --name "$ENVIRONMENT" \
      --resource-group "$RESOURCE_GROUP" \
      --location "$LOCATION"
    

建立 PostgreSQL 服務

  1. 建立 PostgreSQL 服務。

    az containerapp add-on postgres create \
        --name "$PG_SVC" \
        --resource-group "$RESOURCE_GROUP" \
        --environment "$ENVIRONMENT"
    
  2. 檢視 Postgres 實例的記錄輸出

    logs使用 命令來檢視記錄訊息。

    az containerapp logs show \
        --name $PG_SVC \
        --resource-group $RESOURCE_GROUP \
        --follow --tail 30
    

    容器應用程式 PostgreSQL 服務記錄的螢幕擷取畫面。

建立應用程式以測試服務

當您建立應用程式時,首先會建立偵錯應用程式以使用 psql CLI 連線到 PostgreSQL 實例。

  1. 建立 psql 系結至 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"
    
  2. 執行 CLI exec 命令以連線到測試應用程式。

    az containerapp exec \
        --name $PSQL_CLI_APP \
        --resource-group $RESOURCE_GROUP \
        --command /bin/bash
    

    當您在測試應用程式上使用 --bindserviceBinds 時,連線資訊會插入應用程式環境中。 連線到測試容器之後,您可以使用 命令來檢查值 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...
    
  3. 我們 psql 連線到服務

    psql $POSTGRES_URL
    

    使用 pgsql 連線到 PostgreSQL 服務的容器應用程式的螢幕擷取畫面。

  4. 建立名為 accounts 的資料表並插入資料。

    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;
    

    使用 pgsql 連線到 PostgreSQL 的容器應用程式的螢幕擷取畫面,並建立資料表並植入一些資料。

搭配現有應用程式使用開發人員服務

如果您已經有使用 PostgreSQL 的應用程式,您可以變更連線資訊的載入方式。

首先,建立下列環境變數。

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...

您可以使用 CLI (或 Bicep) 更新應用程式以新增 --bind $PG_SVC 以使用開發服務。

系結至開發服務

部署 pgweb 以檢視和管理 PostgreSQL 實例。

請參閱 Bicep 或 azd 範例。

連線到 PostgreSQL 服務的 pgweb 容器應用程式螢幕擷取畫面。

部署所有資源

如果您想要一次部署所有資源,請使用下列範例。

Bicep

下列 Bicep 範本包含本教學課程中的所有資源。

您可以使用此內容建立檔案 postgres-dev.bicep

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}'

使用 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 開發人員 CLI

GitHub 上提供 最終範本

使用 azd up 來部署範本。

git clone https://github.com/Azure-Samples/aca-dev-service-postgres-azd
cd aca-dev-service-postgres-azd
azd up

清除資源

完成後,請執行下列命令來刪除包含您容器應用程式資源的資源群組。

警告

下列命令會刪除指定的資源群組和其中包含的所有資源。 如果本教學課程範圍以外的資源存在於指定的資源群組中,則也會一併刪除。

az group delete \
    --resource-group $RESOURCE_GROUP