Udostępnij za pośrednictwem


Samouczek: wdrażanie konstruktora interfejsu API danych w usłudze Azure Container Apps przy użyciu interfejsu wiersza polecenia platformy Azure

Konstruktor interfejsu API danych można szybko wdrożyć w usługach platformy Azure, takich jak Azure Container Apps w ramach stosu aplikacji. W tym samouczku użyjesz interfejsu wiersza polecenia platformy Azure, aby zautomatyzować typowe zadania podczas wdrażania konstruktora interfejsu API danych na platformie Azure. Najpierw utworzysz obraz kontenera za pomocą konstruktora interfejsu API danych i zapiszesz go w Azure Container Registry. Następnie wdrożysz obraz kontenera w usłudze Azure Container Apps przy użyciu bazy danych Azure SQL kopii zapasowej. Cały samouczek uwierzytelnia się w każdym składniku przy użyciu tożsamości zarządzanych.

W tym samouczku zostały wykonane następujące czynności:

  • Twórca tożsamości zarządzanej z uprawnieniami kontroli dostępu opartej na rolach
  • Wdrażanie Azure SQL przy użyciu przykładowego zestawu danych AdventureWorksLT
  • Przygotowywanie obrazu kontenera w Azure Container Registry
  • Wdrażanie aplikacji kontenera platformy Azure przy użyciu obrazu kontenera konstruktora interfejsu API danych

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.

