Início Rápido: Criar e implantar funções no Azure Functions usando o Azure Developer CLI

Neste Início Rápido, você usará ferramentas de linha de comando do Desenvolvedor do Azure para criar funções que respondem a solicitações HTTP. Após testar o código localmente, você o implantará em um novo aplicativo de funções sem servidor que você cria e executa em um plano de Consumo Flex no Azure Functions.

O código-fonte do projeto usa o Azure Developer CLI (azd) para simplificar a implantação do seu código no Azure. Esta implantação segue as melhores práticas atuais para implantações seguras e escaláveis do Azure Functions.

Importante

O plano de Consumo Flex está atualmente em versão preliminar.

Por padrão, o plano de Consumo Flex segue um modelo de cobrança pague pelo que você usar, o que significa que concluir esse início rápido incorre em um pequeno custo de alguns centavos de dólar ou menos na sua conta do Azure.

Pré-requisitos

Inicializar o projeto

Você pode usar o azd init comando para criar um projeto de código do Azure Functions local a partir de um modelo.

  1. No seu terminal ou prompt de comando local, execute esse azd init comando em uma pasta vazia:

    azd init --template functions-quickstart-dotnet-azd -e flexquickstart-dotnet
    

    Esse comando extrai os arquivos de projeto do repositório de modelos e inicializa o projeto na pasta atual. O sinalizador -e define um nome para o ambiente atual. Em azd, o ambiente é utilizado para manter um contexto de implantação único para o seu aplicativo e você pode definir mais de um. Ele também é utilizado no nome do grupo de recursos que você cria no Azure.

  2. Execute esse comando para navegar até a pasta do http aplicativo:

    cd http
    
  3. Crie um arquivo chamado local.settings.json na pasta http que contenha esses dados JSON:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
        }
    }
    

    Este arquivo é necessário ao executar localmente.

  1. No seu terminal ou prompt de comando local, execute esse azd init comando em uma pasta vazia:

    azd init --template azure-functions-java-flex-consumption-azd -e flexquickstart-java 
    

    Esse comando extrai os arquivos de projeto do repositório de modelos e inicializa o projeto na pasta atual. O sinalizador -e define um nome para o ambiente atual. Em azd, o ambiente é utilizado para manter um contexto de implantação único para o seu aplicativo e você pode definir mais de um. Ele também é utilizado no nome do grupo de recursos que você cria no Azure.

  2. Execute esse comando para navegar até a pasta do http aplicativo:

    cd http
    
  3. Crie um arquivo chamado local.settings.json na pasta http que contenha esses dados JSON:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "java"
        }
    }
    

    Este arquivo é necessário ao executar localmente.

  1. No seu terminal ou prompt de comando local, execute esse azd init comando em uma pasta vazia:

    azd init --template functions-quickstart-javascript-azd -e flexquickstart-js
    

    Esse comando extrai os arquivos de projeto do repositório de modelos e inicializa o projeto na pasta raiz. O sinalizador -e define um nome para o ambiente atual. Em azd, o ambiente é utilizado para manter um contexto de implantação único para o seu aplicativo e você pode definir mais de um. Ele também é utilizado no nome do grupo de recursos que você cria no Azure.

  2. Crie um arquivo chamado local.settings.json na pasta raiz que contenha estes dados JSON:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "node"
        }
    }
    

    Este arquivo é necessário ao executar localmente.

  1. No seu terminal ou prompt de comando local, execute esse azd init comando em uma pasta vazia:

    azd init --template functions-quickstart-powershell-azd -e flexquickstart-ps
    

    Esse comando extrai os arquivos de projeto do repositório de modelos e inicializa o projeto na pasta raiz. O sinalizador -e define um nome para o ambiente atual. Em azd, o ambiente é utilizado para manter um contexto de implantação único para o seu aplicativo e você pode definir mais de um. Ele também é utilizado no nome do grupo de recursos que você cria no Azure.

  2. Execute esse comando para navegar até a pasta do src aplicativo:

    cd src
    
  3. Crie um arquivo chamado local.settings.json na pasta src que contenha esses dados JSON:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "powershell",
            "FUNCTIONS_WORKER_RUNTIME_VERSION": "7.2"
        }
    }
    

    Este arquivo é necessário ao executar localmente.

  1. No seu terminal ou prompt de comando local, execute esse azd init comando em uma pasta vazia:

    azd init --template functions-quickstart-typescript-azd -e flexquickstart-ts
    

    Esse comando extrai os arquivos de projeto do repositório de modelos e inicializa o projeto na pasta raiz. O sinalizador -e define um nome para o ambiente atual. Em azd, o ambiente é utilizado para manter um contexto de implantação único para o seu aplicativo e você pode definir mais de um. Ele também é utilizado no nome do grupo de recursos que você cria no Azure.

  2. Crie um arquivo chamado local.settings.json na pasta raiz que contenha estes dados JSON:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "node"
        }
    }
    

    Este arquivo é necessário ao executar localmente.

  1. No seu terminal ou prompt de comando local, execute esse azd init comando em uma pasta vazia:

    azd init --template functions-quickstart-python-http-azd -e flexquickstart-py
    

    Esse comando extrai os arquivos de projeto do repositório de modelos e inicializa o projeto na pasta raiz. O sinalizador -e define um nome para o ambiente atual. Em azd, o ambiente é utilizado para manter um contexto de implantação único para o seu aplicativo e você pode definir mais de um. Ele também é utilizado no nome do grupo de recursos que você cria no Azure.

  2. Crie um arquivo chamado local.settings.json na pasta raiz que contenha estes dados JSON:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "python"
        }
    }
    

    Este arquivo é necessário ao executar localmente.

