Freigeben über


Lernprogramm: Bereitstellen des Daten-API-Generators in Azure-Container-Apps mit Azure CLI

Der Daten-API-Generator kann schnell in Azure-Diensten wie Azure-Container-Apps als Teil Ihres Anwendungsstapels bereitgestellt werden. In diesem Lernprogramm verwenden Sie die Azure CLI, um allgemeine Aufgaben beim Bereitstellen des Daten-API-Generators in Azure zu automatisieren. Zunächst erstellen Sie ein Containerimage mit dem Daten-API-Generator und speichern es in azure Container Registry. Anschließend stellen Sie das Containerimage in Azure-Container-Apps mit einer zugrunde stehenden Azure SQL-Datenbank bereit. Das gesamte Lernprogramm authentifiziert sich bei jeder Komponente mit verwalteten Identitäten.

In diesem Tutorial erfahren Sie:

  • Erstellen einer verwalteten Identität mit rollenbasierten Zugriffssteuerungsberechtigungen
  • Bereitstellen von Azure SQL mit dem AdventureWorksLT-Beispiel-Dataset
  • Bereitstellen des Containerimages in der Azure-Containerregistrierung
  • Bereitstellung der Azure Container-App mit dem Container-Image des Data-API-Builder

Wenn Sie noch kein Azure-Abonnement haben, erstellen Sie ein kostenloses Konto, bevor Sie beginnen.

Voraussetzungen

  • Azure-Abonnement
  • Azure Cloud Shell
    • Azure Cloud Shell ist eine interaktive Shellumgebung, die Sie über Ihren Browser verwenden können. Verwenden Sie diese Shell und die vorinstallierten Befehle, um den Code in diesem Artikel auszuführen, ohne etwas in Ihrer lokalen Umgebung installieren zu müssen. So starten Sie Azure Cloud Shell:
      • Wählen Sie "Testen" in einem Code- oder Befehlsblock in diesem Artikel aus. Wenn Sie "Testen" auswählen, wird der Code oder befehl nicht automatisch in Cloud Shell kopiert.
      • Wechseln Sie zu https://shell.azure.com, oder wählen Sie "Cloud Shell starten" aus.
      • Wählen Sie Cloud Shell in der Menüleiste des Azure-Portals () aus.https://portal.azure.com

Erstellen einer Container-App

Erstellen Sie zunächst eine Azure-Container-Apps-Instanz mit einer vom System zugewiesenen verwalteten Identität. Diese Identität erhält schließlich rollenbasierte Zugriffssteuerungsberechtigungen für den Zugriff auf Azure SQL und Azure Container Registry.

  1. Erstellen Sie eine universelle SUFFIX Variable, die später in diesem Lernprogramm für mehrere Ressourcennamen verwendet werden soll.

    let SUFFIX=$RANDOM*$RANDOM
    
  2. Erstellen Sie eine LOCATION Variable mit einer Azure-Region, die Sie in diesem Lernprogramm verwenden möchten.

    LOCATION="<azure-region>"
    

    Hinweis

    Wenn Sie z. B. in der Region West-USA bereitstellen möchten, verwenden Sie dieses Skript.

    LOCATION="westus"
    

    Verwenden Sie für eine Liste der unterstützten Regionen für das aktuelle Abonnement az account list-locations

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

    Weitere Informationen finden Sie unter Azure-Regionen.

  3. Erstellen Sie eine Variable RESOURCE_GROUP_NAME mit dem Ressourcengruppennamen. Für dieses Lernprogramm empfehlen wir msdocs-dab-*. Sie verwenden diesen Wert in diesem Lernprogramm mehrmals.

    RESOURCE_GROUP_NAME="msdocs-dab$SUFFIX"    
    
  4. Erstellen Sie eine neue Ressourcengruppe mithilfe von az group create.

    az group create \
      --name $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --tag "source=msdocs-dab-tutorial"
    
  5. Erstellen Sie Variablen namens API_CONTAINER_NAME und CONTAINER_ENV_NAME mit eindeutig generierten Namen für Ihre Azure Container Apps-Instanz. Sie verwenden diese Variablen im gesamten Lernprogramm.

    API_CONTAINER_NAME="api$SUFFIX"
    CONTAINER_ENV_NAME="env$SUFFIX"
    
  6. Verwenden Sie az containerapp env create, um eine neue Azure-Container-Apps-Umgebung zu erstellen.

    az containerapp env create \ 
      --resource-group $RESOURCE_GROUP_NAME \
      --name $CONTAINER_ENV_NAME \
      --logs-destination none \
      --location $LOCATION
    
  7. Erstellen Sie eine neue Container-App mit dem mcr.microsoft.com/azure-databases/data-api-builder DAB-Containerimage und dem az containerapp create Befehl. Diese Container-App wird erfolgreich ausgeführt, ist jedoch nicht mit einer Datenbank verbunden.

    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. Rufen Sie den Prinzipal-Bezeichner der verwalteten Identität mit az identity show ab und speichern Sie den Wert in einer Variablen namens 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" \
    )
    

    Tipp

    Sie können immer die Ausgabe dieses Befehls überprüfen.

    echo $MANAGED_IDENTITY_PRINCIPAL_ID
    

