共用方式為


教學課程:使用 Azure CLI 將數據 API 產生器部署至 Azure Container Apps

數據 API 產生器可以快速地部署到 Azure 服務,例如 Azure Container Apps 作為應用程式堆疊的一部分。 在本教學課程中,您會使用 Azure CLI,在將數據 API 產生器部署至 Azure 時,將一般工作自動化。 首先,您會使用數據 API 產生器建置容器映像,並將其儲存在 Azure Container Registry 中。 接著,您可以使用備份 Azure SQL 資料庫,將容器映射部署至 Azure Container Apps。 整個教學會使用受控身分識別驗證每個元件。

在本教學課程中,您會:

  • 建立具有角色型訪問控制許可權的受控識別
  • 使用範例 AdventureWorksLT 數據集部署 Azure SQL
  • 在 Azure Container Registry 中暫存容器映像
  • 使用數據 API 產生器容器映射部署 Azure 容器應用程式

如尚未擁有 Azure 訂用帳戶,請在開始之前先建立免費帳戶

先決條件

  • Azure 訂用帳戶
  • Azure Cloud Shell
    • Azure Cloud Shell 是一種互動式 Shell 環境,您可以通過瀏覽器使用。 使用此終端機及其預安裝指令來執行本文中的程式碼,無需在本機環境安裝任何東西。 若要啟動 Azure Cloud Shell:
      • 選擇本文內的程式代碼或命令區塊中的試試看。 選取 [ 試用] 不會自動將程式代碼或命令複製到 Cloud Shell。
      • 移至https://shell.azure.com,或選取啟動 Cloud Shell
      • 在 Azure 入口網站的功能表欄中選取 Cloud Shellhttps://portal.azure.com

建立容器應用程式

首先,使用系統指派的受控識別來建立 Azure Container Apps 實例。 此身分識別最終會獲得角色型訪問控制許可權,以存取 Azure SQL 和 Azure Container Registry。

  1. 在本教學課程稍後建立要用於多個資源名稱的通用 SUFFIX 變數。

    let SUFFIX=$RANDOM*$RANDOM
    
  2. 使用 LOCATION 您選取的 Azure 區域來建立變數,以在本教學課程中使用。

    LOCATION="<azure-region>"
    

    備註

    例如,如果您想要部署至 美國西部 區域,您可以使用此腳本。

    LOCATION="westus"
    

    如需目前訂用帳戶支援的區域清單,請使用 az account list-locations

    az account list-locations --query "[].{Name:displayName,Slug:name}" --output table
    

    如需詳細資訊,請參閱 Azure 區域

  3. 使用資源組名建立名為 RESOURCE_GROUP_NAME 的變數。 在本教學中,我們建議 msdocs-dab-*。 在本教學課程中,您會使用此值多次。

    RESOURCE_GROUP_NAME="msdocs-dab$SUFFIX"    
    
  4. 使用 az group create建立新的資源群組。

    az group create \
      --name $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --tag "source=msdocs-dab-tutorial"
    
  5. 為您的 Azure Container Apps 實例建立名為 API_CONTAINER_NAMECONTAINER_ENV_NAME 具有唯一產生名稱的變數。 您會在整個教學課程中使用這些變數。

    API_CONTAINER_NAME="api$SUFFIX"
    CONTAINER_ENV_NAME="env$SUFFIX"
    
  6. 用來 az containerapp env create 建立新的 Azure Container Apps 環境。

    az containerapp env create \ 
      --resource-group $RESOURCE_GROUP_NAME \
      --name $CONTAINER_ENV_NAME \
      --logs-destination none \
      --location $LOCATION
    
  7. 使用 mcr.microsoft.com/azure-databases/data-api-builder DAB 容器映像和 az containerapp create 命令建立新的容器應用程式。 此容器應用程式會順利執行,但未連線到任何資料庫。

    az containerapp create \ 
      --resource-group $RESOURCE_GROUP_NAME \
      --environment $CONTAINER_ENV_NAME \
      --name $API_CONTAINER_NAME \
      --image "mcr.microsoft.com/azure-databases/data-api-builder" \
      --ingress "external" \
      --target-port "5000" \
      --system-assigned
    
  8. 使用 取得受控識別的az identity show標識碼,並將值儲存在名為MANAGED_IDENTITY_PRINCIPAL_ID的變數中。

    MANAGED_IDENTITY_PRINCIPAL_ID=$( \
      az containerapp show \ 
        --resource-group $RESOURCE_GROUP_NAME \
        --name $API_CONTAINER_NAME \
        --query "identity.principalId" \
        --output "tsv" \
    )
    

    小提示

    您可以隨時檢查此命令的輸出。

    echo $MANAGED_IDENTITY_PRINCIPAL_ID
    