Criar e ativar um ambiente virtual

Na pasta raiz, execute estes comandos para criar e ativar um ambiente virtual chamado .venv:

python3 -m venv .venv
source .venv/bin/activate

Se o Python não instalou o pacote venv na distribuição do Linux, execute o seguinte comando:

sudo apt-get install python3-venv

Executar no seu ambiente local

  1. Execute este comando da pasta do seu aplicativo em um terminal ou prompt de comando:

    func start
    
    mvn clean package
    mvn azure-functions:run
    
    npm install
    func start  
    
    npm install
    npm start  
    

    Quando o host do Functions é iniciado na pasta do projeto local, ele grava os pontos de extremidade de URL das funções disparadas por HTTP na saída do terminal.

  2. No seu navegador, navegue até o ponto de extremidade do httpget, que deve se parecer com esta URL:

    http://localhost:7071/api/httpget

  3. De um novo terminal ou janela de prompt de comando, execute este comando curl para enviar uma solicitação POST com um payload JSON para o ponto de extremidade httppost:

    curl -i http://localhost:7071/api/httppost -H "Content-Type: text/json" -d @testdata.json
    
    curl -i http://localhost:7071/api/httppost -H "Content-Type: text/json" -d "@src/functions/testdata.json"
    

    Este comando lê os dados do payload JSON a partir do arquivo de projeto testdata.json. Você pode encontrar exemplos de ambas as solicitações HTTP no arquivo de projeto test.http.

  4. Quando terminar, pressione Ctrl+C na janela do terminal para interromper o processo do host func.exe.

  1. Execute deactivate para desligar o ambiente virtual.

Examinar o código (opcional)

Você pode revisar o código que define os dois pontos de extremidade da função de gatilho HTTP:

       [Function("httpget")]
       public IActionResult Run([HttpTrigger(AuthorizationLevel.Function, "get")]
         HttpRequest req,
         string name)
       {
           var returnValue = string.IsNullOrEmpty(name)
               ? "Hello, World."
               : $"Hello, {name}.";

           _logger.LogInformation($"C# HTTP trigger function processed a request for {returnValue}.");

           return new OkObjectResult(returnValue);
       }
@FunctionName("httpget")
public HttpResponseMessage run(
        @HttpTrigger(
            name = "req",
            methods = {HttpMethod.GET},
            authLevel = AuthorizationLevel.FUNCTION)
            HttpRequestMessage<Optional<String>> request,
        final ExecutionContext context) {
    context.getLogger().info("Java HTTP trigger processed a request.");

    // Parse query parameter
    String name = Optional.ofNullable(request.getQueryParameters().get("name")).orElse("World");

    return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
}
const { app } = require('@azure/functions');

