Compartilhar via


Início Rápido: Criar uma função no Azure a partir da linha de comando

Neste artigo, você usa ferramentas de linha de comando locais para criar uma função que responde a solicitações HTTP. Depois de verificar seu código localmente, você o implanta em um plano de hospedagem de Consumo Flex sem servidor no Azure Functions.

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.

Selecione seu idioma de desenvolvimento preferido na parte superior do artigo.

Prerequisites

Instalação das ferramentas básicas do Azure Functions

A maneira recomendada de instalar o Core Tools depende do sistema operacional do computador de desenvolvimento local.

As etapas a seguir usam um Windows Installer (MSI) para instalar o Core Tools v4.x. Para obter mais informações sobre outros instaladores baseados em pacote, confira o arquivo leiame do Core Tools.

Baixe e execute o instalador do Core Tools, com base em sua versão do Windows:

Se você usou anteriormente o Windows Installer(MSI) para instalar o Core Tools no Windows, desinstale a versão antiga em Adicionar ou Remover Programas antes de instalar a versão mais recente.

Criar e ativar um ambiente virtual

Em uma pasta adequada, execute os comandos a seguir para criar e ativar um ambiente virtual chamado .venv. Use uma das versões do Python com suporte do Azure Functions.

python -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

Você executará todos os comandos posteriores neste ambiente virtual ativado.

Criar um projeto de código local e uma função

No Azure Functions, seu projeto de código é um aplicativo que contém uma ou mais funções individuais que cada uma responde a um gatilho específico. Todas as funções em um projeto compartilham as mesmas configurações e são implantadas como uma unidade no Azure. Nesta seção, você criará um projeto de código que contém uma única função.

  1. Em um terminal ou prompt de comando, execute este func init comando para criar um projeto de aplicativo de funções na pasta atual:

    func init --worker-runtime dotnet-isolated 
    
  1. Em um terminal ou prompt de comando, execute este func init comando para criar um projeto de aplicativo de funções na pasta atual:

    func init --worker-runtime node --language javascript 
    
  1. Em um terminal ou prompt de comando, execute este func init comando para criar um projeto de aplicativo de funções na pasta atual:

    func init --worker-runtime powershell 
    
  1. Em um terminal ou prompt de comando, execute este func init comando para criar um projeto de aplicativo de funções na pasta atual:

    func init --worker-runtime python 
    
  1. Em um terminal ou prompt de comando, execute este func init comando para criar um projeto de aplicativo de funções na pasta atual:

    func init --worker-runtime node --language typescript 
    
  1. Em uma pasta vazia, execute este mvn comando para gerar o projeto de código de um arquétipo maven do Azure Functions:

    mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=17
    

    Important

    • Use -DjavaVersion=11 se desejar que as funções sejam executadas no Java 11. Para saber mais, confira as versões do Java.
    • A variável de ambiente JAVA_HOME precisa ser definida como a localização de instalação da versão correta do JDK para concluir este artigo.
  2. O Maven solicita os valores necessários para concluir a geração do projeto na implantação.
    Forneça os seguintes valores quando solicitado:

    Prompt Value Description
    groupId com.fabrikam Um valor que identifica exclusivamente o projeto em todos os projetos, seguindo as regras de nomenclatura do pacote para Java.
    artifactId fabrikam-functions Um valor que é o nome do jar, sem um número de versão.
    version 1.0-SNAPSHOT Escolha o valor padrão.
    package com.fabrikam Um valor que é o pacote Java para o código de função gerado. Use o padrão.
  3. Digite Y ou pressione Enter para confirmar.

    O Maven cria os arquivos de projeto em uma nova pasta com um nome de artifactId, que neste exemplo é fabrikam-functions.

  4. Navegue até a pasta do projeto:

    cd fabrikam-functions
    

    Você pode examinar o código gerado pelo modelo para sua nova função de gatilho HTTP em Function.java no diretório do projeto \src\main\java\com\fabrikam .

  1. Use este func new comando para adicionar uma função ao seu projeto:

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

    Um novo arquivo de código é adicionado ao seu projeto. Nesse caso, o --name argumento é o nome exclusivo da função (HttpExample) e o --template argumento especifica um gatilho HTTP.

