Início rápido: criar uma função C# no Azure da linha de comando

Neste artigo, você usará ferramentas de linha de comando para criar uma função C# que responde a solicitações HTTP. Após testar o código localmente, implante-o no ambiente sem servidor do Azure Functions.

Este artigo dá suporte à criação dos dois tipos de funções C# compiladas:

Modelo de execução Descrição
Em processo Seu código de função é executado no mesmo processo que o processo de host do Functions. Compatível com .NET Core 3.1 e .NET 6.0. Para saber mais, confira Desenvolver funções da biblioteca de classes C# usando o Azure Functions.
Processo isolado O código de função é executado em um processo de trabalho do .NET separado. Compatível com .NET 5.0 e .NET 6.0. Para saber mais, consulte Desenvolver funções de processo isolado em C#.

Este artigo cria uma função disparada por HTTP executada no .NET 6.0. Há também uma versão baseada no Visual Studio Code deste artigo.

A realização deste início rápido gera um pequeno custo de alguns centavos de dólar ou menos em sua conta do Azure.

Configurar o ambiente local

Antes de começar, você deverá ter o seguinte:

Você também precisa de uma conta do Azure com uma assinatura ativa. Crie uma conta gratuitamente.

Verificação de pré-requisitos

Verifique os pré-requisitos, que dependem se você está usando a CLI do Azure ou o Azure PowerShell para criar recursos do Azure:

  • Em um terminal ou uma janela Comando, execute func --version para verificar se a versão do Azure Functions Core Tools é a 4.x.

  • Execute dotnet --list-sdks para verificar se as versões necessárias estão instaladas.

  • Execute az --version para verificar se a versão da CLI do Azure é a 2.4 ou posterior.

  • Execute az login para entrar no Azure e verifique se a assinatura está ativa.

Criar um projeto de função local

No Azure Functions, um projeto de função é um contêiner para uma ou mais funções individuais que respondem, cada uma, a um gatilho específico. Todas as funções em um projeto compartilham as configurações locais e de hospedagem. Nesta seção, você cria um projeto de função que contém apenas uma função.

  1. Execute o comando func init da seguinte maneira para criar um projeto de funções em uma pasta chamada LocalFunctionProj com o runtime especificado:

    func init LocalFunctionProj --dotnet
    
  2. Navegue até a pasta do projeto:

    cd LocalFunctionProj
    

    Essa pasta contém vários arquivos do projeto, incluindo arquivos de configuração chamados local.settings.json e host.json. Como local.settings.json pode conter segredos baixados do Azure, o arquivo é excluído do controle do código-fonte por padrão no arquivo .gitignore.

  3. Adicione uma função ao projeto usando o comando a seguir, em que o argumento --name é o nome exclusivo da função (HttpExample) e o argumento --template especifica o gatilho da função (HTTP).

    func new --name HttpExample --template "HTTP trigger" --authlevel "anonymous"
    

    func new cria um arquivo de código HttpExample.cs.

(Opcional) Examinar o conteúdo do arquivo

Se preferir, você poderá ir diretamente para Executar a função localmente e examinar o conteúdo do arquivo mais tarde.

HttpExample.cs

O código de função gerado do modelo depende do tipo de projeto C# compilado.

HttpExample.cs contém um método Run que recebe dados de solicitação na variável req é uma HttpRequest decorada com o HttpTriggerAttribute, que define o comportamento do gatilho.

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

namespace LocalFunctionProj
{
    public static class HttpExample
    {
        [FunctionName("HttpExample")]
        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");
        }
    }
}

O objeto de retorno é um ActionResult que retorna uma mensagem de resposta como um OkObjectResult (200) ou um BadRequestObjectResult (400).

Para saber mais, confira Gatilhos e associações HTTP do Azure Functions.

Executar a função localmente

  1. Execute sua função iniciando o host de runtime do Azure Functions local da pasta LocalFunctionProj:

    func start
    

    Perto do fim da saída, devem aparecer as seguintes linhas:

     ...
    
     Now listening on: http://0.0.0.0:7071
     Application started. Press Ctrl+C to shut down.
    
     Http Functions:
    
             HttpExample: [GET,POST] http://localhost:7071/api/HttpExample
     ...
    
     

    Observação

    Se HttpExample não aparece conforme mostrado acima, é provável que você tenha iniciado o host fora da pasta raiz do projeto. Nesse caso, use Ctrl+C para parar o host, navegue até a pasta raiz do projeto e execute o comando anterior novamente.

  2. Copie a URL da função HttpExample dessa saída para um navegador:

    Acrescente a cadeia de caracteres de consulta ?name=<YOUR_NAME> à URL da função, fazendo com que a URL completa seja http://localhost:7071/api/HttpExample?name=Functions. O navegador exibirá uma mensagem de resposta que retorna o valor da cadeia de consulta. O terminal em que você iniciou seu projeto também mostra a saída do log conforme você faz solicitações.

  3. Quando você concluir, use Ctrl+C e escolha y para interromper o host de funções.

