Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tej części serii samouczków dowiesz się, jak wdrożyć konteneryzowaną aplikację internetową w języku Python w usłudze Azure App Service Web App for Containers. Ta w pełni zarządzana usługa umożliwia uruchamianie konteneryzowanych aplikacji bez konieczności obsługi własnego orkiestratora kontenerów.
Usługa App Service upraszcza wdrażanie za pośrednictwem potoków ciągłej integracji/ciągłego wdrażania (CI/CD), które współpracują z usługą Docker Hub, Usługą Azure Container Registry, usługą Azure Key Vault i innymi narzędziami DevOps. Ten samouczek jest częścią 4 z 5-częściowej serii samouczków.
Na końcu tego artykułu masz bezpieczną, gotową do produkcji aplikację internetową usługi App Service działającą na podstawie obrazu kontenera platformy Docker. Aplikacja używa przypisanej przez system tożsamości zarządzanej do ściągania obrazu z usługi Azure Container Registry i pobierania wpisów tajnych z usługi Azure Key Vault.
Ten diagram usługi wyróżnia składniki omówione w tym artykule.
Polecenia interfejsu wiersza polecenia platformy Azure można uruchamiać w usłudze Azure Cloud Shell lub na komputerze lokalnym z zainstalowanym interfejsem wiersza polecenia platformy Azure.
Ważny
Zalecamy używanie usługi Azure Cloud Shell dla wszystkich kroków opartych na interfejsie wiersza polecenia w tym samouczku, ponieważ:
- Jest wstępnie uwierzytelniany przy użyciu konta platformy Azure, unikając problemów z logowaniem
- Zawiera wszystkie wymagane rozszerzenia Azure CLI gotowe do użycia
- Zapewnia spójne zachowanie niezależnie od lokalnego systemu operacyjnego lub środowiska
- Nie wymaga instalacji lokalnej, idealnej dla użytkowników bez uprawnień administratora
- Zapewnia bezpośredni dostęp do usług platformy Azure z portalu — nie jest wymagana lokalna konfiguracja platformy Docker lub sieci
- Unika problemów z lokalną zaporą lub konfiguracją sieci
Tworzenie usługi Key Vault z autoryzacją RBAC
Azure Key Vault to bezpieczna usługa do przechowywania wpisów tajnych, kluczy interfejsu API, parametrów połączenia i certyfikatów. W tym skrypcie przechowuje string połączenia MongoDB i SECRET_KEY aplikacji internetowej.
Usługa Key Vault jest skonfigurowana do używania kontroli dostępu opartej na rolach (RBAC) do zarządzania dostępem za pośrednictwem ról platformy Azure zamiast tradycyjnych zasad dostępu. Aplikacja internetowa używa przypisanej przez system tożsamości zarządzanej do bezpiecznego pobierania tajemnic w trakcie działania.
Notatka
Utworzenie usługi Key Vault na wczesnym etapie gwarantuje, że role można przypisać przed próbą uzyskania dostępu do sekretów. Pomaga również uniknąć opóźnień propagacji przypisań ról. Ponieważ usługa Key Vault nie zależy od usługi App Service, aprowizowanie jej na wczesnym etapie zwiększa niezawodność i sekwencjonowanie.
W tym kroku użyjesz polecenia az keyvault create, aby utworzyć skarbiec kluczy Azure z włączoną kontrolą dostępu opartą na rolach (RBAC).
#!/bin/bash RESOURCE_GROUP_NAME="msdocs-web-app-rg" LOCATION="westus" KEYVAULT_NAME="${RESOURCE_GROUP_NAME}-kv" az keyvault create \ --name "$KEYVAULT_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --location "$LOCATION" \ --enable-rbac-authorization true
Utwórz plan usługi App Service i aplikację internetową
Plan usługi App Service definiuje zasoby obliczeniowe, warstwę cenową i region dla aplikacji internetowej. Aplikacja internetowa uruchamia konteneryzowaną aplikację i jest aprowizowana przy użyciu przypisanej przez system tożsamości zarządzanej, która jest używana do bezpiecznego uwierzytelniania w usłudze Azure Container Registry (ACR) i usłudze Azure Key Vault.
W tym kroku wykonasz następujące zadania:
- Tworzenie planu usługi App Service
- Tworzenie aplikacji internetowej przy użyciu tożsamości zarządzanej
- Konfigurowanie aplikacji internetowej do wdrożenia przy użyciu określonego obrazu kontenera
- Przygotowanie do ciągłego wdrażania za pośrednictwem usługi ACR
Notatka
Przed przypisaniem dostępu do usługi ACR lub Key Vault należy utworzyć aplikację internetową, ponieważ tożsamość zarządzana jest tworzona tylko w czasie wdrażania. Ponadto przypisanie obrazu kontenera podczas tworzenia gwarantuje, że aplikacja zostanie prawidłowo uruchomiona zgodnie z konfiguracją.
W tym kroku użyjesz polecenia az appservice plan create , aby aprowizować środowisko obliczeniowe dla aplikacji.
#!/bin/bash APP_SERVICE_PLAN_NAME="msdocs-web-app-plan" az appservice plan create \ --name "$APP_SERVICE_PLAN_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --sku B1 \ --is-linuxW tym kroku użyjesz polecenia az webapp create , aby utworzyć aplikację internetową. To polecenie umożliwia również przypisaną przez system tożsamość zarządzaną i ustawia obraz kontenera, który jest uruchamiany przez aplikację.
#!/bin/bash APP_SERVICE_NAME="msdocs-website-name" #APP_SERVICE_NAME must be globally unique as it becomes the website name in the URL `https://<website-name>.azurewebsites.net`. # Use the same registry name as in part 2 of this tutorial series. REGISTRY_NAME="msdocscontainerregistryname" #REGISTRY_NAME is the registry name you used in part 2 of this tutorial. CONTAINER_NAME="$REGISTRY_NAME.azurecr.io/msdocspythoncontainerwebapp:latest" #CONTAINER_NAME is of the form "yourregistryname.azurecr.io/repo_name:tag". az webapp create \ --resource-group "$RESOURCE_GROUP_NAME" \ --plan "$APP_SERVICE_PLAN_NAME" \ --name "$APP_SERVICE_NAME" \ --assign-identity '[system]' \ --deployment-container-image-name "$CONTAINER_NAME"Notatka
Podczas uruchamiania tego polecenia może zostać wyświetlony następujący błąd:
No credential was provided to access Azure Container Registry. Trying to look up... Retrieving credentials failed with an exception:'Failed to retrieve container registry credentials. Please either provide the credentials or run 'az acr update -n msdocscontainerregistryname --admin-enabled true' to enable admin first.'Ten błąd występuje, ponieważ aplikacja internetowa próbuje użyć poświadczeń administratora w celu uzyskania dostępu do usługi ACR, która poświadczenia są domyślnie wyłączone. Można bezpiecznie zignorować ten komunikat: następnym krokiem jest skonfigurowanie aplikacji internetowej pod względem używania tożsamości zarządzanej do uwierzytelniania za pomocą usługi ACR.
Przyznaj rolę oficera ds. tajności zalogowanemu użytkownikowi.
Aby przechowywać wpisy tajne w usłudze Azure Key Vault, użytkownik uruchamiacy skrypt musi mieć rolę oficera wpisów tajnych usługi Key Vault . Ta rola umożliwia tworzenie i zarządzanie sekretami w skarbcu.
W tym kroku skrypt przypisuje tę rolę do aktualnie zalogowanego użytkownika. Ten użytkownik może następnie bezpiecznie przechowywać poufne informacje aplikacji, takie jak łańcuch połączenia MongoDB i aplikacja SECRET_KEY.
To przypisanie roli jest pierwszym z dwóch przypisań ról związanych z usługą Key Vault. Następnie systemowo przypisana tożsamość zarządzana aplikacji webowej otrzymuje dostęp do pobierania tajemnic z magazynu.
Użycie kontroli dostępu opartej na rolach platformy Azure zapewnia bezpieczny, możliwy do inspekcji dostęp na podstawie tożsamości, eliminując potrzebę twardo zakodowanych poświadczeń.
Notatka
Użytkownik musi mieć przypisaną rolę Oficera ds. Tajemnic Key Vaultprzed podjęciem próby przechowywania tajemnic w Key Vault. Zadanie to wykonano przy użyciu polecenia az role assignment create w odniesieniu do usługi Key Vault.
W tym kroku użyjesz polecenia az role assignment create , aby przypisać rolę w zakresie usługi Key Vault.
#!/bin/bash CALLER_ID=$(az ad signed-in-user show --query id -o tsv) echo $CALLER_ID # Verify this value retrieved successfully. In production, poll to verify this value is retrieved successfully. az role assignment create \ --role "Key Vault Secrets Officer" \ --assignee "$CALLER_ID" \ --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
Udzielanie dostępu do sieci ACR przy użyciu tożsamości zarządzanej
Aby bezpiecznie ściągać obrazy z usługi Azure Container Registry (ACR), należy skonfigurować aplikację internetową do używania przypisanej przez system tożsamości zarządzanej. Korzystanie z tożsamości zarządzanej pozwala uniknąć konieczności stosowania poświadczeń administratora i obsługuje bezpieczne wdrożenie bez poświadczeń.
Ten proces obejmuje dwie kluczowe akcje:
- Włączanie aplikacji webowej do korzystania z tożsamości zarządzanej przy dostępie do usługi ACR
- Przypisywanie roli AcrPull dla tej tożsamości w docelowej usłudze ACR
W tym kroku pobierzesz identyfikator główny (unikatowy identyfikator obiektu) tożsamości zarządzanej aplikacji internetowej, używając polecenia az webapp identity show. Następnie włączysz użycie tożsamości zarządzanej na potrzeby uwierzytelniania usługi ACR, ustawiając właściwość
acrUseManagedIdentityCredsnatrueza pomocą polecenia az webapp config set. Następnie przypiszesz rolę AcrPull do tożsamości zarządzanej aplikacji internetowej przy użyciu polecenia az role assignment create . Ta rola przyznaje aplikacji internetowej uprawnienia do ściągania obrazów z rejestru.#!/bin/bash PRINCIPAL_ID=$(az webapp identity show \ --name "$APP_SERVICE_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --query principalId \ -o tsv) echo $PRINCIPAL_ID # Verify this value retrieved successfully. In production, poll for successful 'AcrPull' role assignment using `az role assignment list`. az webapp config set \ --resource-group "$RESOURCE_GROUP_NAME" \ --name "$APP_SERVICE_NAME" \ --generic-configurations '{"acrUseManagedIdentityCreds": true}' az role assignment create \ --role "AcrPull" \ --assignee "$PRINCIPAL_ID" \ --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ContainerRegistry/registries/$REGISTRY_NAME"
Udzielanie usłudze Key Vault dostępu do tożsamości zarządzanej aplikacji internetowej
Aplikacja internetowa musi mieć uprawnienia dostępu do sekretów, na przykład łańcucha połączeniowego MongoDB i SECRET_KEY. Aby przyznać te uprawnienia, musisz przypisać rolę Użytkownika sekretów Key Vault do tożsamości zarządzanej przypisanej przez system aplikacji internetowej.
W tym kroku użyjesz unikatowego identyfikatora (identyfikatora głównego) systemowo przypisanej zarządzanej tożsamości aplikacji internetowej, aby przyznać aplikacji internetowej dostęp do usługi Key Vault z rolą Użytkownik tajemnic Key Vault przy użyciu polecenia az role assignment create.
#!/bin/bash az role assignment create \ --role "Key Vault Secrets User" \ --assignee "$PRINCIPAL_ID" \ --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
Przechowywanie tajemnic w usłudze Key Vault
Aby uniknąć bezpośredniego umieszczania sekretów w aplikacji, w tym kroku przechowywane są parametry połączenia z bazą danych MongoDB i klucz tajny aplikacji internetowej w usłudze Azure Key Vault. Te tajemnice mogą być następnie bezpiecznie uzyskiwane przez aplikację webową w czasie działania za pośrednictwem tożsamości zarządzanej, bez konieczności przechowywania poświadczeń w kodzie lub konfiguracji.
Notatka
Chociaż ten samouczek przechowuje tylko parametry połączenia i klucz tajny w magazynie kluczy, możesz opcjonalnie przechowywać inne ustawienia aplikacji, takie jak nazwa bazy danych MongoDB lub nazwa kolekcji w usłudze Key Vault.
W tym kroku użyjesz polecenia az cosmosdb keys list , aby pobrać parametry połączenia bazy danych MongoDB. Następnie użyj polecenia az keyvault secret set do przechowywania zarówno parametrów połączenia, jak i losowo wygenerowanego klucza tajnego w usłudze Key Vault.
#!/bin/bash ACCOUNT_NAME="msdocs-cosmos-db-account-name" MONGO_CONNECTION_STRING=$(az cosmosdb keys list \ --name "$ACCOUNT_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --type connection-strings \ --query "connectionStrings[?description=='Primary MongoDB Connection String'].connectionString" -o tsv) SECRET_KEY=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9') # This key is cryptographically secure, using OpenSSL’s strong random number generator. az keyvault secret set \ --vault-name "$KEYVAULT_NAME" \ --name "MongoConnectionString" \ --value "$MONGO_CONNECTION_STRING" az keyvault secret set \ --vault-name "$KEYVAULT_NAME" \ --name "MongoSecretKey" \ --value "$SECRET_KEY"
Konfiguracja aplikacji internetowej do używania sekretów Kay Vault
Aby bezpiecznie uzyskiwać dostęp do wpisów tajnych w czasie wykonywania, aplikacja internetowa musi być skonfigurowana do odwołowania się do wpisów tajnych przechowywanych w usłudze Azure Key Vault. Ten krok jest wykonywany przy użyciu odwołań do Key Vault, które wprowadzają wartości tajne do środowiska aplikacji za pomocą zarządzanej tożsamości przypisanej przez system.
Takie podejście pozwala uniknąć zakodowywania na stałe tajnych danych i umożliwia aplikacji bezpieczne pobieranie poufnych wartości, takich jak łańcuch połączenia z MongoDB i klucz tajny, podczas działania.
W tym kroku użyjesz polecenia az webapp config appsettings set, aby dodać ustawienia aplikacji odwołujące się do tajemnic usługi Key Vault. W szczególności ustawia ustawienia aplikacji
MongoConnectionStringiMongoSecretKey, aby odwoływać się do odpowiednich sekretów przechowywanych w usłudze Key Vault.#!/bin/bash MONGODB_NAME="restaurants_reviews" MONGODB_COLLECTION_NAME="restaurants_reviews" az webapp config appsettings set \ --resource-group "$RESOURCE_GROUP_NAME" \ --name "$APP_SERVICE_NAME" \ --settings \ CONNECTION_STRING="@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoConnectionString)" \ SECRET_KEY="@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoSecretKey)" \ DB_NAME="$MONGODB_NAME" \ COLLECTION_NAME="$MONGODB_COLLECTION_NAME"
Włączanie ciągłego wdrażania z usługi ACR
Włączenie ciągłego wdrażania umożliwia aplikacji internetowej automatyczne ściąganie i uruchamianie najnowszego obrazu kontenera za każdym razem, gdy jeden z nich zostanie wypchnięty do usługi Azure Container Registry (ACR). Zmniejsza to ręczne kroki wdrażania i pomaga zapewnić aktualność aplikacji.
Notatka
W następnym kroku zarejestrujesz webhook w usłudze ACR, aby powiadomić aplikację internetową, gdy zostanie przesłany nowy obraz.
W tym kroku użyjesz polecenia az webapp deployment container config , aby włączyć ciągłe wdrażanie z usługi ACR do aplikacji internetowej.
#!/bin/bash az webapp deployment container config \ --name "$APP_SERVICE_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --enable-cd true
Zarejestruj webhooka usługi ACR do ciągłego wdrażania
Aby zautomatyzować wdrożenia, zarejestruj element webhook w usłudze Azure Container Registry (ACR), który powiadamia aplikację internetową za każdym razem, gdy zostanie wypchnięty nowy obraz kontenera. Element webhook umożliwia aplikacji automatyczne ściąganie i uruchamianie najnowszej wersji.
Webhook skonfigurowany w ramach usługi Azure Container Registry (ACR) wysyła żądanie POST do punktu końcowego SCM aplikacji internetowej (SERVICE_URI), gdy nowy obraz zostanie przesłany do repozytorium msdocspythoncontainerwebapp. Ta akcja wyzwala aplikację internetową w celu ściągnięcia i wdrożenia zaktualizowanego obrazu, kończąc potok ciągłego wdrażania między usługą ACR i usługą Azure App Service.
Notatka
Identyfikator URI elementu webhook musi mieć następujący format:
https://<app-name>.scm.azurewebsites.net/api/registry/webhook
Musi się kończyć na/api/registry/webhook. Jeśli zostanie wyświetlony błąd identyfikatora URI, upewnij się, że ścieżka jest poprawna.
W tym kroku użyj polecenia az acr webhook create, aby zarejestrować webhook i skonfigurować go, aby uruchamiał się podczas
pushzdarzeń.#!/bin/bash CREDENTIAL=$(az webapp deployment list-publishing-credentials \ --resource-group "$RESOURCE_GROUP_NAME" \ --name "$APP_SERVICE_NAME" \ --query publishingPassword --output tsv) # Web app publishing credentials may not be available immediately. In production, poll until non-empty. SERVICE_URI="https://$APP_SERVICE_NAME:$CREDENTIAL@$APP_SERVICE_NAME.scm.azurewebsites.net/api/registry/webhook" az acr webhook create \ --name webhookforwebapp \ --registry "$REGISTRY_NAME" \ --scope msdocspythoncontainerwebapp:* \ --uri "$SERVICE_URI" \ --actions push
Przeglądanie witryny
Aby sprawdzić, czy aplikacja internetowa jest uruchomiona, otwórz https://<website-name>.azurewebsites.net, zastępując <website-name> nazwą swojej usługi App Service. Powinna zostać wyświetlona przykładowa aplikacja do przeglądu restauracji. Załadowanie po raz pierwszy może potrwać kilka minut.
Po pojawieniu się witryny spróbuj dodać restaurację i przesłać recenzję, aby potwierdzić, że aplikacja działa prawidłowo.
Notatka
Polecenie az webapp browse nie jest obsługiwane w usłudze Cloud Shell. Jeśli używasz usługi Cloud Shell, ręcznie otwórz przeglądarkę i przejdź do adresu URL witryny.
Jeśli używasz interfejsu wiersza polecenia platformy Azure lokalnie, możesz użyć polecenia az webapp browse , aby otworzyć witrynę w domyślnej przeglądarce:
az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME
Notatka
Polecenie az webapp browse nie jest obsługiwane w usłudze Cloud Shell. Otwórz okno przeglądarki i przejdź do adresu URL witryny internetowej.
Rozwiązywanie problemów z wdrażaniem
Jeśli nie widzisz przykładowej aplikacji, spróbuj wykonać następujące kroki.
- Po wdrożeniu kontenera i usłudze App Service zawsze sprawdź stronę dzienników w Centrum Wdrażania
w portalu Azure. Upewnij się, że kontener został ściągnięty i uruchomiony. Początkowe ściąganie i uruchamianie kontenera może potrwać kilka chwil. - Spróbuj ponownie uruchomić usługę App Service i sprawdź, czy to rozwiąże problem.
- Jeśli występują błędy programowania, te błędy są wyświetlane w dziennikach aplikacji. Na stronie witryny Azure Portal dla usługi App Service wybierz pozycję Diagnozowanie i rozwiązywanie problemów/Dzienniki aplikacji.
- Przykładowa aplikacja korzysta z połączenia z usługą Azure Cosmos DB dla bazy danych MongoDB. Upewnij się, że usługa App Service ma ustawienia aplikacji z poprawnymi informacjami o połączeniu.
- Upewnij się, że tożsamość zarządzana jest włączona dla usługi App Service i jest używana w Centrum wdrażania. Na stronie portalu Azure dla usługi App Service przejdź do zasobu Centrum wdrażania i upewnij się, że uwierzytelnianie jest ustawione na Tożsamość zarządzaną.
- Sprawdź, czy element webhook jest zdefiniowany w usłudze Azure Container Registry. Element webhook umożliwia usłudze App Service ściąganie obrazu kontenera. W szczególności sprawdź, czy identyfikator URI usługi kończy się ciągiem "/api/registry/webhook". Jeśli nie, dodaj go.
- Różne wersje usługi Azure Container Registry mają różne funkcje, w tym liczbę webhooków. Jeśli ponownie używasz istniejącego rejestru, może zostać wyświetlony komunikat: "Przekroczono limit przydziału dla zasobu typu webhook dla jednostki SKU rejestru Basic." Dowiedz się więcej o różnych przydziałach jednostek SKU i procesie uaktualniania: https://aka.ms/acr/tiers". Jeśli widzisz ten komunikat, użyj nowego rejestru lub zmniejsz liczbę webhooków rejestru obecnie używanych.