Sdílet prostřednictvím


Kurz: Nasazení úlohy řízené událostmi pomocí Azure Container Apps

Úlohy Azure Container Apps umožňují spouštět kontejnerizované úlohy, které běží po omezenou dobu trvání a pak se zastaví. Spuštění úlohy můžete aktivovat ručně, podle plánu nebo na základě událostí. Úlohy jsou nejvhodnější pro úlohy, jako je zpracování dat, strojové učení, vyčištění prostředků nebo jakýkoli scénář, který vyžaduje dočasné výpočetní prostředky bez serveru.

V tomto kurzu se naučíte pracovat s úlohami řízenými událostmi.

  • Vytvoření prostředí Container Apps, ve kterém se nasadí vaše kontejnerové aplikace
  • Vytvořte frontu Azure Storage pro odesílání zpráv do kontejnerové aplikace
  • Sestavte obraz kontejneru, který spouští úlohu
  • Nasazení úlohy do prostředí Container Apps
  • Ověřte, zda aplikace v kontejneru zpracovává zprávy ve frontě.

Úloha, kterou vytvoříte, spustí spuštění pro každou zprávu, která se odešle do fronty služby Azure Storage. Každé spuštění úlohy spouští kontejner, který provádí následující kroky:

  1. Získá jednu zprávu z fronty.
  2. Zaznamená zprávu do protokolů spuštění úlohy.
  3. Odstraní zprávu z fronty.
  4. Zastaví.

Důležité

Škálovač fronty monitoruje délku fronty pro určení počtu úloh, které se mají spustit. Pokud chcete správné škálování, neodstraňujte zprávu z fronty, dokud úloha neskončí zpracováním.

Zdrojový kód pro úlohu, kterou spustíte v tomto kurzu, je k dispozici v úložišti Azure ukázek GitHub.

Požadavky

Informace o funkcích, které úlohy Container Apps nepodporují, najdete v tématu Omezení úloh.

Příprava prostředí

  1. Pokud se chcete přihlásit k Azure z Azure CLI, spusťte následující příkaz a podle pokynů dokončete proces ověřování.

    az login
    
  2. Pomocí příkazu se ujistěte, že používáte nejnovější verzi Azure CLI az upgrade .

    az upgrade
    
  3. Nainstalujte nejnovější verzi rozšíření Rozhraní příkazového řádku Container Apps.

    az extension add --name containerapp --upgrade
    
  4. Zaregistrujte obory názvů Microsoft.App, Microsoft.OperationalInsights a Microsoft.Storage, pokud ještě nejsou zaregistrované ve vašem předplatném Azure.

    az provider register --namespace Microsoft.App
    az provider register --namespace Microsoft.OperationalInsights
    az provider register --namespace Microsoft.Storage
    
  5. Definujte proměnné prostředí, které se používají v tomto článku.

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

Vytvoření prostředí Container Apps

Prostředí Container Apps funguje jako hranice izolace kolem kontejnerových aplikací a úloh, aby mohly sdílet stejnou síť a komunikovat mezi sebou.

  1. Pomocí následujícího příkazu vytvořte skupinu prostředků.

    az group create \
        --name "$RESOURCE_GROUP" \
        --location "$LOCATION"
    
  2. Pomocí následujícího příkazu vytvořte prostředí Container Apps.

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

Vytvoření fronty úložiště

Úloha využívá frontu Azure Storage pro přijímání zpráv. V této části vytvoříte účet úložiště a frontu.

  1. Definujte název účtu úložiště.

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

    Nahraďte <STORAGE_ACCOUNT_NAME> jedinečným názvem vašeho účtu úložiště. Názvy účtů úložiště musí být v rámci Azure jedinečné. Musí mít délku 3 až 24 znaků a musí obsahovat jenom číslice a malá písmena.

  2. Vytvořit účet služby Azure Storage

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

    Pokud tento příkaz vrátí následující chybu, ujistěte se, že jste ve svém předplatném Azure zaregistrovali Microsoft.Storage obor názvů.

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

    Pomocí tohoto příkazu zaregistrujte obor názvů:

    az provider register --namespace Microsoft.Storage
    
  3. Uložte připojovací řetězec fronty do proměnné:

    QUEUE_CONNECTION_STRING=$(az storage account show-connection-string -g $RESOURCE_GROUP --name $STORAGE_ACCOUNT_NAME --query connectionString --output tsv)
    
  4. Vytvořte frontu zpráv:

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

Vytvořit spravovanou identitu přiřazenou uživatelem

Abyste se vyhnuli používání přihlašovacích údajů pro správu, načítejte image z privátních úložišť ve službě Azure Container Registry. Pro ověřování používejte spravované identity. Pokud je to možné, použijte uživatelsky přiřazenou spravovanou identitu k načtení obrazů.

  1. Vytvořte spravovanou identitu přiřazenou uživatelem. Než spustíte následující příkazy, zvolte název spravované identity a vytvořte následující proměnnou:

    IDENTITY="<YOUR_IDENTITY_NAME>"
    
    az identity create \
        --name $IDENTITY \
        --resource-group $RESOURCE_GROUP
    
  2. Získejte ID prostředku identity:

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

Sestavení a nasazení úlohy