Criar recursos de suporte do Azure para a função

Antes de poder implantar o código da função no Azure, você precisa criar três recursos:

  • Um grupo de recursos, que é um contêiner lógico para recursos relacionados.
  • Uma conta de armazenamento, que é usada para manter o estado e outras informações sobre suas funções.
  • Um aplicativo de funções, que fornece o ambiente para a execução do código de função. Um aplicativo de funções é mapeado para seu projeto de função local e permite agrupar funções como uma unidade lógica para facilitar o gerenciamento, a implantação e o compartilhamento de recursos.

Use os comandos a seguir para criar esses itens. Tanto a CLI do Azure quanto o PowerShell são compatíveis.

  1. Se você ainda não tiver feito isso, entre no Azure:

    az login
    

    O comando az login conecta você à conta do Azure.

  2. Crie um grupo de recursos chamado AzureFunctionsQuickstart-rg na região de sua escolha:

    az group create --name AzureFunctionsQuickstart-rg --location <REGION>
    

    O comando az group create cria um grupo de recursos. No comando acima, substitua <REGION> por uma região perto de você, usando um código de região disponível retornado do comando az account list-locations.

  3. Crie uma conta de armazenamento para uso geral no grupo de recursos e na região:

    az storage account create --name <STORAGE_NAME> --location <REGION> --resource-group AzureFunctionsQuickstart-rg --sku Standard_LRS
    

    O comando az storage account create cria a conta de armazenamento.

    No exemplo anterior, substitua <STORAGE_NAME> por um nome que seja apropriado para você e exclusivo no Armazenamento do Azure. Os nomes devem conter de 3 a 24 caracteres e podem conter somente números e letras minúsculas. Standard_LRS especifica uma conta de uso geral, que é compatível com o Functions.

  1. Criar o aplicativo de funções no Azure:

    az functionapp create --resource-group AzureFunctionsQuickstart-rg --consumption-plan-location <REGION> --runtime dotnet --functions-version 3 --name <APP_NAME> --storage-account <STORAGE_NAME>
    

    O comando az functionapp create cria o aplicativo de funções no Azure.

    Observação

    Este comando cria um aplicativo de funções usando a versão 3.x do Azure Functions Runtime. O comando func azure functionapp publish que você executará posteriormente atualizará o aplicativo para a versão 4.x.

    No exemplo anterior, substitua <STORAGE_NAME> pelo nome da conta usada na etapa anterior e substitua <APP_NAME> por um nome globalmente exclusivo que seja apropriado para você. O <APP_NAME> também é o domínio do DNS padrão para o aplicativo de funções.

    Este comando cria um aplicativo de funções que executa o runtime da linguagem especificada no Plano de Consumo do Azure Functions, que é gratuito para o uso que você fará aqui. O comando também provisiona uma instância associada do Azure Application Insights no mesmo grupo de recursos, com a qual você pode monitorar seu aplicativo de funções e exibir logs. Para saber mais, consulte Monitorar Azure Functions. A instância não gera nenhum custo até você ativá-la.

Implantar o projeto de funções no Azure

Depois de criar com sucesso o aplicativo de funções no Azure, você estará pronto para implantar um projeto local de funções usando o comando func azure functionapp publish.

No exemplo a seguir, substitua <APP_NAME> pelo nome do aplicativo.

func azure functionapp publish <APP_NAME>

O comando de publicação mostra resultados semelhantes à seguinte saída (truncado para fins de simplicidade):

...

Getting site publishing info...
Creating archive for current directory...
Performing remote build for functions project.

...

Deployment successful.
Remote build succeeded!
Syncing triggers...
Functions in msdocs-azurefunctions-qs:
    HttpExample - [httpTrigger]
        Invoke url: https://msdocs-azurefunctions-qs.azurewebsites.net/api/httpexample

Invocar a função no Azure

Como a função usa um gatilho HTTP e dá suporte a solicitações GET, você a invoca fazendo uma solicitação HTTP para sua URL. É mais fácil fazer isso em um navegador.

Copie a URL de Invocação completa mostrada na saída do comando de publicação na barra de endereços de um navegador, acrescentando o parâmetro de consulta ?name=Functions. Quando você navega para essa URL, o navegador deve exibir uma saída semelhante à de quando você executou a função localmente.

Execute o seguinte comando para ver os logs de streaming quase em tempo real:

func azure functionapp logstream <APP_NAME> 

Em uma janela de terminal separada ou no navegador, chame a função remota novamente. Um log detalhado da execução da função no Azure é mostrado no terminal.

Limpar recursos

Se você prosseguir para a próxima etapa e adicionar uma associação de saída da fila do Armazenamento do Azure, mantenha todos os recursos, pois você se baseará no que já fez.

Caso contrário, use o comando a seguir para excluir o grupo de recursos e todos os recursos contidos nele para evitar custos adicionais.

az group delete --name AzureFunctionsQuickstart-rg

Próximas etapas