指派權限

現在,指派系統指派的受控識別許可權,以從 Azure SQL 和 Azure Container Registry 讀取數據。 此外,請指派您的身分識別許可權以寫入 Azure Container Registry。

  1. 建立名為 RESOURCE_GROUP_ID 的變數,以儲存資源群組的標識符。 使用 az group show取得識別碼。 在本教學課程中,您會使用此變數多次。

    RESOURCE_GROUP_ID=$( \
      az group show \
        --name $RESOURCE_GROUP_NAME \
        --query "id" \
        --output "tsv" \
    )
    

    小提示

    您可以隨時檢查此命令的輸出。

    echo $RESOURCE_GROUP_ID
    
  2. 使用 az role assignment createAcrPush 角色指派給您的帳戶,讓您可以將容器推送至 Azure Container Registry。

    CURRENT_USER_PRINCIPAL_ID=$( \
      az ad signed-in-user show \
        --query "id" \
        --output "tsv" \
    )
    
    # AcrPush
    az role assignment create \
      --assignee $CURRENT_USER_PRINCIPAL_ID \
      --role "8311e382-0749-4cb8-b61a-304f252e45ec" \
      --scope $RESOURCE_GROUP_ID
    
  3. 再次使用 角色指派給您的受管理的身分。 此指派可讓受控識別從 Azure Container Registry 提取容器映像。 受控識別最終會指派給 Azure Container Apps 實例。

    # AcrPull    
    az role assignment create \
      --assignee $MANAGED_IDENTITY_PRINCIPAL_ID \
      --role "7f951dda-4ed3-4680-a7ca-43fe172d538d" \
      --scope $RESOURCE_GROUP_ID
    

部署資料庫

接下來,在 Azure SQL 服務中部署新的伺服器和資料庫。 資料庫會使用 AdventureWorksLT 範例數據集。

  1. 為您的 Azure SQL Server 實例建立名為 SQL_SERVER_NAME 且具有唯一產生名稱的變數。 您稍後會在本節中使用這個變數。

    SQL_SERVER_NAME="srvr$SUFFIX"
    
  2. 使用 建立新的 Azure SQL az sql server create 資源。 將受控識別設定為此伺服器的系統管理員。

    az sql server create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $SQL_SERVER_NAME \
      --location $LOCATION \
      --enable-ad-only-auth \
      --external-admin-principal-type "User" \
      --external-admin-name $API_CONTAINER_NAME \
      --external-admin-sid $MANAGED_IDENTITY_PRINCIPAL_ID
    
  3. 使用 az sql server firewall-rule create 建立防火牆規則以允許從 Azure 服務存取。

    az sql server firewall-rule create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server $SQL_SERVER_NAME \
      --name "AllowAzure" \
      --start-ip-address "0.0.0.0" \
      --end-ip-address "0.0.0.0"
    
  4. 使用 az sql db create 在名為的 Azure SQL Server 內建立adventureworks。 將資料庫設定為使用 AdventureWorksLT 範例數據。

    az sql db create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server $SQL_SERVER_NAME \
      --name "adventureworks" \
      --sample-name "AdventureWorksLT"
    
  5. 使用 Azure SQL Server 實例中資料庫的連接字串來建立名為 SQL_CONNECTION_STRINGadventureworks 變數。 使用建構包含伺服器az sql server show的連接字串。 您稍後在本教學課程中使用此變數。

    SQL_SERVER_ENDPOINT=$( \
      az sql server show \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $SQL_SERVER_NAME \
        --query "fullyQualifiedDomainName" \
        --output "tsv" \
    )
    
    SQL_CONNECTION_STRING="Server=$SQL_SERVER_ENDPOINT;Database=adventureworks;Encrypt=true;Authentication=Active Directory Default;"
    

    小提示

    您可以隨時檢查此命令的輸出。

    echo $SQL_CONNECTION_STRING
    

建置容器映像

