Dela via


Självstudie: Distribuera Data API Builder till Azure Container Apps med Azure CLI

Data-API-byggare kan snabbt distribueras till Azure-tjänster som Azure Container Apps som en del av din programstack. I den här självstudien använder du Azure CLI för att automatisera vanliga uppgifter när du distribuerar Data API Builder till Azure. Först skapar du en containeravbildning med Data API Builder och lagrar den i Azure Container Registry. Sedan distribuerar du containeravbildningen till Azure Container Apps med en Azure SQL databas. Hela självstudien autentiserar till varje komponent med hanterade identiteter.

I den här kursen får du:

  • Skapa en hanterad identitet med behörigheter för rollbaserad åtkomstkontroll
  • Distribuera Azure SQL med exempeldatauppsättningen AdventureWorksLT
  • Mellanlagra containeravbildningen i Azure Container Registry
  • Distribuera Azure Container App med containeravbildningen Data API Builder

Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar.

Förutsättningar

  • Azure-prenumeration
  • Azure Cloud Shell
    • Azure Cloud Shell är en interaktiv gränssnittsmiljö som du kan använda via webbläsaren. Använd det här gränssnittet och dess förinstallerade kommandon för att köra koden i den här artikeln, utan att behöva installera något i din lokala miljö. Så här startar du Azure Cloud Shell:
      • Välj Prova i ett kod- eller kommandoblock i den här artikeln. Om du väljer Prova kopieras inte koden eller kommandot automatiskt för att Cloud Shell.
      • Gå till https://shell.azure.comeller välj Starta Cloud Shell.
      • Välj Cloud Shell på menyraden i Azure Portal (https://portal.azure.com)

Skapa containerapp

Skapa först en Azure Container Apps-instans med en systemtilldelad hanterad identitet. Den här identiteten beviljas så småningom rollbaserad åtkomstkontrollbehörighet för åtkomst Azure SQL och Azure Container Registry.

  1. Skapa en universell SUFFIX variabel som ska användas för flera resursnamn senare i den här självstudien.

    let SUFFIX=$RANDOM*$RANDOM
    
  2. Skapa en LOCATION variabel med en Azure-region som du valde att använda i den här självstudien.

    LOCATION="<azure-region>"
    

    Anteckning

    Om du till exempel vill distribuera till regionen USA, västra använder du det här skriptet.

    LOCATION="westus"
    

    En lista över regioner som stöds för den aktuella prenumerationen finns i az account list-locations

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

    Mer information finns i Azure-regioner.

  3. Skapa en variabel med namnet RESOURCE_GROUP_NAME med resursgruppens namn. I den här självstudien rekommenderar msdocs-dab-*vi . Du använder det här värdet flera gånger i den här självstudien.

    RESOURCE_GROUP_NAME="msdocs-dab$SUFFIX"    
    
  4. Skapa en ny resursgrupp med .az group create

    az group create \
      --name $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --tag "source=msdocs-dab-tutorial"
    
  5. Skapa variabler med namnet API_CONTAINER_NAME och CONTAINER_ENV_NAME med unikt genererade namn för din Azure Container Apps-instans. Du använder dessa variabler under hela självstudien.

    API_CONTAINER_NAME="api$SUFFIX"
    CONTAINER_ENV_NAME="env$SUFFIX"
    
  6. Använd az containerapp env create för att skapa en ny Azure Container Apps-miljö.

    az containerapp env create \ 
      --resource-group $RESOURCE_GROUP_NAME \
      --name $CONTAINER_ENV_NAME \
      --logs-destination none \
      --location $LOCATION
    
  7. Skapa en ny containerapp med hjälp av mcr.microsoft.com/azure-databases/data-api-builder DAB-containeravbildningen az containerapp create och kommandot . Den här containerappen körs men är inte ansluten till någon databas.

    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. Hämta huvudidentifieraren för den hanterade identiteten med och az identity show lagra värdet i en variabel med namnet 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" \
    )
    

    Tips

    Du kan alltid kontrollera utdata för det här kommandot.

    echo $MANAGED_IDENTITY_PRINCIPAL_ID
    

Tilldela behörigheter

Tilldela nu behörigheterna för den systemtilldelade hanterade identiteten för att läsa data från Azure SQL och Azure Container Registry. Dessutom tilldelar du din identitet behörighet att skriva till Azure Container Registry.

  1. Skapa en variabel med namnet RESOURCE_GROUP_ID för att lagra resursgruppens identifierare. Hämta identifieraren med hjälp av az group show. Du använder den här variabeln flera gånger i den här självstudien.

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

    Tips

    Du kan alltid kontrollera utdata för det här kommandot.

    echo $RESOURCE_GROUP_ID
    
  2. Använd az role assignment create för att tilldela AcrPush-rollen till ditt konto så att du kan skicka containrar till 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. Tilldela rollen AcrPull till din hanterade identitet med hjälp av az role assignment create igen. Med den här tilldelningen kan den hanterade identiteten hämta containeravbildningar från Azure Container Registry. Den hanterade identiteten tilldelas så småningom till en Azure Container Apps-instans.

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

Distribuera databas

Distribuera sedan en ny server och databas i Azure SQL-tjänsten. Databasen använder exempeldatauppsättningen AdventureWorksLT .

  1. Skapa en variabel med namnet SQL_SERVER_NAME med ett unikt genererat namn för din Azure SQL serverinstans. Du använder den här variabeln senare i det här avsnittet.

    SQL_SERVER_NAME="srvr$SUFFIX"
    
  2. Skapa en ny Azure SQL serverresurs med hjälp av az sql server create. Konfigurera den hanterade identiteten som administratör för den här servern.

    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. Använd az sql server firewall-rule create för att skapa en brandväggsregel för att tillåta åtkomst från Azure-tjänster.

    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. Använd az sql db create för att skapa en databas i Azure SQL-servern med namnet adventureworks. Konfigurera databasen så att den AdventureWorksLT använder exempeldata.

    az sql db create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server $SQL_SERVER_NAME \
      --name "adventureworks" \
      --sample-name "AdventureWorksLT"
    
  5. Skapa en variabel med namnet SQL_CONNECTION_STRING med anslutningssträng för adventureworks databasen i din Azure SQL-serverinstans. Skapa anslutningssträng med serverns fullständigt kvalificerade domännamn med hjälp av az sql server show. Du använder den här variabeln senare i den här självstudien.

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

    Tips

    Du kan alltid kontrollera utdata för det här kommandot.

    echo $SQL_CONNECTION_STRING
    

Skapa containeravbildning

Skapa sedan en containeravbildning med hjälp av en Dockerfile. Distribuera sedan containeravbildningen till en nyligen skapad Azure Container Registry-instans.

  1. Skapa en variabel med namnet CONTAINER_REGISTRY_NAME med ett unikt genererat namn för din Azure Container Registry-instans. Du använder den här variabeln senare i det här avsnittet.

    CONTAINER_REGISTRY_NAME="reg$SUFFIX"
    
  2. Skapa en ny Azure Container Registry-instans med .az acr create

    az acr create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $CONTAINER_REGISTRY_NAME \
      --sku "Standard" \
      --location $LOCATION \
      --admin-enabled false
    
  3. Skapa en Dockerfile i flera steg med namnet Dockerfile. Implementera de här stegen i filen.

    • Använd containeravbildningen mcr.microsoft.com/dotnet/sdk som bas för byggfasen

    • Installera DAB CLI.

    • Skapa en konfigurationsfil för en SQL-databasanslutning (mssql) med DATABASE_CONNECTION_STRING miljövariabeln som anslutningssträng.

    • Skapa en entitet med namnet Product mappad till tabellenSalesLT.Product.

    • Kopiera konfigurationsfilen till den slutliga mcr.microsoft.com/azure-databases/data-api-builder containeravbildningen.

    FROM mcr.microsoft.com/dotnet/sdk:6.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. Skapa Dockerfile som en Azure Container Registry uppgift med hjälp av az acr build.

    az acr build \
      --registry $CONTAINER_REGISTRY_NAME \
      --image adventureworkslt-dab:latest \
      --image adventureworkslt-dab:{{.Run.ID}} \
      --file Dockerfile \
      .
    
  5. Använd az acr show för att hämta slutpunkten för containerregistret och lagra den i en variabel med namnet CONTAINER_REGISTRY_LOGIN_SERVER.

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

    Tips

    Du kan alltid kontrollera utdata för det här kommandot.

    echo $CONTAINER_REGISTRY_LOGIN_SERVER
    

Distribuera containeravbildning

Slutligen uppdaterar du Azure Container App med den nya anpassade containeravbildningen och autentiseringsuppgifterna. Testa det program som körs för att verifiera anslutningen till databasen.

  1. Konfigurera containerappen så att den använder containerregistret med hjälp av 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. Använd az containerapp secret set för att skapa en hemlighet med namnet conn-string med Azure SQL anslutningssträng.

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

    Viktigt

    Den här anslutningssträng innehåller inga användarnamn eller lösenord. Anslutningssträng använder den hanterade identiteten för att komma åt Azure SQL-databasen. Det gör det säkert att använda anslutningssträng som en hemlighet i värden.

  3. Uppdatera containerappen med din nya anpassade containeravbildning med hjälp av az containerapp update. DATABASE_CONNECTION_STRING Ange att miljövariabeln ska läsa från den tidigare skapade conn-string hemligheten.

    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. Hämta det fullständigt kvalificerade domännamnet för den senaste revisionen i containerappen som körs med .az containerapp show Lagra värdet i en variabel med namnet APPLICATION_URL.

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

    Tips

    Du kan alltid kontrollera utdata för det här kommandot.

    echo $APPLICATION_URL
    
  5. Gå till URL:en och testa REST-API:et Product .

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

    Varning

    Distributionen kan ta upp till en minut. Om du inte ser ett lyckat svar väntar du och uppdaterar webbläsaren.

Rensa resurser

När du inte längre behöver exempelprogrammet eller exempelresurserna tar du bort motsvarande distribution och alla resurser.

az group delete \
  --name $RESOURCE_GROUP_NAME

Nästa steg