A pasta raiz do projeto contém vários arquivos para o projeto, incluindo arquivos de configurações 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 .

Executar a função localmente

Verifique sua nova função executando o projeto localmente e chamando o endpoint da função.

  1. Use este comando para iniciar o host local do runtime do Azure Functions na raiz da pasta do projeto:

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

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

    Note

    Se o ponto de extremidade HttpExample não aparece conforme o esperado, você pode ter iniciado o host de 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 e navegue até ela para receber uma resposta de sucesso com uma mensagem "olá, mundo".

  3. Quando terminar, 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 implantar seu código de função no Azure, você precisa criar esses recursos:

  • Um grupo de recursos, que é um contêiner lógico para recursos relacionados.
  • Uma conta de Armazenamento padrão, que é usada pelo host do Functions para manter o estado e outras informações sobre suas funções.
  • Uma identidade gerenciada atribuída pelo usuário, que o host do Functions usa para se conectar à conta de armazenamento padrão.
  • 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 da CLI do Azure nestas etapas para criar os recursos necessários.

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

    az login
    

    O comando az login conecta você à sua conta do Azure. Ignore esta etapa ao executar no Azure Cloud Shell.

  2. Se você ainda não fez isso, use este az extension add comando para instalar a extensão do Application Insights:

    az extension add --name application-insights
    
  3. Use este comando az group create para criar um grupo de recursos nomeado AzureFunctionsQuickstart-rg na região escolhida:

    az group create --name "AzureFunctionsQuickstart-rg" --___location "<REGION>"
    

    Neste exemplo, substitua <REGION> por uma região próxima a você que dê suporte ao plano de consumo flex. Use o comando az functionapp list-flexconsumption-locations para exibir a lista de regiões com suporte no momento.

  4. Use este comando de criação de conta de armazenamento az para criar uma conta de armazenamento de uso geral em seu grupo de recursos e região:

    az storage account create --name <STORAGE_NAME> --___location "<REGION>" --resource-group "AzureFunctionsQuickstart-rg" \
    --sku "Standard_LRS" --allow-blob-public-access false --allow-shared-key-access false
    

    Neste exemplo, substitua <STORAGE_NAME> por um nome 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. Essa nova conta só pode ser acessada usando identidades autenticadas do Microsoft Entra que receberam permissões para recursos específicos.

  5. Use esse script para criar uma identidade gerenciada atribuída pelo usuário, analisar as propriedades JSON retornadas do objeto usando jqe conceder Storage Blob Data Owner permissões na conta de armazenamento padrão:

    output=$(az identity create --name "func-host-storage-user" --resource-group "AzureFunctionsQuickstart-rg" --___location <REGION> \
    --query "{userId:id, principalId: principalId, clientId: clientId}" -o json)
    
    userId=$(echo $output | jq -r '.userId')
    principalId=$(echo $output | jq -r '.principalId')
    clientId=$(echo $output | jq -r '.clientId')
    
    storageId=$(az storage account show --resource-group "AzureFunctionsQuickstart-rg" --name <STORAGE_NAME> --query 'id' -o tsv)
    az role assignment create --assignee-object-id $principalId --assignee-principal-type ServicePrincipal \
    --role "Storage Blob Data Owner" --scope $storageId
    

    Se você não tiver o jq utilitário no shell do Bash local, ele estará disponível no Azure Cloud Shell. Neste exemplo, substitua <STORAGE_NAME> e <REGION> pela região e o nome da conta de armazenamento padrão, respectivamente.

    O comando az identity create cria uma identidade chamada func-host-storage-user. O retornado principalId é usado para atribuir permissões a essa nova identidade na conta de armazenamento padrão usando o az role assignment create comando. O az storage account show comando é usado para obter a ID da conta de armazenamento.

  6. Use este comando az functionapp create para criar o aplicativo de funções no Azure:

    az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-___location <REGION> \
    --runtime dotnet-isolated --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \
    --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"
    
    az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-___location <REGION> \
    --runtime java --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \
    --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"
    
    az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-___location <REGION> \
    --runtime node --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \
    --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"
    
    az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-___location <REGION> \
    --runtime python --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \
    --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"
    
    az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-___location <REGION> \
    --runtime python --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \
    --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"
    

    Neste exemplo, substitua esses espaços reservados pelos valores apropriados:

    • <APP_NAME>: um nome globalmente exclusivo apropriado para você. O <APP_NAME> também é o domínio do DNS padrão para o aplicativo de funções.
    • <STORAGE_NAME>: o nome da conta usada na etapa anterior.
    • <REGION>: sua região atual.
    • <LANGUAGE_VERSION>: use a mesma versão de pilha de idiomas aceita que você verificou localmente.

    Esse comando cria um aplicativo de função que é executado na linguagem runtime especificada no Linux no Plano de Consumo Flex, que é gratuito para a quantidade de uso que você realiza aqui. O comando também cria uma instância associada do Azure Application Insights no mesmo grupo de recursos, com a qual você pode usar para monitorar as execuções do 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.

  7. Use esse script para adicionar sua identidade gerenciada atribuída pelo usuário à função Editor de Métricas de Monitoramento na instância do Application Insights:

    appInsights=$(az monitor app-insights component show --resource-group "AzureFunctionsQuickstart-rg" \
        --app <APP_NAME> --query "id" --output tsv)
    principalId=$(az identity show --name "func-host-storage-user" --resource-group "AzureFunctionsQuickstart-rg" \
        --query principalId -o tsv)
    az role assignment create --role "Monitoring Metrics Publisher" --assignee $principalId --scope $appInsights
    

    Neste exemplo, substitua <APP_NAME> pelo nome de seu aplicativo de funções. O comando az role assignment create adiciona o usuário à função. Para ter acesso à ID do recurso da instância do Application Insights e à ID da entidade de segurança do usuário, use os comandos az monitor app-insights component show e az identity show, respectivamente.