Wymagania wstępne

  • Subskrypcja platformy Azure
  • Azure Cloud Shell
    • Azure Cloud Shell to interaktywne środowisko powłoki, którego można użyć za pośrednictwem przeglądarki. Użyj tej powłoki i wstępnie zainstalowanych poleceń, aby uruchomić kod w tym artykule bez konieczności instalowania niczego w środowisku lokalnym. Aby uruchomić środowisko Azure Cloud Shell:
      • Wybierz pozycję Wypróbuj w kodzie lub bloku poleceń w tym artykule. Wybranie pozycji Wypróbuj nie powoduje automatycznego skopiowania kodu lub polecenia w celu Cloud Shell.
      • Przejdź do https://shell.azure.compozycji , lub wybierz pozycję Uruchom Cloud Shell.
      • Wybierz Cloud Shell na pasku menu Azure Portal (https://portal.azure.com)

aplikacja kontenera Twórca

Najpierw utwórz wystąpienie usługi Azure Container Apps z przypisaną przez system tożsamością zarządzaną. Ta tożsamość zostanie ostatecznie udzielona uprawnienia kontroli dostępu opartej na rolach w celu uzyskania dostępu do Azure SQL i Azure Container Registry.

  1. Twórca zmienną uniwersalną SUFFIX do użycia dla wielu nazw zasobów w dalszej części tego samouczka.

    let SUFFIX=$RANDOM*$RANDOM
    
  2. Twórca zmienną LOCATION z regionem platformy Azure wybranym do użycia w tym samouczku.

    LOCATION="<azure-region>"
    

    Uwaga

    Jeśli na przykład chcesz wdrożyć w regionie Zachodnie stany USA , użyj tego skryptu.

    LOCATION="westus"
    

    Aby uzyskać listę obsługiwanych regionów dla bieżącej subskrypcji, użyj polecenia az account list-locations

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

    Aby uzyskać więcej informacji, zobacz Regiony platformy Azure.

  3. Twórca zmienną o nazwie RESOURCE_GROUP_NAME z nazwą grupy zasobów. W tym samouczku zalecamy msdocs-dab-*. Ta wartość jest używana wiele razy w tym samouczku.

    RESOURCE_GROUP_NAME="msdocs-dab$SUFFIX"    
    
  4. Twórca nową grupę zasobów przy użyciu polecenia az group create.

    az group create \
      --name $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --tag "source=msdocs-dab-tutorial"
    
  5. Twórca zmiennych o nazwie i CONTAINER_ENV_NAME z unikatowymi nazwami API_CONTAINER_NAME dla wystąpienia usługi Azure Container Apps. Te zmienne są używane w ramach tego samouczka.

    API_CONTAINER_NAME="api$SUFFIX"
    CONTAINER_ENV_NAME="env$SUFFIX"
    
  6. Użyj az containerapp env create polecenia , aby utworzyć nowe środowisko usługi Azure Container Apps.

    az containerapp env create \ 
      --resource-group $RESOURCE_GROUP_NAME \
      --name $CONTAINER_ENV_NAME \
      --logs-destination none \
      --location $LOCATION
    
  7. Twórca nowej aplikacji kontenera przy użyciu polecenia mcr.microsoft.com/azure-databases/data-api-builder Obraz kontenera az containerapp create języka DAB i polecenie . Ta aplikacja kontenera działa pomyślnie, ale nie jest połączona z żadną bazą danych.

    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. Pobierz identyfikator główny tożsamości zarządzanej przy użyciu az identity show i zapisz wartość w zmiennej o nazwie 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" \
    )
    

    Porada

    Zawsze możesz sprawdzić dane wyjściowe tego polecenia.

    echo $MANAGED_IDENTITY_PRINCIPAL_ID
    

Przypisywanie uprawnień

Teraz przypisz przypisane przez system uprawnienia tożsamości zarządzanej do odczytu danych z Azure SQL i Azure Container Registry. Ponadto przypisz uprawnienia tożsamości do zapisu w Azure Container Registry.

  1. Twórca zmienną o nazwie RESOURCE_GROUP_ID do przechowywania identyfikatora grupy zasobów. Pobierz identyfikator przy użyciu polecenia az group show. Ta zmienna jest używana wiele razy w tym samouczku.

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

    Porada

    Zawsze możesz sprawdzić dane wyjściowe tego polecenia.

    echo $RESOURCE_GROUP_ID
    
  2. Służy az role assignment create do przypisywania roli AcrPush do konta, aby można było wypychać kontenery do 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. Przypisz rolę AcrPull do tożsamości zarządzanej przy użyciu az role assignment create ponownie. To przypisanie umożliwia tożsamości zarządzanej ściąganie obrazów kontenerów z Azure Container Registry. Tożsamość zarządzana zostanie ostatecznie przypisana do wystąpienia usługi Azure Container Apps.

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

Wdrażanie bazy danych

Następnie wdróż nowy serwer i bazę danych w usłudze Azure SQL. Baza danych używa przykładowego zestawu danych AdventureWorksLT .

  1. Twórca zmienną o nazwie SQL_SERVER_NAME o unikatowo wygenerowanej nazwie dla wystąpienia serwera Azure SQL. Ta zmienna zostanie użyta w dalszej części tej sekcji.

    SQL_SERVER_NAME="srvr$SUFFIX"
    
  2. Twórca nowy zasób serwera Azure SQL przy użyciu polecenia az sql server create. Skonfiguruj tożsamość zarządzaną jako administrator tego serwera.

    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. Użyj az sql server firewall-rule create polecenia , aby utworzyć regułę zapory, aby zezwolić na dostęp z usług platformy 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. Użyj polecenia az sql db create , aby utworzyć bazę danych na serwerze Azure SQL o nazwie adventureworks. Skonfiguruj bazę danych, aby korzystała z przykładowych AdventureWorksLT danych.

    az sql db create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server $SQL_SERVER_NAME \
      --name "adventureworks" \
      --sample-name "AdventureWorksLT"
    
  5. Twórca zmienną o nazwie SQL_CONNECTION_STRING z parametry połączenia dla bazy danych w wystąpieniu adventureworks serwera Azure SQL. Skonstruuj parametry połączenia z w pełni kwalifikowaną nazwą domeny serwera przy użyciu polecenia az sql server show. Ta zmienna zostanie użyta w dalszej części tego samouczka.

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

    Porada

    Zawsze możesz sprawdzić dane wyjściowe tego polecenia.

    echo $SQL_CONNECTION_STRING
    

Tworzenie obrazu kontenera

Następnie skompiluj obraz kontenera przy użyciu pliku Dockerfile. Następnie wdróż ten obraz kontenera w nowo utworzonym wystąpieniu Azure Container Registry.

  1. Twórca zmienną o nazwie CONTAINER_REGISTRY_NAME o unikatowo wygenerowanej nazwie dla wystąpienia Azure Container Registry. Ta zmienna zostanie użyta w dalszej części tej sekcji.

    CONTAINER_REGISTRY_NAME="reg$SUFFIX"
    
  2. Twórca nowego wystąpienia Azure Container Registry przy użyciu polecenia az acr create.

    az acr create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $CONTAINER_REGISTRY_NAME \
      --sku "Standard" \
      --location $LOCATION \
      --admin-enabled false
    
  3. Twórca wieloetapowy plik Dockerfile o nazwie Dockerfile. W pliku zaimplementuj te kroki.

    • Użyj obrazu kontenera mcr.microsoft.com/dotnet/sdk jako podstawy etapu kompilacji

    • Zainstaluj interfejs wiersza polecenia języka DAB.

    • Twórca pliku konfiguracji dla połączenia z bazą danych SQL (mssql) przy użyciu DATABASE_CONNECTION_STRING zmiennej środowiskowej jako parametry połączenia.

    • Twórca jednostkę o nazwie Product zamapowanej na tabelęSalesLT.Product.

    • Skopiuj plik konfiguracji do końcowego mcr.microsoft.com/azure-databases/data-api-builder obrazu kontenera.

    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. Skompiluj plik Dockerfile jako zadanie Azure Container Registry przy użyciu polecenia az acr build.

    az acr build \
      --registry $CONTAINER_REGISTRY_NAME \
      --image adventureworkslt-dab:latest \
      --image adventureworkslt-dab:{{.Run.ID}} \
      --file Dockerfile \
      .
    
  5. Użyj polecenia az acr show , aby pobrać punkt końcowy dla rejestru kontenerów i zapisać go w zmiennej o nazwie CONTAINER_REGISTRY_LOGIN_SERVER.

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

    Porada

    Zawsze możesz sprawdzić dane wyjściowe tego polecenia.

    echo $CONTAINER_REGISTRY_LOGIN_SERVER
    

Wdrażanie obrazu kontenera

Na koniec zaktualizuj aplikację kontenera platformy Azure przy użyciu nowego niestandardowego obrazu kontenera i poświadczeń. Przetestuj uruchomioną aplikację, aby zweryfikować łączność z bazą danych.

  1. Skonfiguruj aplikację kontenera do korzystania z rejestru kontenerów przy użyciu polecenia 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. Użyj az containerapp secret set polecenia , aby utworzyć wpis tajny o nazwie conn-string z Azure SQL parametry połączenia.

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

    Ważne

    Ta parametry połączenia nie zawiera żadnych nazw użytkowników ani haseł. Parametry połączenia używa tożsamości zarządzanej do uzyskiwania dostępu do bazy danych Azure SQL. Dzięki temu można bezpiecznie używać parametry połączenia jako wpisu tajnego na hoście.

  3. Zaktualizuj aplikację kontenera przy użyciu nowego niestandardowego obrazu kontenera przy użyciu polecenia az containerapp update. Ustaw zmienną środowiskową DATABASE_CONNECTION_STRING na odczyt z wcześniej utworzonego conn-string wpisu tajnego.

    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. Pobierz w pełni kwalifikowaną nazwę domeny najnowszej poprawki w uruchomionej aplikacji kontenera przy użyciu polecenia az containerapp show. Zapisz wartość w zmiennej o nazwie APPLICATION_URL.

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

    Porada

    Zawsze możesz sprawdzić dane wyjściowe tego polecenia.

    echo $APPLICATION_URL
    
  5. Przejdź do adresu URL i przetestuj Product interfejs API REST.

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

    Ostrzeżenie

    Wdrożenie może potrwać do minuty. Jeśli nie widzisz pomyślnej odpowiedzi, zaczekaj i odśwież przeglądarkę.

Czyszczenie zasobów

Jeśli nie potrzebujesz już przykładowej aplikacji lub zasobów, usuń odpowiednie wdrożenie i wszystkie zasoby.

az group delete \
  --name $RESOURCE_GROUP_NAME

Następny krok