app.http('httpget', {
    methods: ['GET'],
    authLevel: 'function',
    handler: async (request, context) => {
        context.log(`Http function processed request for url "${request.url}"`);

        const name = request.query.get('name') || await request.text() || 'world';

        return { body: `Hello, ${name}!` };
    }
});
import { app, HttpRequest, HttpResponseInit, InvocationContext } from "@azure/functions";

export async function httpGetFunction(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    context.log(`Http function processed request for url "${request.url}"`);

    const name = request.query.get('name') || await request.text() || 'world';

    return { body: `Hello, ${name}!` };
};

app.http('httpget', {
    methods: ['GET'],
    authLevel: 'function',
    handler: httpGetFunction
});

Este arquivo function.json define a função httpget:

{
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "Request",
      "methods": [
        "get"
      ],
      "route": "httpget"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "Response"
    }
  ]
}

Este arquivo run.ps1 implementa o código da função:

using namespace System.Net

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."

# Interact with query parameters
$name = $Request.Query.name

$body = "This HTTP triggered function executed successfully. Pass a name in the query string for a personalized response."

if ($name) {
    $body = "Hello, $name. This HTTP triggered function executed successfully."
}

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body = $body
})
@app.route(route="httpget", methods=["GET"])
def http_get(req: func.HttpRequest) -> func.HttpResponse:
    name = req.params.get("name", "World")

    logging.info(f"Processing GET request. Name: {name}")

    return func.HttpResponse(f"Hello, {name}!")

Você pode examinar o projeto de modelo completo aqui.

Você pode examinar o projeto de modelo completo aqui.

Você pode examinar o projeto de modelo completo aqui.

Você pode examinar o projeto de modelo completo aqui.

Você pode examinar o projeto de modelo completo aqui.

Você pode examinar o projeto de modelo completo aqui.

Depois de verificar suas funções localmente, é hora de publicá-las no Azure.

Criar recursos do Azure

Este projeto está configurado para usar o comando azd provision para criar um aplicativo de funções em um plano de Consumo Flex, junto com outros recursos necessários do Azure.

Observação

Este projeto inclui um conjunto de arquivos Bicep que azd usa para criar uma implantação segura em um plano de Consumo Flex que segue as melhores práticas.

No momento, não há suporte para os comandos azd up e azd deploy em aplicativos Java.

  1. Na pasta raiz do projeto, execute este comando para criar os recursos necessários do Azure:

    azd provision
    

    A pasta raiz contém o arquivo de definição azure.yaml necessário para azd.

    Se você ainda não estiver conectado, será solicitado que autentique com sua conta do Azure.

  2. Quando solicitado, forneça esses parâmetros de implantação obrigatórios:

    Parâmetro Descrição
    Assinatura do Azure Assinatura na qual seus recursos serão criados.
    Localização do Azure Região do Azure na qual criar o grupo de recursos que contém os novos recursos do Azure. Somente regiões que atualmente dão suporte para o plano de Consumo Flex são mostradas.

    O comando azd provision usa sua resposta a esses prompts com os arquivos de configuração do Bicep para criar e configurar esses recursos do Azure necessários:

    • plano de Consumo Flex e aplicativo de funções
    • Armazenamento do Microsoft Azure (obrigatório) e Application Insights (recomendado)
    • Políticas de acesso e funções para sua conta
    • Conexões de serviço a serviço usando identidades gerenciadas (em vez de cadeias de conexão armazenadas)
    • Rede virtual para executar com segurança tanto o aplicativo de funções quanto os outros recursos do Azure

    Após o comando ser concluído com sucesso, você pode implantar seu código de projeto neste novo aplicativo de funções no Azure.

Implantar no Azure

Você pode usar o Core Tools para empacotar seu código e implantá-lo no Azure a partir da pasta de saída target.

  1. Navegue até a pasta equivalente ao aplicativo na pasta de saída target:

    cd http/target/azure-functions/contoso-functions
    

    Esta pasta deve ter um arquivo host.json, que indica que é a raiz do seu aplicativo de funções Java compilado.

  2. Execute estes comandos para implantar seu projeto de código Java compilado no novo recurso de aplicativo de funções no Azure usando o Core Tools:

    APP_NAME=$(azd env get-value AZURE_FUNCTION_NAME)
    func azure functionapp publish $APP_NAME
    

    O comando azd env get-value obtém o nome do seu aplicativo de funções a partir do ambiente local, o que é necessário para a implantação usando func azure functionapp publish. Após a publicação ser concluída com sucesso, você verá links para os ponto de extremidades de gatilho HTTP no Azure.

