Partilhar via


Tutorial: Implantar um trabalho orientado a eventos com Aplicativos de Contêiner do Azure

Os trabalhos das Aplicações de Contentor do Azure permitem-lhe executar tarefas em contentores que são executadas durante uma duração finita e saem. 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.

  • Criar um ambiente de aplicativos de contêiner para implantar seus aplicativos de contêiner
  • Criar uma Fila de Armazenamento do Azure para enviar mensagens para o aplicativo de contêiner
  • Criar uma imagem de contêiner que executa um trabalho
  • Implantar o trabalho no ambiente de Aplicativos de Contêiner
  • Verifique se as mensagens da fila são processadas pelo aplicativo contêiner

O trabalho criado 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. Saídas.

Importante

O dimensionador monitora o comprimento da fila para determinar quantos trabalhos iniciar. Para obter um dimensionamento preciso, não exclua 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 de conta de armazenamento devem ser exclusivos no Azure e ter de 3 a 24 caracteres contendo 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 retornar o erro:

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

    Certifique-se de ter registrado o Microsoft.Storage namespace em sua assinatura do Azure.

    az provider register --namespace Microsoft.Storage
    
  3. Salve a cadeia de conexão da fila em uma 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 Registro de Contêiner do Microsoft Azure usando identidades gerenciadas 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 comandos a seguir, escolha um nome para sua identidade gerenciada e substitua o \<PLACEHOLDER\> pelo nome.

    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 o trabalho

Para implantar o trabalho, você deve primeiro criar uma imagem de contêiner para o trabalho e enviá-la por push para um registro. Em seguida, você pode implantar o trabalho no ambiente de aplicativos de contêiner.

  1. Defina um nome para a imagem do contêiner e o registro.

    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 do Registro de contêiner devem ser exclusivos no Azure e ter de 5 a 50 caracteres de comprimento, contendo apenas números e letras minúsculas.

  2. Crie um registro de contêiner.

    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 comando a seguir para verificar se os tokens ARM têm permissão para acessar seu Registro de Contêiner do Azure (ACR).

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

    Se os tokens ARM forem permitidos, o comando produzirá o seguinte.

    {
      "status": "enabled"
    }
    

    Se for , statusdisabledpermita tokens ARM com 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 contêiner na nuvem usando o az acr build comando.

    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 trabalho 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 a seguir descreve os principais parâmetros usados no comando.

    Parâmetro Description
    --replica-timeout A duração máxima que uma réplica pode executar.
    --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 execuções de trabalho a serem executadas por intervalo 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 a usar para o trabalho.
    --registry-server O servidor de registro de contêiner a ser usado para o trabalho. Para um Registro de Contêiner do 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 A ID de recurso de uma identidade gerenciada para autenticar com o servidor de registro em vez de usar um nome de usuário e senha. Se possível, uma atribuição de função 'acrpull' é criada para a identidade automaticamente.
    --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. Ele é avaliado em cada intervalo de sondagem e determina quantas execuções de trabalho devem ser acionadas. Para saber mais, consulte Definir regras de dimensionamento.

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

Verificar a implementação

O trabalho é configurado para avaliar a regra de escala a cada 60 segundos, que 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 foi configurado corretamente, você pode enviar algumas mensagens para a fila, confirmar se as execuções do trabalho foram iniciadas e se as mensagens são registradas nos logs 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. Listar as execuções de um trabalho.

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

    Como o trabalho é configurado para avaliar a regra de escala a cada 60 segundos, pode levar até um minuto completo para que a execução do trabalho seja iniciada. Repita o comando até ver a execução do trabalho e seu status é Succeeded.

  3. Execute os seguintes comandos para ver as mensagens registradas. Esses comandos exigem a extensão de análise de log, portanto, aceite o prompt para instalar a extensão quando solicitado.

    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

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

Clean up resources (Limpar recursos)

Quando terminar, execute o seguinte comando para excluir o grupo de recursos que contém os recursos dos Aplicativos de Contêiner.

Atenção

O comando a seguir exclui o grupo de recursos especificado e todos os recursos contidos nele. Se existirem recursos fora do escopo deste tutorial no grupo de recursos especificado, eles também serão excluídos.

az group delete \
    --resource-group $RESOURCE_GROUP

Próximos passos