Dela via


Självstudie: Distribuera data-API-byggare 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 som backas upp. Hela självstudien autentiserar sig mot varje komponent med hanterade identiteter.

I den här handledningen kommer du att:

  • Skapa en hanterad identitet med rollbaserad åtkomstkontrollbehörighet
  • Distribuera Azure SQL med exempeldatauppsättningen AdventureWorksLT
  • Mellanlagra containeravbildningen i Azure Container Registry
  • Distribuera en Azure Container App med Data API Builder-containeravbildningen

Om du inte har en Azure-prenumeration, skapa ett gratis 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 till Cloud Shell.
      • Gå till https://shell.azure.comeller välj Starta Cloud Shell.
      • Välj Cloud Shell i menyraden i Azure-portalen (https://portal.azure.com)

Skapa containerapp

Skapa först en Azure Container Apps-instans med en systemtilldelad hanterad identitet. Den här identiteten beviljas slutligen rollbaserad åtkomstkontrollbehörighet för åtkomst till 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 handledningen.

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

    Anmärkning

    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 vi msdocs-dab-*. Du använder det här värdet flera gånger i den här handledningen.

    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 de här variablerna i handledningen.

    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 DAB-containeravbildningen mcr.microsoft.com/azure-databases/data-api-builderaz containerapp create och kommandot . Den här containerappen körs (framgångsrikt), 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 genom att använda az identity show och 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/Råd

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

    echo $MANAGED_IDENTITY_PRINCIPAL_ID
    

Tilldela behörigheter

Tilldela nu de systemtilldelade hanterade identitetsbehörigheterna för att läsa data från Azure SQL och Azure Container Registry. Tilldela dessutom dina identitetsbehörigheter för 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 handledningen.

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

    Tips/Råd

    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 AcrPull-rollen 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 AdventureWorksLT-exempeldatauppsättningen .

  1. Skapa en variabel med namnet SQL_SERVER_NAME med ett unikt genererat namn för din Azure SQL Server-instans. 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 .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ängen adventureworks för databasen i din Azure SQL Server-instans. Konstruera anslutningssträngen 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 handledningen.

    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/Råd

    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 med flera steg med namnet Dockerfile. Implementera de här stegen i filen.

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

    • Installera DAB CLI.

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

    • Skapa en entitet med namnet Product mappad till SalesLT.Product tabellen.

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

    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. 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/Råd

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

    echo $CONTAINER_REGISTRY_LOGIN_SERVER
    

Implementera containeravbildning

Uppdatera slutligen Azure Container App med den nya anpassade containeravbildningen och autentiseringsuppgifterna. Testa det program som körs för att verifiera dess anslutning 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ängen.

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

    Viktigt!

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

  3. Uppdatera containerappen med din nya anpassade containeravbildning med hjälp av az containerapp update. DATABASE_CONNECTION_STRING Ange att miljövariabeln ska läsas 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 senaste revisionens körande containerapplikation 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/Råd

    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 något lyckat svar väntar du och uppdaterar webbläsaren.

Rensa resurser

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

az group delete \
  --name $RESOURCE_GROUP_NAME

Nästa steg