Berechtigungen zuweisen

Weisen Sie nun die vom System zugewiesenen Berechtigungen für verwaltete Identitäten zum Lesen von Daten aus der Azure SQL- und Azure-Containerregistrierung zu. Weisen Sie außerdem Ihre Identitätsberechtigungen zum Schreiben in die Azure-Containerregistrierung zu.

  1. Erstellen Sie eine Variable, die zum Speichern des Bezeichners der Ressourcengruppe benannt RESOURCE_GROUP_ID ist. Rufen Sie den Bezeichner mithilfe von az group show. Sie verwenden diese Variable in diesem Lernprogramm mehrmals.

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

    Tipp

    Sie können immer die Ausgabe dieses Befehls überprüfen.

    echo $RESOURCE_GROUP_ID
    
  2. Verwenden Sie az role assignment create, um Ihrem Konto die Rolle AcrPush zuzuweisen, sodass Sie Container an das Azure-Container-Repository pushen können.

    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. Weisen Sie der verwalteten Identität die Rolle "AcrPull" erneut az role assignment create zu. Mit dieser Zuweisung kann die verwaltete Identität Container-Images aus der Azure-Containerregistrierung abrufen. Die verwaltete Identität wird schließlich einer Azure Container Apps-Instanz zugewiesen.

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

Bereitstellen der Datenbank

Stellen Sie als Nächstes einen neuen Server und eine neue Datenbank im Azure SQL-Dienst bereit. Die Datenbank verwendet das AdventureWorksLT-Beispiel-Dataset .

  1. Erstellen Sie eine Variable SQL_SERVER_NAME mit einem eindeutig generierten Namen für Ihre Azure SQL Server-Instanz. Sie verwenden diese Variable weiter unten in diesem Abschnitt.

    SQL_SERVER_NAME="srvr$SUFFIX"
    
  2. Erstellen Sie eine neue Azure SQL Server-Ressource mithilfe von az sql server create. Konfigurieren Sie die verwaltete Identität als Administrator dieses Servers.

    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. Verwenden Sie az sql server firewall-rule create, um eine Firewallregel zu erstellen, die den Zugriff von Azure-Diensten erlaubt.

    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. Dient az sql db create zum Erstellen einer Datenbank im Azure SQL-Server mit dem Namen adventureworks. Konfigurieren Sie die Datenbank für die Verwendung der AdventureWorksLT Beispieldaten.

    az sql db create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server $SQL_SERVER_NAME \
      --name "adventureworks" \
      --sample-name "AdventureWorksLT"
    
  5. Erstellen Sie eine Variable SQL_CONNECTION_STRING mit der Verbindungszeichenfolge für die adventureworks Datenbank in Ihrer Azure SQL Server-Instanz. Erstellen Sie die Verbindungszeichenfolge mit dem vollqualifizierten Domänennamen des Servers unter Verwendung von az sql server show. Sie verwenden diese Variable später in diesem Lernprogramm.

    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;"
    

    Tipp

    Sie können immer die Ausgabe dieses Befehls überprüfen.

    echo $SQL_CONNECTION_STRING
    

Erstellen des Containerimage

