Criar e testar uma Função do Azure simples localmente com o Visual Studio

Concluído

Os usuários podem escrever, depurar e implantar uma Função do Azure de dentro do portal do Azure. No entanto, as funções de escrita diretamente em um ambiente de produção, preparação ou teste podem não ser adequadas. Por exemplo, escrever testes de unidade automatizados para o Azure Functions ou usar a implantação sob demanda do Azure Functions para Aplicativos de Função no Azure. Normalmente, os desenvolvedores preferem usar um editor de código e ferramentas de desenvolvimento em vez do ambiente fornecido pelo portal do Azure. O Visual Studio permite que você desenvolva e gerencie o código do Azure Functions usando outro código e serviços em um único projeto.

No cenário de relógios de luxo online, os desenvolvedores já estão familiarizados com o Visual Studio 2022. Por isso, decide utilizar o Visual Studio como o ambiente de desenvolvimento principal para a criação de Funções do Azure. Além disso, o Visual Studio fornece um ambiente excelente para testar as suas funções localmente antes de implementá-las no Azure.

Nesta unidade, você aprende a usar as ferramentas disponíveis no Visual Studio para criar e testar uma Função do Azure em seu computador local.

Importante

Este artigo suporta funções de biblioteca de classes .NET que são executadas em processo com o tempo de execução. Suas funções C# também podem ser executadas fora do processo e isoladas do tempo de execução do Functions. O modelo de processo de trabalho isolado é a única maneira de executar versões não-LTS de aplicativos .NET e .NET Framework em versões atuais do tempo de execução do Functions. Para saber mais, consulte Funções isoladas do processo de trabalho do .NET.

Modificar a Instalação do Visual Studio

Primeiro, vamos configurar o Visual Studio com as ferramentas da Web e da nuvem de que você precisa para seu ambiente de desenvolvimento.

  1. Com o Visual Studio 2022 instalado localmente, abra o Visual Studio Installer e, no Visual Studio Community 2022, selecione Modificar.

    Captura de tela do Visual Studio Installer com Modify realçado.

  2. A página Modifying – Visual Studio (Modificar – Visual Studio) será apresentada.

    Captura de ecrã do separador Modificar cargas de trabalho do Visual Studio Community 2022 com o desenvolvimento ASP.NET e Web e o desenvolvimento do Azure realçados.

  3. Na guia Cargas de trabalho, marque as caixas de seleção Desenvolvimento ASP.NET e Web e Desenvolvimento do Azure e selecione Modificar.

  4. Na caixa de diálogo de verificação, selecione Sim. A página Instalador do Visual Studio é exibida e exibe o progresso dos pacotes que estão sendo instalados.

Extensão das Ferramentas do Azure Functions para Visual Studio

O Azure Functions Tools é uma extensão do Visual Studio que permite criar, testar e implantar o Azure Functions em seu ambiente de desenvolvimento local. Para criar rapidamente um novo Aplicativo de Função do Azure, essa extensão fornece um modelo para você criar e, em seguida, implantar uma função diretamente no Azure a partir do Visual Studio.

A extensão Azure Functions and Web Jobs Tools está incluída no Visual Studio 2022.

Aplicação de Função do Azure

Um aplicativo de função hospeda uma ou mais funções. Ele fornece o ambiente e o tempo de execução para o seu código de função.

