Partilhar via


Tutorial: Implemente um trabalho orientado a eventos usando Azure Container Apps

Os jobs Azure Container Apps permitem-lhe executar tarefas containerizadas que duram um período finito e depois param. Você pode acionar uma execução de trabalho manualmente, em um cronograma ou com base em eventos. Os trabalhos são mais adequados para tarefas como processamento de dados, aprendizado de máquina, limpeza de recursos ou qualquer cenário que exija recursos de computação efêmeros sem servidor.

Neste tutorial, você aprenderá a trabalhar com trabalhos orientados a eventos.

  • Crie um ambiente de Aplicações Container para implementar as suas aplicações container
  • Crie uma fila de armazenamento do Azure para enviar mensagens à aplicação de contentores
  • Criar uma imagem de contêiner que executa um trabalho
  • Implantar a tarefa no ambiente de Aplicativos de Contêiner
  • Verifique se as mensagens da fila são processadas pelo aplicativo contêiner

O trabalho que crias inicia uma execução para cada mensagem enviada para uma fila de armazenamento do Azure. Cada execução de trabalho executa um contêiner que executa as seguintes etapas:

  1. Obtém uma mensagem da fila.
  2. Registra a mensagem nos logs de execução do trabalho.
  3. Exclui a mensagem da fila.
  4. Interrompe.

Importante

O dimensionador monitora o comprimento da fila para determinar quantos trabalhos iniciar. Para uma escalabilidade precisa, não apague uma mensagem da fila até que a execução do trabalho termine de processá-la.

O código-fonte do trabalho executado neste tutorial está disponível em um repositório GitHub de Exemplos do Azure.

Pré-requisitos

Para informações sobre funcionalidades que os jobs das Aplicações Container não suportam, consulte Restrições de Jobs.

Preparar o ambiente

  1. Para iniciar sessão no Azure a partir da CLI do Azure, execute o seguinte comando e siga os prompts para completar o processo de autenticação.

    az login
    
  2. Certifique-se de que está a executar a versão mais recente da CLI do Azure através do az upgrade comando.

    az upgrade
    
  3. Instale a versão mais recente da extensão Container Apps CLI.

    az extension add --name containerapp --upgrade
    
  4. Registe os Microsoft.Appnamespaces , Microsoft.OperationalInsights, e Microsoft.Storage se ainda não estiverem registados na tua subscrição do Azure.

    az provider register --namespace Microsoft.App
    az provider register --namespace Microsoft.OperationalInsights
    az provider register --namespace Microsoft.Storage
    
  5. Defina as variáveis de ambiente utilizadas ao longo deste artigo.

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

Criar um ambiente de aplicativos de contêiner

O ambiente Container Apps atua como uma barreira de isolamento para aplicações container e jobs, permitindo que partilhem a mesma rede e comuniquem entre si.

  1. Crie um grupo de recursos usando o comando a seguir.

    az group create \
        --name "$RESOURCE_GROUP" \
        --location "$LOCATION"
    
  2. Crie o ambiente Container Apps usando o seguinte comando.

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

Configurar uma fila de armazenamento

O trabalho usa uma fila de Armazenamento do Azure para receber mensagens. Nesta seção, você cria uma conta de armazenamento e uma fila.

  1. Defina um nome para sua conta de armazenamento.

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

    Substitua <STORAGE_ACCOUNT_NAME> por um nome exclusivo para sua conta de armazenamento. Os nomes das contas de armazenamento devem ser únicos dentro do Azure. Devem ter entre 3 e 24 caracteres e conter apenas números e letras minúsculas.

  2. Criar uma conta de Armazenamento do Azure.

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

    Se este comando devolver o seguinte erro, certifique-se de que registou o Microsoft.Storage namespace na sua subscrição Azure.

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

    Use este comando para registar o namespace:

    az provider register --namespace Microsoft.Storage
    
  3. Guardar a string de ligação da fila numa variável:

    QUEUE_CONNECTION_STRING=$(az storage account show-connection-string -g $RESOURCE_GROUP --name $STORAGE_ACCOUNT_NAME --query connectionString --output tsv)
    
  4. Crie a fila de mensagens:

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

Criar uma identidade gerida atribuída pelo utilizador

Para evitar o uso de credenciais administrativas, extraia imagens de repositórios privados no Azure Container Registry. Use identidades geridas para autenticação. Sempre que possível, use uma identidade gerenciada atribuída pelo usuário para extrair imagens.

  1. Crie uma identidade gerida atribuída pelo utilizador. Antes de executar os seguintes comandos, escolha um nome para a sua identidade gerida e crie a seguinte variável:

    IDENTITY="<YOUR_IDENTITY_NAME>"
    
    az identity create \
        --name $IDENTITY \
        --resource-group $RESOURCE_GROUP
    
  2. Obtenha o ID de recurso da identidade:

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

Criar e implantar a tarefa

