Udostępnij za pośrednictwem


Samouczek: wdrażanie zadania sterowanego zdarzeniami przy użyciu usługi Azure Container Apps

Zadania usługi Azure Container Apps umożliwiają uruchamianie konteneryzowanych zadań, które działają przez określony czas, a następnie się zatrzymują. Wykonywanie zadania można wyzwolić ręcznie, zgodnie z harmonogramem lub na podstawie zdarzeń. Zadania najlepiej nadają się do zadań, takich jak przetwarzanie danych, uczenie maszynowe, oczyszczanie zasobów lub dowolny scenariusz, który wymaga bezserwerowych zasobów obliczeniowych.

Z tego samouczka dowiesz się, jak pracować z zadaniami sterowanymi zdarzeniami.

  • Tworzenie środowiska usługi Container Apps, w którym mają być wdrażane aplikacje kontenerów
  • Utwórz kolejkę Azure Storage, aby wysyłać komunikaty do aplikacji kontenera
  • Utwórz obraz kontenera, aby uruchomić zadanie
  • Wdrażanie zadania w środowisku usługi Container Apps
  • Sprawdź, czy komunikaty kolejki są przetwarzane przez aplikację kontenera

Utworzone zadanie rozpoczyna wykonanie dla każdego komunikatu wysyłanego do kolejki Azure Storage. Każde wykonanie zadania uruchamia kontener, który wykonuje następujące kroki:

  1. Pobiera jeden komunikat z kolejki.
  2. Rejestruje komunikat w dziennikach wykonywania zadania.
  3. Usuwa komunikat z kolejki.
  4. Zatrzymuje.

Ważne

Scaler monitoruje długość kolejki, aby określić, ile zadań uruchomić. Aby uzyskać dokładne skalowanie, nie usuwaj komunikatu z kolejki, dopóki wykonanie zadania nie zakończy jego przetwarzania.

Kod źródłowy zadania uruchamianego w tym samouczku jest dostępny w repozytorium GitHub Azure Samples.

Wymagania wstępne

Aby uzyskać informacje o funkcjach, które zadania usługi Container Apps nie obsługują, zobacz Ograniczenia zadań.

Przygotowywanie środowiska

  1. Aby zalogować się do platformy Azure z poziomu interfejsu wiersza polecenia platformy Azure, uruchom następujące polecenie i postępuj zgodnie z monitami, aby ukończyć proces uwierzytelniania.

    az login
    
  2. Upewnij się, że używasz najnowszej wersji Azure CLI, uruchamiając komendę az upgrade.

    az upgrade
    
  3. Zainstaluj najnowszą wersję rozszerzenia interfejsu wiersza polecenia usługi Container Apps.

    az extension add --name containerapp --upgrade
    
  4. Zarejestruj przestrzenie nazw Microsoft.App, Microsoft.OperationalInsights, i Microsoft.Storage, jeśli nie zostały jeszcze zarejestrowane w subskrypcji Azure.

    az provider register --namespace Microsoft.App
    az provider register --namespace Microsoft.OperationalInsights
    az provider register --namespace Microsoft.Storage
    
  5. Zdefiniuj zmienne środowiskowe używane w tym artykule.

    RESOURCE_GROUP="jobs-quickstart"
    LOCATION="northcentralus"
    ENVIRONMENT="env-jobs-quickstart"
    JOB_NAME="my-job"
    

Tworzenie środowiska usługi Container Apps

Środowisko Container Apps działa jako granica izolacji wokół aplikacji kontenerowych i prac, pozwalając im współużytkować tę samą sieć i komunikować się ze sobą.

  1. Utwórz grupę zasobów przy użyciu następującego polecenia.

    az group create \
        --name "$RESOURCE_GROUP" \
        --location "$LOCATION"
    
  2. Utwórz środowisko usługi Container Apps przy użyciu następującego polecenia.

    az containerapp env create \
        --name "$ENVIRONMENT" \
        --resource-group "$RESOURCE_GROUP" \
        --location "$LOCATION"
    

Konfigurowanie kolejki magazynowej

Zadanie używa kolejki usługi Azure Storage do odbierania komunikatów. W tej sekcji utworzysz konto magazynowania i kolejkę.

  1. Zdefiniuj nazwę konta przechowywania.

    STORAGE_ACCOUNT_NAME="<STORAGE_ACCOUNT_NAME>"
    QUEUE_NAME="myqueue"
    

    Zastąp <STORAGE_ACCOUNT_NAME> unikatową nazwą konta magazynowego. Nazwy kont magazynu muszą być unikatowe na platformie Azure. Muszą mieć długość od 3 do 24 znaków i zawierać tylko cyfry i małe litery.

  2. Tworzenie konta usługi Azure Storage.

    az storage account create \
        --name "$STORAGE_ACCOUNT_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --location "$LOCATION" \
        --sku Standard_LRS \
        --kind StorageV2
    

    Jeśli to polecenie zwróci następujący błąd, upewnij się, że zarejestrowano przestrzeń nazw Microsoft.Storage w subskrypcji Azure.

    (SubscriptionNotFound) Subscription <SUBSCRIPTION_ID> was not found.
    Code: SubscriptionNotFound
    Message: Subscription <SUBSCRIPTION_ID> was not found.
    

    Użyj tego polecenia, aby zarejestrować przestrzeń nazw:

    az provider register --namespace Microsoft.Storage
    
  3. Zapisz parametry połączenia kolejki w zmiennej:

    QUEUE_CONNECTION_STRING=$(az storage account show-connection-string -g $RESOURCE_GROUP --name $STORAGE_ACCOUNT_NAME --query connectionString --output tsv)
    
  4. Utwórz kolejkę komunikatów:

    az storage queue create \
        --name "$QUEUE_NAME" \
        --account-name "$STORAGE_ACCOUNT_NAME" \
        --connection-string "$QUEUE_CONNECTION_STRING"
    

