Udostępnij za pośrednictwem


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:

Diagram architektury dla mikrousług Hello World w usłudze Azure Container Apps

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.

  1. 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 \")
  1. 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 zmiennej STORAGE_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 zmiennej CLIENT_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.

  1. Otwórz witrynę Azure Portal w przeglądarce i przejdź do swojego konta magazynu.

  2. Wybierz pozycję Kontenery po lewej stronie menu.

  3. Wybierz pozycję mycontainer.

  4. Sprawdź, czy w kontenerze jest widoczny plik o nazwie order .

  5. Wybierz plik.

  6. Wybierz kartę Edytuj .

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

Następne kroki