Erstellen Sie als Nächstes ein Containerimage mit einer Dockerfile-Datei. Stellen Sie dieses Containerimage dann in einer neu erstellten Azure Container Registry-Instanz bereit.

  1. Erstellen Sie eine Variable CONTAINER_REGISTRY_NAME mit einem eindeutig generierten Namen für Ihre Azure Container Registry-Instanz. Sie verwenden diese Variable weiter unten in diesem Abschnitt.

    CONTAINER_REGISTRY_NAME="reg$SUFFIX"
    
  2. Erstellen Sie eine neue Azure Container Registry-Instanz mithilfe von az acr create.

    az acr create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $CONTAINER_REGISTRY_NAME \
      --sku "Standard" \
      --location $LOCATION \
      --admin-enabled false
    
  3. Erstellen Sie eine mehrstufige Dockerfile-Datei mit dem Namen Dockerfile. Implementieren Sie in der Datei diese Schritte.

    • Verwenden Sie das mcr.microsoft.com/dotnet/sdk Container-Image als Basis der Build-Phase

    • Installieren Sie die DAB CLI.

    • Erstellen Sie eine Konfigurationsdatei für eine SQL-Datenbankverbindung (mssql) mit der DATABASE_CONNECTION_STRING Umgebungsvariable als Verbindungszeichenfolge.

    • Erstellen Sie eine Entität, Product die der SalesLT.Product Tabelle zugeordnet ist.

    • Kopieren Sie die Konfigurationsdatei in das endgültige mcr.microsoft.com/azure-databases/data-api-builder Containerimage.

    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:latest
    
    COPY --from=build /config /App
    
  4. Erstellen Sie das Dockerfile als Aufgabe der Azure-Containerregistrierung mithilfe von az acr build.

    az acr build \
      --registry $CONTAINER_REGISTRY_NAME \
      --image adventureworkslt-dab:latest \
      --image adventureworkslt-dab:{{.Run.ID}} \
      --file Dockerfile \
      .
    
  5. Verwenden Sie az acr show, um den Endpunkt für die Containerregistrierung zu erhalten und ihn in einer Variablen namens CONTAINER_REGISTRY_LOGIN_SERVER zu speichern.

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

    Tipp

    Sie können immer die Ausgabe dieses Befehls überprüfen.

    echo $CONTAINER_REGISTRY_LOGIN_SERVER
    

Container-Image bereitstellen

Aktualisieren Sie schließlich die Azure-Container-App mit dem neuen benutzerdefinierten Containerimage und den Anmeldeinformationen. Testen Sie die ausgeführte Anwendung, um die Verbindung mit der Datenbank zu überprüfen.

  1. Konfigurieren Sie die Container-App, um das Container-Repository mit az containerapp registry set zu verwenden.

    az containerapp registry set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $API_CONTAINER_NAME \
      --server $CONTAINER_REGISTRY_LOGIN_SERVER \
      --identity "system"
    
  2. Verwenden Sie az containerapp secret set, um ein Geheimnis namens conn-string mit der Azure SQL-Verbindungszeichenfolge zu erstellen.

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

    Von Bedeutung

    Diese Verbindungszeichenfolge enthält keinen Benutzernamen oder Kennwörter. Die Verbindungszeichenfolge verwendet die verwaltete Identität für den Zugriff auf die Azure SQL-Datenbank. Dadurch ist es sicher, die Verbindungszeichenfolge als geheimer Schlüssel im Host zu verwenden.

  3. Aktualisieren Sie die Container-App mit Ihrem neuen benutzerdefinierten Containerimage mithilfe von az containerapp update. Legen Sie die DATABASE_CONNECTION_STRING Umgebungsvariable fest, um aus dem zuvor erstellten conn-string Geheimnis zu lesen.

    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. Rufen Sie den vollqualifizierten Domänennamen der neuesten Revision in der laufenden Container-App mithilfe von az containerapp show ab. Speichern Sie diesen Wert in einer Variablen mit dem Namen APPLICATION_URL.

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

    Tipp

    Sie können immer die Ausgabe dieses Befehls überprüfen.

    echo $APPLICATION_URL
    
  5. Navigieren Sie zur URL, und testen Sie die Product REST-API.

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

    Warnung

    Die Bereitstellung kann bis zu einer Minute dauern. Wenn keine erfolgreiche Antwort angezeigt wird, warten Sie, und aktualisieren Sie Ihren Browser.

Bereinigen von Ressourcen

Wenn Sie die Beispielanwendung oder Ressourcen nicht mehr benötigen, entfernen Sie die entsprechende Bereitstellung und alle Ressourcen.

az group delete \
  --name $RESOURCE_GROUP_NAME

Nächster Schritt