Tworzenie tożsamości zarządzanej przypisanej przez użytkownika

Aby uniknąć używania poświadczeń administracyjnych, ściągaj obrazy z prywatnych repozytoriów w usłudze Azure Container Registry. Użyj tożsamości zarządzanych do uwierzytelniania. Jeśli to możliwe, użyj tożsamości zarządzanej przypisanej przez użytkownika do ściągania obrazów.

  1. Utwórz tożsamość zarządzaną przypisaną przez użytkownika. Przed uruchomieniem następujących poleceń wybierz nazwę tożsamości zarządzanej i utwórz następującą zmienną:

    IDENTITY="<YOUR_IDENTITY_NAME>"
    
    az identity create \
        --name $IDENTITY \
        --resource-group $RESOURCE_GROUP
    
  2. Pobierz identyfikator zasobu tożsamości:

    IDENTITY_ID=$(az identity show \
        --name $IDENTITY \
        --resource-group $RESOURCE_GROUP \
        --query id \
        --output tsv)
    

Budowanie i wdrażanie zadania

Aby wdrożyć zadanie, należy najpierw skompilować dla niego obraz kontenera i wypchnąć kontener do rejestru. Następnie możesz wdrożyć zadanie w środowisku usługi Container Apps.

  1. Zdefiniuj nazwę obrazu kontenera i rejestru:

    CONTAINER_IMAGE_NAME="queue-reader-job:1.0"
    CONTAINER_REGISTRY_NAME="<CONTAINER_REGISTRY_NAME>"
    

    Zamień <CONTAINER_REGISTRY_NAME> na unikalną nazwę dla swojego rejestru kontenerów. Nazwy rejestru kontenerów muszą być unikatowe na platformie Azure. Muszą mieć długość od 5 do 50 znaków i zawierać tylko cyfry i małe litery.

  2. Utwórz rejestr kontenerów:

    az acr create \
        --name "$CONTAINER_REGISTRY_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --location "$LOCATION" \
        --sku Basic
    
  3. Rejestr kontenerów musi zezwalać na tokeny odbiorców usługi Azure Resource Manager (ARM) na potrzeby uwierzytelniania w celu użycia tożsamości zarządzanej do ściągania obrazów.

    Użyj następującego polecenia, aby sprawdzić, czy tokeny usługi ARM mogą uzyskiwać dostęp do rejestru kontenerów platformy Azure:

    az acr config authentication-as-arm show --registry "$CONTAINER_REGISTRY_NAME"
    

    Jeśli tokeny usługi ARM są dozwolone, zostaną wyświetlone następujące dane wyjściowe:

    {
      "status": "enabled"
    }
    

    Jeśli parametr status ma wartość disabled, zezwól na tokeny ARM przy użyciu następującego polecenia:

    az acr config authentication-as-arm update --registry "$CONTAINER_REGISTRY_NAME" --status enabled
    
  4. Kod źródłowy zadania jest dostępny w witrynie GitHub. Uruchom następujące polecenie, aby sklonować repozytorium i skompilować obraz kontenera w chmurze:

    az acr build \
        --registry "$CONTAINER_REGISTRY_NAME" \
        --image "$CONTAINER_IMAGE_NAME" \
        "https://github.com/Azure-Samples/container-apps-event-driven-jobs-tutorial.git"
    

    Obraz jest teraz dostępny w rejestrze kontenerów.

  5. Utwórz zadanie w środowisku Container Apps:

    az containerapp job create \
        --name "$JOB_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --environment "$ENVIRONMENT" \
        --trigger-type "Event" \
        --replica-timeout "1800" \
        --min-executions "0" \
        --max-executions "10" \
        --polling-interval "60" \
        --scale-rule-name "queue" \
        --scale-rule-type "azure-queue" \
        --scale-rule-metadata "accountName=$STORAGE_ACCOUNT_NAME" "queueName=$QUEUE_NAME" "queueLength=1" \
        --scale-rule-auth "connection=connection-string-secret" \
        --image "$CONTAINER_REGISTRY_NAME.azurecr.io/$CONTAINER_IMAGE_NAME" \
        --cpu "0.5" \
        --memory "1Gi" \
        --secrets "connection-string-secret=$QUEUE_CONNECTION_STRING" \
        --registry-server "$CONTAINER_REGISTRY_NAME.azurecr.io" \
        --mi-user-assigned "$IDENTITY_ID" \
        --registry-identity "$IDENTITY_ID" \
        --env-vars "AZURE_STORAGE_QUEUE_NAME=$QUEUE_NAME" "AZURE_STORAGE_CONNECTION_STRING=secretref:connection-string-secret"
    

    W poniższej tabeli opisano kluczowe parametry używane w poprzednim poleceniu.

    Parametr Opis
    --replica-timeout Maksymalny czas działania repliki.
    --min-executions Minimalna liczba wykonań zadań do wykonania w okresie sondowania.
    --max-executions Maksymalna liczba wykonań zadań do uruchomienia w interwale sondowania.
    --polling-interval Interwał sondowania, w którym ma być oceniana reguła skalowania.
    --scale-rule-name Nazwa reguły skalowania.
    --scale-rule-type Typ reguły skalowania do użycia.
    --scale-rule-metadata Metadane reguły skalowania.
    --scale-rule-auth Uwierzytelnianie dla reguły skalowania.
    --secrets Sekrety do wykorzystania w pracy.
    --registry-server Serwer rejestru kontenerów przeznaczony dla zadania. W przypadku rejestru kontenerów platformy Azure polecenie automatycznie konfiguruje uwierzytelnianie.
    --mi-user-assigned Identyfikator zasobu tożsamości zarządzanej przypisanej przez użytkownika do przypisania do zadania.
    --registry-identity Identyfikator zasobu tożsamości zarządzanej używany do uwierzytelniania w serwerze rejestru, zastępujący potrzebę korzystania z nazwy użytkownika i hasła. Jeśli to możliwe, acrpull przypisanie roli jest tworzone automatycznie dla tożsamości.
    --env-vars Zmienne środowiskowe do użycia dla zadania.

    Konfiguracja reguły skalowania definiuje źródło zdarzeń do monitorowania. Jest oceniana dla każdego interwału czas sondowania i określa, ile wykonań zadań należy wyzwolić. Aby uzyskać więcej informacji, zobacz Ustawianie reguł skalowania.