Implantar no Azure

Este projeto está configurado para usar o comando azd up para implantar este projeto em um novo aplicativo de funções em um plano de Consumo Flex no Azure.

Dica

Este projeto inclui um conjunto de arquivos Bicep que azd usa para criar uma implantação segura em um plano de Consumo Flex que segue as melhores práticas.

  1. Execute este comando para que azd crie os recursos necessários do Azure no Azure e implante seu projeto de código no novo aplicativo de funções:

    azd up
    

    A pasta raiz contém o arquivo de definição azure.yaml necessário para azd.

    Se você ainda não estiver conectado, será solicitado que autentique com sua conta do Azure.

  2. Quando solicitado, forneça esses parâmetros de implantação obrigatórios:

    Parâmetro Descrição
    Assinatura do Azure Assinatura na qual seus recursos serão criados.
    Localização do Azure Região do Azure na qual criar o grupo de recursos que contém os novos recursos do Azure. Somente regiões que atualmente dão suporte para o plano de Consumo Flex são mostradas.

    O comando azd up usa sua resposta a esses prompts com os arquivos de configuração Bicep para concluir estas tarefas de implantação:

    • Criar e configurar esses recursos do Azure necessários (equivalente a azd provision):

      • plano de Consumo Flex e aplicativo de funções
      • Armazenamento do Microsoft Azure (obrigatório) e Application Insights (recomendado)
      • Políticas de acesso e funções para sua conta
      • Conexões de serviço a serviço usando identidades gerenciadas (em vez de cadeias de conexão armazenadas)
      • Rede virtual para executar com segurança tanto o aplicativo de funções quanto os outros recursos do Azure
    • Empacotar e implantar seu código para o contêiner de implantação (equivalente a azd deploy). O aplicativo é então iniciado e executa no pacote implantado.

    Após o comando ser concluído com sucesso, você verá links para os recursos que criou.

Invocar a função no Azure

Você agora pode invocar seus ponto de extremidades de função no Azure fazendo solicitações HTTP para suas URLs usando sua ferramenta de teste HTTP ou pelo navegador (para solicitações GET). Quando suas funções forem executadas no Azure, a autorização por chave de acesso será aplicada e você deverá fornecer uma chave de acesso da função com sua solicitação.

Você pode usar o Core Tools para obter os ponto de extremidades de URL das suas funções executando no Azure.

  1. No seu terminal ou prompt de comando local, execute estes comandos para obter os valores dos ponto de extremidades de URL:

    SET APP_NAME=(azd env get-value AZURE_FUNCTION_NAME)
    func azure functionapp list-functions $APP_NAME --show-keys
    
    $APP_NAME = azd env get-value AZURE_FUNCTION_NAME
    func azure functionapp list-functions $APP_NAME --show-keys
    

    O comando azd env get-value obtém o nome do seu aplicativo de funções do ambiente local. Usar a opção --show-keys com func azure functionapp list-functions significa que o valor URL de Invocação: retornado para cada ponto de extremidade inclui uma chave de acesso no nível da função.

  2. Como antes, use sua ferramenta de teste HTTP para validar essas URLs no seu aplicativo de funções executando no Azure.

Reimplantar seu código

Você pode executar o comando azd up quantas vezes for necessário para provisionar seus recursos do Azure e implantar atualizações de código no seu aplicativo de funções.

Observação

Os arquivos de código implantados são sempre sobrescritos pelo pacote de implantação mais recente.

Suas respostas iniciais aos prompts azd e quaisquer variáveis de ambiente geradas por azd são armazenadas localmente no seu ambiente nomeado. Use o comando azd env get-values para revisar todas as variáveis no seu ambiente que foram usadas ao criar recursos do Azure.

Limpar os recursos

Quando terminar de trabalhar com seu aplicativo de funções e recursos relacionados, você pode utilizar este comando para excluir o aplicativo de funções e seus recursos relacionados do Azure e evitar custos adicionais:

azd down --no-prompt

Observação

A opção --no-prompt instrui azd a excluir seu grupo de recursos sem uma confirmação sua.

Este comando não afeta seu projeto de código local.