Samouczek: wdrażanie aplikacji dapr w usłudze Azure Container Apps przy użyciu interfejsu wiersza polecenia platformy Azure
Dapr (rozproszone środowisko uruchomieniowe aplikacji) ułatwia deweloperom tworzenie odpornych, niezawodnych mikrousług. W tym samouczku przykładowa aplikacja dapr jest wdrażana w usłudze Azure Container Apps.
Dowiedz się, jak odbywa się:
- Tworzenie środowiska usługi Container Apps dla aplikacji kontenera
- Tworzenie magazynu stanów usługi Azure Blob Storage dla aplikacji kontenera
- Wdrażanie dwóch aplikacji tworzących i zużywających komunikaty oraz utrwalających je w magazynie stanów
- Sprawdź interakcję między dwiema mikrousługami.
Usługa Azure Container Apps umożliwia uzyskanie w pełni zarządzanej wersji interfejsów API języka Dapr podczas tworzenia mikrousług. Gdy używasz języka Dapr w usłudze Azure Container Apps, możesz włączyć przyczepki do uruchamiania obok mikrousług, które zapewniają bogaty zestaw możliwości. Dostępne interfejsy API języka Dapr obejmują wywołania usług, pub/sub, powiązania zdarzeń, magazyny stanów i aktorów.
W tym samouczku wdrożysz te same aplikacje z przewodnika Szybki start Dapr Hello World .
Aplikacja składa się z następujących elementów:
- Aplikacja kontenera klienta (Python) do generowania komunikatów.
- Aplikacja kontenera usługi (Node) do korzystania z tych komunikatów i ich utrwalania w magazynie stanów
Na poniższym diagramie architektury przedstawiono składniki, które składają się na ten samouczek:
Ustawienia
Aby zalogować się do platformy Azure z poziomu interfejsu wiersza polecenia, uruchom następujące polecenie i postępuj zgodnie z monitami, aby ukończyć proces uwierzytelniania.
az login
Aby upewnić się, że używasz najnowszej wersji interfejsu wiersza polecenia, uruchom polecenie uaktualniania.
az upgrade
Następnie zainstaluj lub zaktualizuj rozszerzenie usługi Azure Container Apps dla interfejsu wiersza polecenia.
Jeśli podczas uruchamiania az containerapp
poleceń w interfejsie wiersza polecenia platformy Azure lub poleceniach cmdlet z modułu Az.App
w programie Azure PowerShell wystąpią błędy dotyczące brakujących parametrów, upewnij się, że masz zainstalowaną najnowszą wersję rozszerzenia Azure Container Apps.
az extension add --name containerapp --upgrade
Uwaga
Począwszy od maja 2024 r., rozszerzenia interfejsu wiersza polecenia platformy Azure domyślnie nie włączają funkcji w wersji zapoznawczej. Aby uzyskać dostęp do funkcji usługi Container Apps w wersji zapoznawczej, zainstaluj rozszerzenie Container Apps za pomocą polecenia --allow-preview true
.
az extension add --name containerapp --upgrade --allow-preview true
Teraz, po zainstalowaniu bieżącego rozszerzenia lub modułu Microsoft.App
, zarejestruj przestrzenie nazw i Microsoft.OperationalInsights
.
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
Ustawianie zmiennych środowiskowych
Ustaw następujące zmienne środowiskowe. Zastąp <symbole> ZASTĘPCZE wartościami:
RESOURCE_GROUP="<RESOURCE_GROUP>"
LOCATION="<LOCATION>"
CONTAINERAPPS_ENVIRONMENT="<CONTAINERAPPS_ENVIRONMENT>"
Tworzenie grupy zasobów platformy Azure
Utwórz grupę zasobów, aby zorganizować usługi związane z wdrożeniem aplikacji kontenera.
az group create \
--name $RESOURCE_GROUP \
--location "$LOCATION"
Utwórz środowisko
Środowisko w usłudze Azure Container Apps tworzy bezpieczną granicę wokół grupy aplikacji kontenera. Aplikacje kontenera wdrożone w tym samym środowisku są wdrażane w tej samej sieci wirtualnej i zapisują dzienniki w tym samym obszarze roboczym usługi Log Analytics.
Aby utworzyć środowisko, uruchom następujące polecenie:
az containerapp env create \
--name $CONTAINERAPPS_ENVIRONMENT \
--resource-group $RESOURCE_GROUP \
--location "$LOCATION"
Konfigurowanie magazynu stanów
Tworzenie konta usługi Azure Blob Storage
Po wdrożeniu środowiska następnym krokiem jest wdrożenie konta usługi Azure Blob Storage używanego przez jedną z mikrousług do przechowywania danych. Przed wdrożeniem usługi należy wybrać nazwę konta magazynu. Nazwy kont magazynu muszą być unikatowe na platformie Azure, od 3 do 24 znaków i muszą zawierać tylko cyfry i małe litery.
STORAGE_ACCOUNT_NAME="<storage account name>"
Użyj następującego polecenia, aby utworzyć konto usługi Azure Storage.
az storage account create \
--name $STORAGE_ACCOUNT_NAME \
--resource-group $RESOURCE_GROUP \
--location "$LOCATION" \
--sku Standard_RAGRS \
--kind StorageV2
Konfigurowanie tożsamości przypisanej przez użytkownika dla aplikacji node
Chociaż usługa Container Apps obsługuje tożsamość zarządzaną przypisaną przez użytkownika i przypisaną przez system, tożsamość przypisana przez użytkownika zapewnia aplikację węzła z obsługą języka Dapr z uprawnieniami dostępu do konta magazynu obiektów blob.
- Utwórz tożsamość przypisaną przez użytkownika.
az identity create --resource-group $RESOURCE_GROUP --name "nodeAppIdentity" --output json
principalId
Pobierz właściwości i id
i zapisz je w zmiennych.
PRINCIPAL_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query principalId | tr -d \")
IDENTITY_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query id | tr -d \")
CLIENT_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query clientId | tr -d \")
Storage Blob Data Contributor
Przypisywanie roli do tożsamości przypisanej przez użytkownika
Pobierz identyfikator subskrypcji dla bieżącej subskrypcji.
SUBSCRIPTION_ID=$(az account show --query id --output tsv)
az role assignment create --assignee $PRINCIPAL_ID \
--role "Storage Blob Data Contributor" \
--scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT_NAME"
Konfigurowanie składnika magazynu stanów
Istnieje wiele sposobów uwierzytelniania w zasobach zewnętrznych za pośrednictwem języka Dapr. W tym przykładzie nie jest używany interfejs API dapr Secrets w czasie wykonywania, ale korzysta z magazynu stanów opartego na platformie Azure. W związku z tym można utworzyć składnik magazynu wpisów tajnych i zamiast tego zapewnić bezpośredni dostęp z aplikacji węzła do magazynu obiektów blob przy użyciu tożsamości zarządzanej. Jeśli chcesz użyć magazynu stanów spoza platformy Azure lub interfejsu API wpisów tajnych dapr w czasie wykonywania, możesz utworzyć składnik magazynu wpisów tajnych. Ten składnik ładuje wpisy tajne środowiska uruchomieniowego, aby można było odwoływać się do nich w czasie wykonywania.
Otwórz edytor tekstów i utwórz plik konfiguracji o nazwie statestore.yaml z właściwościami pochodzącymi z poprzednich kroków. Ten plik ułatwia aplikacji Dapr uzyskiwanie dostępu do magazynu stanów. W poniższym przykładzie pokazano, jak plik statestore.yaml powinien wyglądać po skonfigurowaniu konta usługi Azure Blob Storage:
# statestore.yaml for Azure Blob storage component
componentType: state.azure.blobstorage
version: v1
metadata:
- name: accountName
value: "<STORAGE_ACCOUNT_NAME>"
- name: containerName
value: mycontainer
- name: azureClientId
value: "<MANAGED_IDENTITY_CLIENT_ID>"
scopes:
- nodeapp
Aby użyć tego pliku, zaktualizuj symbole zastępcze:
- Zastąp
<STORAGE_ACCOUNT_NAME>
element wartością zdefiniowanej zmiennejSTORAGE_ACCOUNT_NAME
. Aby uzyskać jego wartość, uruchom następujące polecenie:
echo $STORAGE_ACCOUNT_NAME
- Zastąp
<MANAGED_IDENTITY_CLIENT_ID>
element wartością zdefiniowanej zmiennejCLIENT_ID
. Aby uzyskać jego wartość, uruchom następujące polecenie:
echo $CLIENT_ID
Przejdź do katalogu, w którym został zapisany plik yaml składnika, i uruchom następujące polecenie, aby skonfigurować składnik Dapr w środowisku Container Apps. Aby uzyskać więcej informacji na temat konfigurowania składników języka Dapr, zobacz Konfigurowanie składników języka Dapr.
az containerapp env dapr-component set \
--name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP \
--dapr-component-name statestore \
--yaml statestore.yaml
Wdrażanie aplikacji usługi (serwer internetowy HTTP)
az containerapp create \
--name nodeapp \
--resource-group $RESOURCE_GROUP \
--user-assigned $IDENTITY_ID \
--environment $CONTAINERAPPS_ENVIRONMENT \
--image dapriosamples/hello-k8s-node:latest \
--min-replicas 1 \
--max-replicas 1 \
--enable-dapr \
--dapr-app-id nodeapp \
--dapr-app-port 3000 \
--env-vars 'APP_PORT=3000'
Jeśli używasz usługi Azure Container Registry, dołącz flagę --registry-server <REGISTRY_NAME>.azurecr.io
w poleceniu .
Domyślnie obraz jest ściągany z usługi Docker Hub.
Wdrażanie aplikacji klienckiej (klient bezgłowy)
Uruchom następujące polecenie, aby wdrożyć aplikację kontenera klienta.
az containerapp create \
--name pythonapp \
--resource-group $RESOURCE_GROUP \
--environment $CONTAINERAPPS_ENVIRONMENT \
--image dapriosamples/hello-k8s-python:latest \
--min-replicas 1 \
--max-replicas 1 \
--enable-dapr \
--dapr-app-id pythonapp
Jeśli używasz usługi Azure Container Registry, dołącz flagę --registry-server <REGISTRY_NAME>.azurecr.io
w poleceniu .
Weryfikowanie wyników
Potwierdzanie trwałości stanu pomyślnego
Możesz potwierdzić, że usługi działają prawidłowo, wyświetlając dane na koncie usługi Azure Storage.
Otwórz witrynę Azure Portal w przeglądarce i przejdź do swojego konta magazynu.
Wybierz pozycję Kontenery po lewej stronie menu.
Wybierz pozycję mycontainer.
Sprawdź, czy w kontenerze jest widoczny plik o nazwie
order
.Wybierz plik.
Wybierz kartę Edytuj .
Wybierz przycisk Odśwież, aby zobaczyć, jak dane są automatycznie aktualizowane.
Wyświetl dzienniki
Dzienniki z aplikacji kontenera są przechowywane w tabeli niestandardowej ContainerAppConsoleLogs_CL
w obszarze roboczym usługi Log Analytics. Dzienniki można wyświetlać za pośrednictwem witryny Azure Portal lub interfejsu wiersza polecenia. Początkowo w obszarze roboczym może występować niewielkie opóźnienie.
Użyj następującego polecenia interfejsu wiersza polecenia, aby wyświetlić dzienniki przy użyciu wiersza polecenia.
LOG_ANALYTICS_WORKSPACE_CLIENT_ID=`az containerapp env show --name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP --query properties.appLogsConfiguration.logAnalyticsConfiguration.customerId --out tsv`
az monitor log-analytics query \
--workspace $LOG_ANALYTICS_WORKSPACE_CLIENT_ID \
--analytics-query "ContainerAppConsoleLogs_CL | where ContainerAppName_s == 'nodeapp' and (Log_s contains 'persisted' or Log_s contains 'order') | project ContainerAppName_s, Log_s, TimeGenerated | sort by TimeGenerated | take 5" \
--out table
Poniższe dane wyjściowe przedstawiają typ odpowiedzi oczekiwanej z poziomu polecenia interfejsu wiersza polecenia.
ContainerAppName_s Log_s TableName TimeGenerated
-------------------- ------------------------------- ------------- ------------------------
nodeapp Got a new order! Order ID: 61 PrimaryResult 2021-10-22T21:31:46.184Z
nodeapp Successfully persisted state. PrimaryResult 2021-10-22T21:31:46.184Z
nodeapp Got a new order! Order ID: 62 PrimaryResult 2021-10-22T22:01:57.174Z
nodeapp Successfully persisted state. PrimaryResult 2021-10-22T22:01:57.174Z
nodeapp Got a new order! Order ID: 63 PrimaryResult 2021-10-22T22:45:44.618Z
Czyszczenie zasobów
Gratulacje! Ten samouczek został ukończony. Jeśli chcesz usunąć zasoby utworzone w ramach tego przewodnika, uruchom następujące polecenie.
Uwaga
To polecenie usuwa określoną grupę zasobów i wszystkie zawarte w niej zasoby. Jeśli zasoby spoza zakresu tego samouczka istnieją w określonej grupie zasobów, zostaną również usunięte.
az group delete --resource-group $RESOURCE_GROUP
Uwaga
Ponieważ pythonapp
ciągłe nawiązywanie połączeń nodeapp
z komunikatami utrwalone w skonfigurowanym magazynie stanów jest ważne, aby wykonać te kroki oczyszczania, aby uniknąć bieżących operacji rozliczanych.
Napiwek
Masz problemy? Poinformuj nas o usłudze GitHub, otwierając problem w repozytorium usługi Azure Container Apps.