Atualizar as configurações do aplicativo

Para permitir que o host do Functions se conecte à conta de armazenamento padrão usando segredos compartilhados, substitua a configuração da cadeia de conexão AzureWebJobsStorage por várias configurações com o prefixo AzureWebJobsStorage__. Essas configurações definem uma configuração complexa que seu aplicativo usa para se conectar ao armazenamento e ao Application Insights com uma identidade gerenciada atribuída pelo usuário.

  1. Use esse script para obter a ID do cliente da identidade gerenciada atribuída pelo usuário e usá-la para definir conexões de identidade gerenciada para o armazenamento e o Application Insights:

    clientId=$(az identity show --name func-host-storage-user \
        --resource-group AzureFunctionsQuickstart-rg --query 'clientId' -o tsv)
    az functionapp config appsettings set --name <APP_NAME> --resource-group "AzureFunctionsQuickstart-rg" \
        --settings AzureWebJobsStorage__accountName=<STORAGE_NAME> \
        AzureWebJobsStorage__credential=managedidentity AzureWebJobsStorage__clientId=$clientId \
        APPLICATIONINSIGHTS_AUTHENTICATION_STRING="ClientId=$clientId;Authorization=AAD"
    

    Nesse script, substitua <APP_NAME> e <STORAGE_NAME> pelos nomes do aplicativo de funções e da conta de armazenamento, respectivamente.

  2. Execute o comando az functionapp config appsettings delete para remover a configuração de cadeia de conexão existente AzureWebJobsStorage , que contém uma chave secreta compartilhada:

    az functionapp config appsettings delete --name <APP_NAME> --resource-group "AzureFunctionsQuickstart-rg" --setting-names AzureWebJobsStorage
    

    Neste exemplo, substitua <APP_NAME> pelos nomes do aplicativo de funções.

Neste ponto, o host do Functions é capaz de se conectar à conta de armazenamento com segurança usando identidades gerenciadas em vez de segredos compartilhados. Agora você pode implantar o código do projeto nos recursos do Azure.

Implantar o projeto de funções no Azure

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

Na pasta raiz do projeto, execute esse comando func azure functionapp publish:

func azure functionapp publish <APP_NAME>

