Compartilhar via


Tutorial: Implantar um trabalho controlado por eventos usando os Aplicativos de Contêiner do Azure

Os trabalhos de Aplicativos de Contêiner do Azure permitem que você execute tarefas em contêineres que são executadas por uma duração finita e, em seguida, interrompa. Você pode disparar uma execução de trabalho manualmente, em um agendamento 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 controlados por eventos.

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

O trabalho que você cria inicia uma execução para cada mensagem enviada para a 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 determinada da fila.
  4. Para.

Importante

O dimensionador monitora o comprimento da fila para determinar quantos trabalhos iniciar. Para 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 obter informações sobre os recursos que não são compatíveis com tarefas de Aplicativos de Contêiner, consulte restrições de tarefas.

Preparar o ambiente

  1. Para entrar no Azure por meio da CLI do Azure, execute o comando a seguir e siga os prompts para concluir o processo de autenticação.

    az login
    
  2. Verifique se você está executando a versão mais recente da CLI do Azure por meio do az upgrade comando.

    az upgrade
    
  3. Instale a versão mais recente da extensão da CLI dos Aplicativos de Contêiner.

    az extension add --name containerapp --upgrade
    
  4. Registre os namespaces Microsoft.App, Microsoft.OperationalInsights e Microsoft.Storage se eles ainda não estiverem registrados em sua assinatura 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 usadas ao longo deste artigo.

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

Criar um ambiente dos Aplicativos de Contêiner

** O ambiente Container Apps atua como um limite de isolamento em torno de aplicativos e tarefas de contêiner, permitindo que compartilhem a mesma rede e se 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 de Aplicativos de Contêiner usando o comando a seguir.

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

Configurar uma fila de armazenamento

O trabalho usa uma fila do Armazenamento do Azure para receber mensagens. Nesta seção, você criará 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 a sua conta de armazenamento. Os nomes da conta de armazenamento devem ser exclusivos no Azure. Eles devem ter entre 3 e 24 caracteres e conter apenas números e letras minúsculas.

  2. Criar uma conta do Armazenamento do Azure.

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

    Se esse comando retornar o erro a seguir, verifique se você registrou o Microsoft.Storage namespace em sua assinatura do Azure.

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

    Use este comando para registrar o namespace:

    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 gerenciada atribuída ao usuário

Para evitar o uso de credenciais administrativas, baixe imagens de repositórios privados no Azure Container Registry. Use identidades gerenciadas para autenticação. Quando possível, use uma identidade gerenciada atribuída pelo usuário para efetuar pull de imagens.

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

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

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

Compilar e implantar o aplicativo

Para implantar o trabalho, primeiro crie uma imagem de contêiner para ele e faça o push do contêiner para um registro. Em seguida, você pode implantar o trabalho no ambiente de Container Apps.

  1. Defina um nome para sua imagem de contêiner e registro:

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

    Substitua <CONTAINER_REGISTRY_NAME> por um nome exclusivo para o seu novo registro de contêiner Os nomes do registro de contêiner devem ser exclusivos no Azure. Eles devem ter entre 5 e 50 caracteres e conter apenas números e letras minúsculas.

  2. Criar um registro de contêiner:

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

    Use o seguinte comando para verificar se os tokens ARM têm permissão para acessar o registro de contêiner do Azure:

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

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

    {
      "status": "enabled"
    }
    

    Se o status for disabled, permita tokens ARM usando o seguinte comando:

    az acr config authentication-as-arm update --registry "$CONTAINER_REGISTRY_NAME" --status enabled
    
  4. O código-fonte desta amostra está disponível no GitHub. Execute o seguinte comando para clonar o repositório e criar a imagem de contêiner na nuvem:

    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 de contêiner.

  5. Crie uma tarefa no ambiente do 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 parâmetros de chave usados no comando anterior.

    Parâmetro Descrição
    --replica-timeout Duração máxima de execução de uma réplica.
    --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 no qual avaliar a regra de 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 da regra de escala.
    --scale-rule-auth A autenticação para a regra de escala.
    --secrets Os segredos a serem usados para o trabalho.
    --registry-server O servidor do 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 para atribuir o trabalho.
    --registry-identity O ID de recurso de uma identidade gerenciada para autenticar com o servidor do registro em vez de utilizar um nome de usuário e senha. Se possível, é criada automaticamente uma atribuição de função acrpull para a identidade.
    --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 trabalho serão acionadas. Para obter mais informações, consulte Definir regras de dimensionamento.

O trabalho controlado por eventos agora é criado no ambiente dos Aplicativos de Contêiner.

Verificar a implantação

O trabalho é configurado para avaliar a regra de escala a cada 60 segundos. Essa 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, você pode enviar algumas mensagens para a fila e confirmar se as execuções de 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 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 levar até um minuto inteiro para que a execução do trabalho seja iniciada. Repita o comando até ver a execução do trabalho e seu status for Succeeded.

  3. Execute o comando a seguir para ver as mensagens registradas. Esses comandos exigem a extensão do Log Analytics, portanto, aceite 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 retornará um erro: BadArgumentError: The request had some invalid properties. Aguarde alguns minutos e tente novamente.

Dica

Está com problemas? Abra um problema no repositório do Aplicativos de Contêiner do Azure no GitHub.

Limpar os recursos

Quando terminar, execute o comando a seguir 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 houver 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óxima etapa