Compartilhar via


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

Os trabalhos dos Aplicativos de Contêiner do Azure permitem realizar tarefas em contêineres executadas por uma duração finita e encerrá-las. 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 para 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 uma fila do 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. Saídas.

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

Instalação

  1. Para entrar no Azure usando a CLIl, 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 com o comando de atualização.

    az upgrade
    
  3. Instale a última versão da extensão da CLI dos Aplicativos de Contêiner do Azure.

    az extension add --name containerapp --upgrade
    
  4. Registre os namespaces Microsoft.App, Microsoft.OperationalInsights e Microsoft.Storage se você ainda não os registrou em sua assinatura do Azure.

    az provider register --namespace Microsoft.App
    az provider register --namespace Microsoft.OperationalInsights
    az provider register --namespace Microsoft.Storage
    
  5. Agora que a configuração da CLI do Azure foi concluída, você pode definir as variáveis de ambiente que são 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 dos Aplicativos de Contêiner do Azure funciona como um limite seguro em torno de aplicativos e trabalhos de contêiner, de modo que eles possam compartilhar a rede e se comunicar 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 dos 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 de conta de armazenamento precisam ser exclusivos no Azure, ter de 3 a 24 caracteres de comprimento e ter apenas números e letras minúsculas.

  2. Crie 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.
    

    Verifique se você registrou o namespace Microsoft.Storage 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 gerenciada atribuída ao usuário

Para evitar o uso de credenciais administrativas, efetue pull de imagens de repositórios privados no Registro de Contêiner do Microsoft Azure usando identidades gerenciadas para autenticação. Quando possível, use uma identidade gerenciada atribuída pelo usuário para efetuar pull de imagens.

  1. Criar uma identidade gerenciada atribuída pelo usuário. 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 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 você deve criar uma imagem de contêiner para o trabalho e efetuar push dela para um registro. Em seguida, você pode implantar o trabalho no ambiente de Aplicativos de Contêiner.

  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 de conta de armazenamento precisam ser exclusivos no Azure, ter de 5 a 50 caracteres de comprimento e ter 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. O registro de contêiner deve permitir tokens de audiência do ARM (Azure Resource Manager) para autenticação a fim de usar a identidade gerenciada para efetuar pull de imagens.

    Use o comando a seguir para verificar se os tokens do ARM têm permissão para acessar o ACR (Registro de Contêiner do Azure).

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

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

    {
      "status": "enabled"
    }
    

    Se status for disabled, permita tokens do ARM com o comando a seguir.

    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 comando a seguir para clonar o repositório e compilar a imagem de 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 de contêiner.

  5. Crie um trabalho no ambiente de Aplicativos de Contêiner.

    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 usados no comando.

    Parâmetro Descrição
    --replica-timeout A duração máxima que um 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 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 A ID do recurso de uma identidade gerenciada para autenticação no 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 serão disparadas. Para saber mais, confira Definir regras de dimensionamento.

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

Verificar a implantaçã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 de trabalho foram iniciadas e as mensagens estão registradas nos logs de execução do trabalho.

  1. Enviar uma mensagem à fila

    az storage message put \
        --content "Hello Queue Reader Job" \
        --queue-name "$QUEUE_NAME" \
        --connection-string "$QUEUE_CONNECTION_STRING"
    
  2. Você pode listar as execuções de um trabalho.

    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 completo 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. Este comando requer a extensão do Log Analytics, portanto, aceite o prompt de instalaçã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 retornará um erro: BadArgumentError: The request had some invalid properties. Aguarde alguns minutos e tente novamente.

Dica

Está enfrentando problemas? Deixe-nos saber sobre GitHub abrindo um problema no repositório dos Aplicativos de Contêiner do Azure.

Limpar os recursos

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

Cuidado

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óximas etapas