Nesse exemplo, substitua <APP_NAME> pelo nome de seu aplicativo. Uma implantação bem-sucedida mostra resultados semelhantes à seguinte saída (truncada para simplificar):

...

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

Atualizar o arquivo pom.xml

Depois de criar com êxito seu aplicativo de funções no Azure, você deve atualizar o arquivo pom.xml para que o Maven possa implantar em seu novo aplicativo. Caso contrário, ele criará um novo conjunto de recursos do Azure durante a implantação.

  1. No Azure Cloud Shell, use este az functionapp show comando para obter a URL e a ID do contêiner de implantação da nova identidade gerenciada atribuída pelo usuário:

    az functionapp show --name <APP_NAME> --resource-group AzureFunctionsQuickstart-rg  \
        --query "{userAssignedIdentityResourceId: properties.functionAppConfig.deployment.storage.authentication.userAssignedIdentityResourceId, \
        containerUrl: properties.functionAppConfig.deployment.storage.value}"
    

    Neste exemplo, substitua <APP_NAME> pelos nomes do aplicativo de funções.

  2. No diretório raiz do projeto, abra o arquivo pom.xml em um editor de texto, localize o properties elemento e faça atualizações para estes valores de propriedade específicos:

    Nome da propriedade Value
    java.version Use a mesma versão de stack de idiomas suportada que você verificou localmente, como 17.
    azure.functions.maven.plugin.version 1.37.1
    azure.functions.java.library.version 3.1.0
    functionAppName O nome do aplicativo de funções no Azure.
  3. Encontre a seção configuration do azure-functions-maven-plugin e substitua-a por este fragmento XML:

    <configuration>
        <appName>${functionAppName}</appName>
        <resourceGroup>AzureFunctionsQuickstart-rg</resourceGroup>
        <pricingTier>Flex Consumption</pricingTier>
        <region>....</region>
        <runtime>
            <os>linux</os>
            <javaVersion>${java.version}</javaVersion>
        </runtime>
        <deploymentStorageAccount>...</deploymentStorageAccount>
        <deploymentStorageResourceGroup>AzureFunctionsQuickstart-rg</deploymentStorageResourceGroup>
        <deploymentStorageContainer>...</deploymentStorageContainer>
        <storageAuthenticationMethod>UserAssignedIdentity</storageAuthenticationMethod>
        <userAssignedIdentityResourceId>...</userAssignedIdentityResourceId>
        <appSettings>
            <property>
                <name>FUNCTIONS_EXTENSION_VERSION</name>
                <value>~4</value>
            </property>
        </appSettings>
    </configuration>
    
  4. No novo elemento configuration, faça essas substituições específicas dos valores de reticências (...):

    Configuration Value
    region O código de região do aplicativo de funções existente, como eastus.
    deploymentStorageAccount O nome da sua conta de armazenamento.
    deploymentStorageContainer O nome do compartilhamento de implantação, que vem após \ no valor containerUrl acessado.
    userAssignedIdentityResourceId A ID de recurso totalmente qualificada da identidade gerenciada, a que você teve acesso.
  5. Salve suas alterações no arquivo pom.xml .

Agora você pode usar o Maven para implantar seu projeto de código em seu aplicativo existente.

Implantar o projeto de funções no Azure

  1. No prompt de comando, execute este comando:

    mvn clean package azure-functions:deploy
    
  2. Depois da implantação, use az functionapp function show para ter acesso à URL do ponto de extremidade da função remota HttpExample:

    az functionapp function show --name <APP_NAME> --resource-group "AzureFunctionsQuickstart-rg" \
        --function-name HttpExample --query invokeUrlTemplate -o tsv
    

    Neste exemplo, substitua <APP_NAME> pelos nomes do aplicativo de funções.

  3. Copie a URL do ponto de extremidade retornado, que você usará em seguida para invocar o ponto de extremidade da função.

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 executar uma solicitação GET 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.

Cole a URL copiada em uma barra de endereços do navegador.

A URL do ponto de extremidade deve ser parecida com o seguinte:

https://contoso-app.azurewebsites.net/api/httpexample

Quando você navega para essa URL, o navegador deve exibir uma saída semelhante à de quando você executou a função localmente.

Limpar os 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