Para implementar a tarefa, deve primeiro construir uma imagem de contentor e carregá-la para um registo. Pode então implementar o trabalho no ambiente Container Apps.

  1. Defina um nome para a imagem do seu contentor e para o registo:

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

    Substitua <CONTAINER_REGISTRY_NAME> por um nome exclusivo para seu registro de contêiner. Os nomes dos registos de contentores devem ser únicos dentro do Azure. Devem ter entre 5 e 50 caracteres e conter apenas números e letras minúsculas.

  2. Crie um registo de contentores:

    az acr create \
        --name "$CONTAINER_REGISTRY_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --location "$LOCATION" \
        --sku Basic
    
  3. Seu registro de contêiner deve permitir tokens de audiência do Azure Resource Manager (ARM) para autenticação para usar a identidade gerenciada para extrair imagens.

    Use o seguinte comando para verificar se os tokens ARM têm permissão para aceder ao seu registo de contentores Azure:

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

    Se os tokens ARM forem permitidos, verá a seguinte saída:

    {
      "status": "enabled"
    }
    

    Se for statusdisabled, permitam tokens ARM usando o seguinte comando:

    az acr config authentication-as-arm update --registry "$CONTAINER_REGISTRY_NAME" --status enabled
    
  4. O código-fonte do trabalho está disponível no GitHub. Execute o seguinte comando para clonar o repositório e construir a imagem do contentor na cloud:

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

    A imagem agora está disponível no registro do contêiner.

  5. Crie um emprego no ambiente 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"
    

    A tabela seguinte descreve os parâmetros-chave usados no comando anterior.

    Parâmetro Descrição
    --replica-timeout A duração máxima que uma réplica pode funcionar.
    --min-executions O número mínimo de execuções de trabalho a serem executadas por intervalo de sondagem.
    --max-executions O número máximo de tarefas a serem executadas por período de sondagem.
    --polling-interval O intervalo de sondagem para avaliar a regra da escala.
    --scale-rule-name O nome da regra de escala.
    --scale-rule-type O tipo de regra de escala a ser usada.
    --scale-rule-metadata Os metadados para a regra de escala.
    --scale-rule-auth A autenticação para a regra de escala.
    --secrets Os segredos para utilizar no trabalho.
    --registry-server O servidor de registro de contêiner a ser usado para o trabalho. Para um registo de contentores Azure, o comando configura automaticamente a autenticação.
    --mi-user-assigned A ID do recurso da identidade gerenciada atribuída pelo usuário a ser atribuída ao trabalho.
    --registry-identity O identificador de recurso de uma identidade gerida para autenticar no servidor de registro em vez de usar um nome de utilizador e senha. Se possível, é criada automaticamente uma atribuição de função para a identidade acrpull.
    --env-vars As variáveis de ambiente a serem usadas para o trabalho.

    A configuração da regra de escala define a origem do evento a ser monitorada. É avaliado em cada intervalo de sondagem e determina quantas execuções de tarefas devem ser acionadas. Para mais informações, veja Definir regras de escalabilidade.

O trabalho controlado por eventos agora é criado no ambiente Container Apps.

Verificar a implementação

O trabalho está configurado para avaliar a regra da escala a cada 60 segundos. Esta avaliação verifica o número de mensagens na fila. Para cada período de avaliação, ele inicia uma nova execução de trabalho para cada mensagem na fila, até um máximo de 10 execuções.

Para verificar se o trabalho está configurado corretamente, pode enviar algumas mensagens para a fila e confirmar que as execuções do trabalho foram iniciadas e que as mensagens estão registadas nos registos de execução do trabalho.

  1. Envie uma mensagem para a fila:

    az storage message put \
        --content "Hello Queue Reader Job" \
        --queue-name "$QUEUE_NAME" \
        --connection-string "$QUEUE_CONNECTION_STRING"
    
  2. Liste as execuções de uma tarefa.

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

    Como o trabalho está configurado para avaliar a regra de escala a cada 60 segundos, pode demorar até um minuto inteiro para a execução do trabalho começar. Repita o comando até ver a execução do trabalho e seu status é Succeeded.

  3. Execute os seguintes comandos para ver as mensagens registradas. Estes comandos requerem a extensão Log analytics, por isso aceita o prompt para instalar a extensão.

    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"
    

    Até que a ContainerAppConsoleLogs_CL tabela esteja pronta, o comando retorna um erro: BadArgumentError: The request had some invalid properties. Aguarde alguns minutos e tente novamente.

Gorjeta

Está a ter problemas? Informe-nos no GitHub abrindo um problema no repositório de Aplicativos de Contêiner do Azure.

Limpar recursos

Quando terminares, executa o seguinte comando para eliminar o grupo de recursos que contém os recursos das Apps do Container.

Atenção

O comando seguinte elimina o grupo de recursos especificado e todos os recursos nele contidos. Se houver recursos fora do âmbito deste tutorial no grupo de recursos especificado, também são eliminados.

az group delete \
    --resource-group $RESOURCE_GROUP

Próximo passo