Uma função é acionada por um evento em vez de ser chamada diretamente de um aplicativo. Você especifica o tipo de evento que aciona cada função em seu Aplicativo de Função do Azure. Os eventos disponíveis incluem:

  • Acionador de blob. Este tipo de função é executado quando um ficheiro é carregado ou modificado no Armazenamento de Blobs do Azure.
  • Acionador do Hub de Eventos. Um gatilho de Hubs de Eventos executa a função quando um hub de eventos recebe uma mensagem.
  • Acionador do Azure Cosmos DB. Esse gatilho é executado quando um documento é adicionado ou modificado em um banco de dados do Azure Cosmos DB. Pode utilizar este acionador para integrar o Azure Cosmos DB com outros serviços. Por exemplo, se um documento que representa o pedido de um cliente for adicionado a uma base de dados, pode utilizar um acionador para enviar uma cópia do pedido para uma fila para processamento.
  • Acionador Http. Um acionador HTTP executa a função quando um pedido HTTP ocorre numa aplicação Web. Também pode utilizar este acionador para responder a webhooks. Um webhook é uma chamada de retorno que ocorre quando um item alojado por um site é modificado. Por exemplo, você pode criar uma função acionada por um webhook de um repositório GitHub quando um item no repositório é alterado.
  • Acionador de fila. Esse gatilho inicia a função quando um novo item é adicionado a uma Fila de Armazenamento do Azure.
  • Acionador de Fila do Service Bus. Esse gatilho executa a função quando um novo item é adicionado a uma fila do Barramento de Serviço do Azure.
  • Acionador de Tópico do Service Bus. Este acionador executa a função em resposta a uma nova mensagem que chega num Tópico do Service Bus.
  • Acionador de temporizador. Esse evento executa a função em intervalos regulares, seguindo um cronograma que você define.

Captura de ecrã a mostrar os acionadores de Funções do Azure disponíveis, com o Acionador HTTP realçado.

A tabela a seguir mostra o nível mais alto de .NET Core ou .NET Framework que você pode usar com uma versão específica do Functions.

Versão do tempo de execução do Functions Em processo Processo de trabalho isolado
Funções 4.x .NET 6.0 .NET 6.0
.NET 7.0
.NET 8.0
.NET Framework 4.8
Funções 1.x .NET Framework 4.8 n/d

Um Aplicativo de Função do Azure armazena informações de gerenciamento, código e logs no armazenamento do Azure. Para armazenar esses dados, crie uma Conta de Armazenamento. A conta de armazenamento tem de suportar o armazenamento de Tabelas, Ficheiros, Filas e Blobs do Azure; utilize uma conta de Armazenamento do Azure geral para este fim. Para especificar a conta de armazenamento a utilizar para a função, tem de utilizar a caixa de diálogo previamente apresentada.

Uma função pode executar operações privilegiadas ou sensíveis. Uma função acionada por uma solicitação HTTP pode ser exposta publicamente. Poderá ter de limitar a capacidade de executar esta função em grupos de utilizadores selecionados. Você protege uma função especificando os direitos de acesso necessários para acionar a função. Uma função acionada por uma solicitação HTTP suporta três níveis de direitos de acesso:

  • Anónimo. Não é necessária autenticação e qualquer utilizador pode acionar a função.
  • Função. O pedido HTTP tem de fornecer uma chave que permite que o runtime da Função do Azure autorize o pedido. Esta chave é criada em separado e pode utilizar o portal do Azure para mantê-la.
  • Administrador. Semelhante à função. O usuário deve especificar uma chave com a solicitação HTTP que aciona a função. A diferença é que a chave é uma chave de administrador. Esta chave pode ser utilizada para aceder a qualquer função na aplicação de funções. Tal como acontece com uma chave de função, esta chave é criada em separado.

Se estiver a criar uma função acionada por eventos que não sejam de pedidos HTTP, tem de fornecer uma cadeia de ligação e outros detalhes necessários para a aplicação de funções aceder ao recurso que aciona o evento. Por exemplo, se você estiver escrevendo uma função acionada por um evento de Armazenamento de Blob, deverá especificar a cadeia de conexão para a conta de Armazenamento de Blob correspondente.

Estrutura de uma Função do Azure

Uma Função do Azure é implementada como uma classe estática. A classe fornece um método estático e assíncrono chamado Run, que atua como o ponto de entrada para a classe.