Zadanie sterowane zdarzeniami jest teraz tworzone w środowisku usługi Container Apps.

Weryfikowanie wdrożenia

Zadanie jest skonfigurowane do oceny reguły skalowania co 60 sekund. Ta ocena sprawdza liczbę wiadomości w kolejce. Dla każdego okresu oceny uruchamia nowe wykonanie zadania dla każdego komunikatu w kolejce, maksymalnie 10 wykonań.

Aby sprawdzić, czy zadanie jest poprawnie skonfigurowane, możesz wysłać kilka komunikatów do kolejki i potwierdzić, że wykonania zadania zostały uruchomione oraz że komunikaty są rejestrowane w dziennikach wykonywania zadania.

  1. Wyślij komunikat do kolejki:

    az storage message put \
        --content "Hello Queue Reader Job" \
        --queue-name "$QUEUE_NAME" \
        --connection-string "$QUEUE_CONNECTION_STRING"
    
  2. Wyświetl listę wykonań zadania:

    az containerapp job execution list \
        --name "$JOB_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --output json
    

    Ponieważ zadanie jest skonfigurowane do oceny reguły skalowania co 60 sekund, uruchomienie zadania może potrwać do pełnej minuty. Powtarzaj to polecenie, aż zobaczysz, że wykonanie zadania i jego status to Succeeded.

  3. Uruchom następujące polecenia, aby wyświetlić zarejestrowane komunikaty. Te polecenia wymagają rozszerzenia usługi Log Analytics, dlatego zaakceptuj monit o zainstalowanie rozszerzenia.

    LOG_ANALYTICS_WORKSPACE_ID=$(az containerapp env show --name $ENVIRONMENT --resource-group $RESOURCE_GROUP --query properties.appLogsConfiguration.logAnalyticsConfiguration.customerId --output tsv)
    
    az monitor log-analytics query \
        --workspace "$LOG_ANALYTICS_WORKSPACE_ID" \
        --analytics-query "ContainerAppConsoleLogs_CL | where ContainerJobName_s == '$JOB_NAME' | order by _timestamp_d asc"
    

    ContainerAppConsoleLogs_CL Dopóki tabela nie będzie gotowa, polecenie zwróci błąd: BadArgumentError: The request had some invalid properties. Odczekaj kilka minut i spróbuj ponownie.

Wskazówka

Masz problemy? Daj nam znać na GitHubie, zgłaszając problem w repozytorium Azure Container Apps.

Czyszczenie zasobów

Po zakończeniu uruchom następujące polecenie, aby usunąć grupę zasobów zawierającą zasoby usługi Container Apps.

Uwaga

Następujące polecenie usuwa określoną grupę zasobów i wszystkie zawarte w niej zasoby. Jeśli istnieją zasoby spoza zakresu tego samouczka w określonej grupie zasobów, zostaną one również usunięte.

az group delete \
    --resource-group $RESOURCE_GROUP

Następny krok