接下來,使用 Dockerfile 建置容器映像。 然後將該容器映像部署到新建立的 Azure Container Registry 實例。

  1. 為您的 Azure Container Registry 實例建立名為 CONTAINER_REGISTRY_NAME 且具有唯一產生名稱的變數。 您稍後會在本節中使用這個變數。

    CONTAINER_REGISTRY_NAME="reg$SUFFIX"
    
  2. 使用 az acr create建立新的 Azure Container Registry 實例。

    az acr create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $CONTAINER_REGISTRY_NAME \
      --sku "Standard" \
      --location $LOCATION \
      --admin-enabled false
    
  3. 建立名為 Dockerfile的多階段 Dockerfile。 在 檔案中,實作這些步驟。

    • mcr.microsoft.com/dotnet/sdk使用容器映像作為建置階段的基底

    • 安裝 DAB CLI

    • 使用 mssql 環境變數作為連接字串,建立 SQL 資料庫連接的設定檔 DATABASE_CONNECTION_STRING

    • 建立一個名為 Product 的實體,對應至 SalesLT.Product 資料表。

    • 將組態檔複製到最終 mcr.microsoft.com/azure-databases/data-api-builder 的容器映像。

    FROM mcr.microsoft.com/dotnet/sdk:8.0-cbl-mariner2.0 AS build
    
    WORKDIR /config
    
    RUN dotnet new tool-manifest
    
    RUN dotnet tool install Microsoft.DataApiBuilder
    
    RUN dotnet tool run dab -- init --database-type "mssql" --connection-string "@env('DATABASE_CONNECTION_STRING')"
    
    RUN dotnet tool run dab -- add Product --source "SalesLT.Product" --permissions "anonymous:read"
    
    FROM mcr.microsoft.com/azure-databases/data-api-builder
    
    COPY --from=build /config /App
    
  4. 使用 az acr build 將 Dockerfile 建置為 Azure Container Registry 任務。

    az acr build \
      --registry $CONTAINER_REGISTRY_NAME \
      --image adventureworkslt-dab:latest \
      --image adventureworkslt-dab:{{.Run.ID}} \
      --file Dockerfile \
      .
    
  5. 使用 az acr show 來取得容器登錄的端點,並將它儲存在名為的 CONTAINER_REGISTRY_LOGIN_SERVER變數中。

    CONTAINER_REGISTRY_LOGIN_SERVER=$( \
      az acr show \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $CONTAINER_REGISTRY_NAME \
        --query "loginServer" \
        --output "tsv" \
    )
    

    小提示

    您可以隨時檢查此命令的輸出。

    echo $CONTAINER_REGISTRY_LOGIN_SERVER
    

部署容器映像

最後,使用新的自定義容器映像和認證來更新 Azure 容器應用程式。 測試執行中的應用程式,以驗證其與資料庫的連線。

  1. 將容器應用程式設定為使用容器登錄,使用 az containerapp registry set

    az containerapp registry set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $API_CONTAINER_NAME \
      --server $CONTAINER_REGISTRY_LOGIN_SERVER \
      --identity "system"
    
  2. 使用 az containerapp secret set 來建立包含 Azure SQL 連接字串的名為 conn-string 的秘密。

    az containerapp secret set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $API_CONTAINER_NAME \
      --secrets conn-string="$SQL_CONNECTION_STRING"
    

    這很重要

    此連接字串不包含任何使用者名稱或密碼。 連接字串會使用受控識別來存取 Azure SQL 資料庫。 這可讓您安全地使用連接字串作為主機程式中的機密。

  3. 使用 az containerapp update以新的自定義容器映像更新容器應用程式。 將DATABASE_CONNECTION_STRING環境變數設置為從先前建立的conn-string機密讀取。

    az containerapp update \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $API_CONTAINER_NAME \
      --image "$CONTAINER_REGISTRY_LOGIN_SERVER/adventureworkslt-dab:latest" \
      --set-env-vars DATABASE_CONNECTION_STRING=secretref:conn-string
    
  4. 使用 az containerapp show 擷取執行中容器應用程式中最新修訂的完整網域名稱。 將該值儲存在名為的 APPLICATION_URL變數中。

    APPLICATION_URL=$( \
      az containerapp show \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $API_CONTAINER_NAME \
        --query "properties.latestRevisionFqdn" \
        --output "tsv" \
    )
    

    小提示

    您可以隨時檢查此命令的輸出。

    echo $APPLICATION_URL
    
  5. 流覽至 URL 並測試 Product REST API。

    echo "https://$APPLICATION_URL/api/Product"
    

    警告

    部署最多可能需要一分鐘的時間。 如果您沒有成功收到回應,請稍等並重新整理您的瀏覽器。

清理資源

當您不再需要範例應用程式或資源時,請移除對應的部署和所有資源。

az group delete \
  --name $RESOURCE_GROUP_NAME

後續步驟