Pokud chcete úlohu nasadit, musíte nejprve vytvořit image kontejneru a odeslat kontejner do registru. Úlohu pak můžete nasadit do prostředí Container Apps.

  1. Definujte název image kontejneru a registru:

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

    Nahraďte <CONTAINER_REGISTRY_NAME> jedinečným názvem vašeho registru kontejneru. Názvy registru kontejnerů musí být v rámci Azure jedinečné. Musí mít délku 5 až 50 znaků a musí obsahovat jenom číslice a malá písmena.

  2. Vytvořte registr kontejneru:

    az acr create \
        --name "$CONTAINER_REGISTRY_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --location "$LOCATION" \
        --sku Basic
    
  3. Aby bylo možné použít spravovanou identitu k načtení image, musí váš registr kontejneru povolit audience tokeny Azure Resource Manager (ARM) pro autentizaci.

    Pomocí následujícího příkazu zkontrolujte, jestli mají tokeny ARM povolený přístup k vašemu registru kontejneru Azure:

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

    Pokud jsou povolené tokeny ARM, zobrazí se následující výstup:

    {
      "status": "enabled"
    }
    

    status Pokud je disabled, povolte tokeny ARM pomocí následujícího příkazu:

    az acr config authentication-as-arm update --registry "$CONTAINER_REGISTRY_NAME" --status enabled
    
  4. Zdrojový kód úlohy je k dispozici na GitHubu. Spuštěním následujícího příkazu naklonujte úložiště a sestavte image kontejneru v cloudu:

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

    Image je teď dostupná v registru kontejneru.

  5. Vytvořte úlohu v prostředí 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"
    

    Následující tabulka popisuje klíčové parametry použité v předchozím příkazu.

    Parametr Popis
    --replica-timeout Maximální doba, po kterou může replika běžet.
    --min-executions Minimální počet spuštění úloh během každého intervalu dotazování.
    --max-executions Maximální počet spuštění úloh během každého dotazovacího intervalu.
    --polling-interval Interval dotazování, ve kterém se má vyhodnotit pravidlo škálování.
    --scale-rule-name Název pravidla škálování
    --scale-rule-type Typ pravidla škálování, které se má použít.
    --scale-rule-metadata Metadata pravidla škálování.
    --scale-rule-auth Ověřování pravidla škálování.
    --secrets Tajné kódy, které se mají použít pro úlohu.
    --registry-server Server registru kontejneru, který se má použít pro úlohu. V případě registru kontejneru Azure příkaz automaticky nakonfiguruje ověřování.
    --mi-user-assigned ID prostředku uživatelsky přiřazené spravované identity, kterou chcete přiřadit k úloze.
    --registry-identity ID prostředku spravované identity pro ověření pomocí serveru registru místo použití uživatelského jména a hesla. Pokud je to možné, automaticky se vytvoří přiřazení role pro acrpull identitu.
    --env-vars Proměnné prostředí, které se mají použít pro úlohu.

    Konfigurace pravidla škálování definuje zdroj událostí, který se má monitorovat. Vyhodnocuje se v každém intervalu dotazování a určuje, kolik spuštění úloh se má aktivovat. Další informace najdete v tématu Nastavení pravidel škálování.

Úloha řízená událostmi se teď vytvoří v prostředí Container Apps.

Ověření nasazení

Úloha je nakonfigurovaná tak, aby vyhodnocovala pravidlo škálování každých 60 sekund. Toto hodnocení ověřuje počet zpráv ve frontě. Pro každé období vyhodnocení spustí nové spuštění úlohy pro každou zprávu ve frontě až do maximálního počtu 10 spuštění.

Pokud chcete ověřit, že je úloha správně nakonfigurovaná, můžete do fronty odeslat některé zprávy a potvrdit, že se spustí spuštění úlohy a že se zprávy zaprotokolují do protokolů spuštění úlohy.

  1. Odeslat zprávu do fronty.

    az storage message put \
        --content "Hello Queue Reader Job" \
        --queue-name "$QUEUE_NAME" \
        --connection-string "$QUEUE_CONNECTION_STRING"
    
  2. Vypsat seznam provedení úlohy:

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

    Vzhledem k tomu, že je úloha nakonfigurovaná tak, aby vyhodnocovala pravidlo škálování každých 60 sekund, může spuštění úlohy trvat až minutu. Opakujte příkaz, dokud neuvidíte spuštění úlohy a její stav je Succeeded.

  3. Spuštěním následujících příkazů zobrazte protokolované zprávy. Tyto příkazy vyžadují rozšíření Log Analytics, proto přijměte výzvu k instalaci rozšíření.

    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 Dokud není tabulka připravená, příkaz vrátí chybu: BadArgumentError: The request had some invalid properties. Počkejte několik minut a zkuste akci zopakovat.

Tip

Potíže? Dejte nám vědět na GitHubu otevřením problému v úložišti Azure Container Apps.

Vyčištění prostředků

Až budete hotovi, spuštěním následujícího příkazu odstraňte skupinu prostředků, která obsahuje vaše prostředky Container Apps.

Upozornění

Následující příkaz odstraní zadanou skupinu prostředků a všechny prostředky obsažené v ní. Pokud existují prostředky mimo rozsah tohoto kurzu v zadané skupině prostředků, budou také odstraněny.

az group delete \
    --resource-group $RESOURCE_GROUP

Další krok