Os parâmetros transmitidos para o método Run fornecem o contexto para o acionador. Se for um gatilho HTTP, a função receberá um objeto HttpRequest . Este objeto contém o cabeçalho e o corpo do pedido. Pode aceder aos dados no pedido com as mesmas técnicas disponíveis em qualquer pedido de HTTP. Os atributos aplicados a esta função especificam os requisitos de autorização (Anonymous neste caso) e as operações HTTP às quais a função responde (GET e POST).

O exemplo de código a seguir gerado pelo Visual Studio examina a cadeia de caracteres de consulta fornecida como parte da URL para a solicitação e procura um parâmetro chamado name. O código também usa um StreamReader para desserializar o corpo da solicitação e tenta ler o valor de uma propriedade também chamada name da solicitação. Se name for encontrado na cadeia de caracteres de consulta ou no corpo da solicitação, o valor name será retornado na resposta. Caso contrário, a função gera uma resposta de erro com a mensagem: Passe um nome na cadeia de caracteres de consulta ou no corpo da solicitação.

public static class Function1
{
    [FunctionName("Function1")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

        string name = req.Query["name"];

        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
        name = name ?? data?.name;

        return name != null
            ? (ActionResult)new OkObjectResult($"Hello, {name}")
            : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
    }
}

A função retorna um valor contendo dados de saída e resultados, encapsulados em um objeto IActionResult . O valor é devolvido no corpo da resposta HTTP para o pedido.

Diferentes tipos de gatilhos recebem diferentes parâmetros de entrada e tipos de retorno. O exemplo seguinte mostra o código gerado para um acionador de Blob. Neste exemplo, o conteúdo do blob é retornado por meio de um objeto Stream e o nome do blob também é fornecido. O gatilho não retorna nenhum dado; Sua finalidade é ler e processar os dados no blob nomeado.

public static class Function2
{
    [FunctionName("Function2")]
    public static void Run([BlobTrigger("samples-workitems/{name}", Connection = "xxxxxxxxxxxxxxxxxxxxxxx")]Stream myBlob, string name, ILogger log)
    {
        log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
    }
}

Em todos os casos, uma função é passada um parâmetro ILogger . A função pode usar esse parâmetro para gravar mensagens de log, que o aplicativo de função grava no armazenamento para análise posterior.

Uma função também contém metadados que especificam o tipo de gatilho, os requisitos de segurança e quaisquer outros requisitos de informações específicos. Você pode modificar metadados usando o HttpTrigger, BlobTrigger ou outros atributos de gatilho, conforme mostrado nos exemplos. O atributo FunctionName que precede uma função é um identificador para a função usada pelo Function App. Este nome não tem de ser igual ao nome da função, mas é uma boa prática mantê-los sincronizados para evitar confusões.

Testar um Aplicativo de Função do Azure localmente

Você pode usar o Depurador Visual para criar e testar um Aplicativo de Função do Azure localmente. Para iniciar o depurador, pressione F5 ou, no menu Depurar , selecione Iniciar Depuração. A versão local do Tempo de Execução da Função é iniciada. Suas funções estão disponíveis para teste. O exemplo mostra o tempo de execução que hospeda Function1, a função acionada por um evento HTTP. O URL indica o ponto final ao qual a função está atualmente associada.

Captura de ecrã a mostrar o Azure Function Runtime - exemplo 1.

Se você abrir um navegador da Web e visitar esse URL, acionará a função. A imagem seguinte mostra a resposta gerada por um pedido GET de HTTP que não inclui um corpo. Você pode ver a mensagem gerada pelo código que retorna o objeto BadRequestObjectResult da função.

Captura de ecrã a mostrar o Temo de Execução das Funções do Azure.

Se você fornecer uma cadeia de caracteres de consulta que inclua um parâmetro name , a função lê e processa o valor.

Captura de ecrã a mostrar o Azure Function Runtime - exemplo 2.

Enquanto o código está em execução, você vê mensagens de rastreamento aparecendo na janela Tempo de execução da função. Pode utilizar as funcionalidades de depuração padrão do Visual Studio se precisar de definir pontos de interrupção e examinar o fluxo de controlo numa função.