Zelfstudie: Data API Builder implementeren in Azure Container Apps met Azure CLI

Data API Builder kan snel worden geïmplementeerd in Azure-services zoals Azure Container Apps als onderdeel van uw toepassingsstack. In deze zelfstudie gebruikt u de Azure CLI om algemene taken te automatiseren bij het implementeren van Data API Builder in Azure. Eerst bouwt u een containerimage met Data API Builder en slaat u deze op in Azure Container Registry. Vervolgens implementeert u de containerimage in Azure Container Apps, ondersteund door een Azure SQL-database. De volledige handleiding authenticeert bij elk onderdeel met behulp van beheerde identiteiten.

In deze handleiding leert u:

  • Een beheerde identiteit maken met machtigingen voor op rollen gebaseerd toegangsbeheer
  • Azure SQL implementeren met de voorbeeldgegevensset AdventureWorksLT
  • Zet de containerafbeelding klaar in Azure Container Registry
  • Azure Container App deployen met de containerbeelden van de Data API Builder

Als je geen Azure-abonnement hebt, maak dan een gratis account aan voordat je begint.

Vereiste voorwaarden

  • Azure-abonnement
  • Azure Cloud Shell
    • Azure Cloud Shell is een interactieve shell-omgeving die u via uw browser kunt gebruiken. Gebruik deze shell en de vooraf geïnstalleerde opdrachten om de code in dit artikel uit te voeren, zonder dat u iets hoeft te installeren in uw lokale omgeving. Azure Cloud Shell starten:
      • Selecteer Uitproberen in een code- of opdrachtblok in dit artikel. Als u Proberen selecteert , wordt de code of opdracht niet automatisch gekopieerd naar Cloud Shell.
      • Ga naar https://shell.azure.comof selecteer Cloud Shell starten.
      • Selecteer Cloud Shell in de menubalk van Azure Portal (https://portal.azure.com)

Container-app maken

Maak eerst een Azure Container Apps-exemplaar met een door het systeem toegewezen beheerde identiteit. Aan deze identiteit worden uiteindelijk machtigingen voor op rollen gebaseerd toegangsbeheer verleend voor toegang tot Azure SQL en Azure Container Registry.

  1. Maak een universele SUFFIX variabele voor meerdere resourcenamen verderop in deze zelfstudie.

    let SUFFIX=$RANDOM*$RANDOM
    
  2. Maak een LOCATION variabele met een Azure-regio die u hebt geselecteerd voor gebruik in deze zelfstudie.

    LOCATION="<azure-region>"
    

    Opmerking

    Als u bijvoorbeeld wilt implementeren in de regio VS - west, gebruikt u dit script.

    LOCATION="westus"
    

    Gebruik voor een lijst met ondersteunde regio's voor het huidige abonnement az account list-locations

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

    Zie Azure-regio'svoor meer informatie.

  3. Maak een variabele met de naam RESOURCE_GROUP_NAME van de resourcegroep. Voor deze zelfstudie raden we u aan msdocs-dab-*. U gebruikt deze waarde meerdere keren in deze handleiding.

    RESOURCE_GROUP_NAME="msdocs-dab$SUFFIX"    
    
  4. Maak een nieuwe resourcegroep met behulp van az group create.

    az group create \
      --name $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --tag "source=msdocs-dab-tutorial"
    
  5. Maak variabelen met de naam API_CONTAINER_NAME en CONTAINER_ENV_NAME met unieke gegenereerde namen voor uw Azure Container Apps-exemplaar. U gebruikt deze variabelen in de gehele handleiding.

    API_CONTAINER_NAME="api$SUFFIX"
    CONTAINER_ENV_NAME="env$SUFFIX"
    
  6. Hiermee az containerapp env create maakt u een nieuwe Azure Container Apps-omgeving.

    az containerapp env create \ 
      --resource-group $RESOURCE_GROUP_NAME \
      --name $CONTAINER_ENV_NAME \
      --logs-destination none \
      --location $LOCATION
    
  7. Maak een nieuwe containerapp met behulp van de mcr.microsoft.com/azure-databases/data-api-builder DAB-containerafbeelding en de az containerapp create opdracht. Deze container-app wordt uitgevoerd, maar is niet verbonden met een database.

    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. Haal de principal-id van de beheerde identiteit op met behulp van az identity show de waarde en sla deze op in een variabele met de naam 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" \
    )
    

    Aanbeveling

    U kunt altijd de uitvoer van deze opdracht controleren.

    echo $MANAGED_IDENTITY_PRINCIPAL_ID
    

Machtigingen toewijzen

Wijs nu de door het systeem toegewezen beheerde identiteitsmachtigingen toe om gegevens te lezen uit Azure SQL en Azure Container Registry. Wijs bovendien uw identiteitsmachtigingen toe om naar Azure Container Registry te schrijven.

  1. Maak een variabele met de naam RESOURCE_GROUP_ID om de id van de resourcegroep op te slaan. Haal de identifier op met behulp van az group show. U gebruikt deze variabele meerdere keren in deze zelfstudie.

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

    Aanbeveling

    U kunt altijd de uitvoer van deze opdracht controleren.

    echo $RESOURCE_GROUP_ID
    
  2. Gebruik az role assignment create dit om de AcrPush-rol toe te wijzen aan uw account, zodat u containers naar Azure Container Registry kunt pushen.

    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. Wijs opnieuw de AcrPull-rol toe aan uw beheerde identiteit met behulp van az role assignment create. Met deze toewijzing kan de beheerde identiteit containerinstallatiekopieën ophalen uit Azure Container Registry. De beheerde identiteit wordt uiteindelijk toegewezen aan een Azure Container Apps-exemplaar.

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

Database implementeren

Implementeer vervolgens een nieuwe server en database in de Azure SQL-service. De database maakt gebruik van de voorbeeldgegevensset AdventureWorksLT .

  1. Maak een variabele met de naam SQL_SERVER_NAME met een unieke gegenereerde naam voor uw Azure SQL Server-exemplaar. U gebruikt deze variabele verderop in deze sectie.

    SQL_SERVER_NAME="srvr$SUFFIX"
    
  2. Maak een nieuwe Azure SQL-serverresource met behulp van az sql server create. Configureer de beheerde identiteit als de beheerder van deze server.

    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. Hiermee az sql server firewall-rule create maakt u een firewallregel om toegang vanuit Azure-services toe te staan.

    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. Hiermee az sql db create maakt u een database binnen de Azure SQL-server met de naam adventureworks. Configureer de database om de AdventureWorksLT voorbeeldgegevens te gebruiken.

    az sql db create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server $SQL_SERVER_NAME \
      --name "adventureworks" \
      --sample-name "AdventureWorksLT"
    
  5. Maak een variabele met de naam SQL_CONNECTION_STRING met de verbindingsreeks voor de adventureworks database in uw Azure SQL Server-exemplaar. Maak de verbindingsreeks met de volledig gekwalificeerde domeinnaam van de server met behulp van az sql server show. U gebruikt deze variabele verderop in deze zelfstudie.

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

    Aanbeveling

    U kunt altijd de uitvoer van deze opdracht controleren.

    echo $SQL_CONNECTION_STRING
    

Containerafbeelding maken

Bouw vervolgens een containerimage met behulp van een Dockerfile. Implementeer vervolgens die containerimage naar een nieuw aangemaakte Azure Container Registry-instantie.

  1. Maak een variabele met de naam CONTAINER_REGISTRY_NAME met een unieke gegenereerde naam voor uw Azure Container Registry-exemplaar. U gebruikt deze variabele verderop in deze sectie.

    CONTAINER_REGISTRY_NAME="reg$SUFFIX"
    
  2. Maak een nieuwe Azure Container Registry-instantie met behulp van az acr create.

    az acr create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $CONTAINER_REGISTRY_NAME \
      --sku "Standard" \
      --location $LOCATION \
      --admin-enabled false
    
  3. Maak een Dockerfile met meerdere fasen met de naam Dockerfile. Implementeer deze stappen in het bestand.

    • Gebruik de mcr.microsoft.com/dotnet/sdk containerafbeelding als basis van buildfase

    • Installeer de DAB CLI.

    • Maak een configuratiebestand voor een SQL-databaseverbinding (mssql) met behulp van de DATABASE_CONNECTION_STRING omgevingsvariabele als de verbindingsreeks.

    • Maak een entiteit genaamd Product die is gekoppeld aan de SalesLT.Product tabel.

    • Kopieer het configuratiebestand naar de uiteindelijke mcr.microsoft.com/azure-databases/data-api-builder containerinstallatiekopie.

    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. Bouw het Dockerfile als een Azure Container Registry-taak met behulp van az acr build.

    az acr build \
      --registry $CONTAINER_REGISTRY_NAME \
      --image adventureworkslt-dab:latest \
      --image adventureworkslt-dab:{{.Run.ID}} \
      --file Dockerfile \
      .
    
  5. Gebruik az acr show dit om het eindpunt voor het containerregister op te halen en op te slaan in een variabele met de naam CONTAINER_REGISTRY_LOGIN_SERVER.

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

    Aanbeveling

    U kunt altijd de uitvoer van deze opdracht controleren.

    echo $CONTAINER_REGISTRY_LOGIN_SERVER
    

Container-image deployen

Werk ten slotte de Azure Container App bij met de nieuwe aangepaste containerimage en referenties. Test de actieve toepassing om de connectiviteit met de database te valideren.

  1. Configureer de container-app voor het gebruik van het containerregister met behulp van 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. Gebruik az containerapp secret set om een geheim met de naam conn-string te maken met de Azure SQL-verbindingsreeks.

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

    Belangrijk

    Deze verbindingsreeks bevat geen gebruikersnaam of wachtwoorden. De verbindingsreeks maakt gebruik van de beheerde identiteit voor toegang tot de Azure SQL-database. Hierdoor is het veilig om de verbindingsreeks als geheim in de host te gebruiken.

  3. Werk de containerapplicatie bij met uw nieuwe aangepaste containerafbeelding met behulp van az containerapp update. Stel de DATABASE_CONNECTION_STRING omgevingsvariabele in om te lezen uit de eerder gemaakte conn-string geheime gegevens.

    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. Haal de volledig gekwalificeerde domeinnaam op van de meest recente revisie in de actieve container-app met behulp van az containerapp show. Sla die waarde op in een variabele met de naam APPLICATION_URL.

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

    Aanbeveling

    U kunt altijd de uitvoer van deze opdracht controleren.

    echo $APPLICATION_URL
    
  5. Navigeer naar de URL en test de Product REST API.

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

    Waarschuwing

    De implementatie kan tot een minuut duren. Als u geen geslaagd antwoord ziet, wacht u en vernieuwt u de browser.

De hulpbronnen opschonen

Wanneer u de voorbeeldtoepassing of resources niet meer nodig hebt, verwijdert u de bijbehorende implementatie en alle resources.

az group delete \
  --name $RESOURCE_GROUP_NAME

Volgende stap