Criar seu primeiro Azure Functions em contêineres

Neste artigo, você cria um aplicativo de funções em execução em um contêiner do Linux e o implanta no Azure Functions.

Para implantar seu código de função em um contêiner do Azure Functions, você precisa ter a hospedagem em um Plano Premium ou em um Plano dedicado (Serviço de Aplicativo). A conclusão desse artigo gera custos de alguns dólares dos EUA em sua conta do Azure, que você pode minimizar limpando os recursos quando terminar.

Outras opções para implantar o contêiner do aplicativo de funções no Azure incluem:

Escolha a linguagem de desenvolvimento

Primeiro, você usa as ferramentas do Azure Functions para criar o código do projeto como um aplicativo de funções em um contêiner do Docker usando uma imagem base do Linux específica da linguagem. Selecione o idioma de sua escolha na parte superior do artigo.

O Core Tools gera automaticamente um Dockerfile para seu projeto que usa a versão mais atualizada da imagem base correta para a linguagem das suas funções. Você deve atualizar regularmente o contêiner a partir da imagem base mais recente e reimplantar a partir da versão atualizada do contêiner. Para mais informações, consulte Criação de aplicativos de funções em contêineres.

Pré-requisitos

Antes de começar, você precisa ter os seguintes requisitos em vigor:

Caso você não tenha uma assinatura do Azure, crie uma conta gratuita do Azure antes de começar.

Para publicar a imagem do aplicativo de funções em contêineres que você cria em um registro de contêiner, você precisa de uma ID do Docker e do Docker em execução no computador local. Se você não tiver uma ID do Docker, crie uma conta do Docker.

Você também precisa concluir a seção Criar um registro de contêiner do início rápido do Registro de Contêiner para criar uma instância do registro. Anote o nome do servidor de logon totalmente qualificado.

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 no 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 e testar o projeto de funções local

Em um terminal ou prompt de comando, execute o comando a seguir referente à linguagem escolhida para criar um projeto de aplicativo de funções na pasta atual:

func init --worker-runtime dotnet-isolated --docker
func init --worker-runtime node --language javascript --docker
func init --worker-runtime powershell --docker
func init --worker-runtime python --docker
func init --worker-runtime node --language typescript --docker

Em uma pasta vazia, execute o seguinte comando para gerar o projeto do Functions com base em um arquétipo Maven:

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

O parâmetro -DjavaVersion informa ao runtime do Functions a versão do Java a ser usada. Use -DjavaVersion=11 se desejar que as funções sejam executadas no Java 11. Quando você não especifica -DjavaVersion, o Maven assume o Java 8 como padrão. Para obter mais informações, confira Versões do Java.

Importante

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.

O Maven solicita os valores necessários para concluir a geração do projeto na implantação. Siga os avisos e forneça as seguintes informações:

Prompt Valor Descrição
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 Selecione o valor padrão.
package com.fabrikam.functions Um valor que é o pacote Java para o código de função gerado. Use o padrão.

Digite Y ou pressione Enter para confirmar.

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

A opção --docker gera um Dockerfile para o projeto, que define um contêiner adequado para uso com o Azure Functions e com o runtime selecionado.

Navegue até a pasta do projeto:

cd fabrikam-functions

Use o comando a seguir para adicionar uma função ao projeto, em que o argumento --name é o nome exclusivo da função e o argumento --template especifica o gatilho da função. func new cria um arquivo de código C# em seu projeto.

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

Use o comando a seguir para adicionar uma função ao projeto, em que o argumento --name é o nome exclusivo da função e o argumento --template especifica o gatilho da função. func new cria uma subpasta correspondente ao nome da função que contém um arquivo de configuração chamado func new.

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

Para testar a função localmente, inicie o host de runtime do Azure Functions local na raiz da pasta do projeto.

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

Após ver o ponto de extremidade HttpExample gravado na saída, navegue até este ponto de extremidade. Você deverá ver uma mensagem de boas-vindas na saída da resposta.

Após ver o ponto de extremidade HttpExample gravado na saída, navegue até http://localhost:7071/api/HttpExample?name=Functions. O navegador deve exibir uma mensagem "olá" que ecoa de volta Functions, o valor fornecido para o parâmetro de consulta name.

Pressione Ctrl+C (Command+C no macOS) para interromper o host.

Compilar a imagem de contêiner e verificá-la localmente

(Opcional) Examine o Dockerfile na raiz da pasta do projeto. O Dockerfile descreve o ambiente necessário para executar o aplicativo de funções no Linux. A lista completa de imagens base com suporte para Azure Functions encontram-se na página de imagens de base do Azure Functions.

Na pasta do projeto raiz, execute o comando docker build e forneça um nome, como azurefunctionsimage, e uma marca, como v1.0.0. Substitua <DOCKER_ID> pela ID da conta do Hub do Docker. Esse comando compila a imagem do Docker para o contêiner.

docker build --tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 .

Quando o comando for concluído, você poderá executar o novo contêiner localmente.

Para verificar o build, execute a imagem em um contêiner local usando o comando docker run, substitua <DOCKER_ID> novamente pela ID da conta do Docker Hub e adicione o argumento de portas como -p 8080:80:

docker run -p 8080:80 -it <DOCKER_ID>/azurefunctionsimage:v1.0.0

Quando a imagem iniciar no contêiner local, navegue até http://localhost:8080/api/HttpExample, que deverá exibir a mesma mensagem de saudação anterior. Como a função disparada por HTTP que você criou usa autorização anônima, você ainda pode chamar a função em execução no contêiner sem ter que obter uma chave de acesso. Para obter mais informações, confira chaves de autorização.

Quando a imagem iniciar no contêiner local, navegue até http://localhost:8080/api/HttpExample?name=Functions, que deverá exibir a mesma mensagem "olá" que anteriormente. Como a função disparada por HTTP que você criou usa autorização anônima, você ainda pode chamar a função em execução no contêiner sem ter que obter uma chave de acesso. Para obter mais informações, confira chaves de autorização.

Depois de verificar o aplicativo de funções no contêiner, pressione Ctrl+C (Command+C no macOS) para interromper a execução.

Publicar a imagem de contêiner em um registro

Para disponibilizar sua imagem de contêiner para implantação em um ambiente de hospedagem, efetue o push dela para um registro de contêiner.

O Registro de Contêiner do Azure é um serviço de registro privado para gerar, armazenar e fornecer imagens de contêiner e artefatos relacionados. Você deve usar um serviço de registro privado para publicar seus contêineres nos serviços do Azure.

  1. Use este comando para entrar na instância do Registro usando suas credenciais atuais do Azure:

    az acr login --name <REGISTRY_NAME>
    

    No comando anterior, substitua <REGISTRY_NAME> pelo nome da instância do Registro de Contêiner.

  2. Use o seguinte comando para marcar sua imagem com o nome totalmente qualificado do servidor de logon do registro:

    docker tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 
    

    Substitua <LOGIN_SERVER> pelo nome totalmente qualificado do servidor de logon do registro e <DOCKER_ID> pela ID do Docker.

  3. Use este comando para enviar o contêiner por push para a instância do registro:

    docker push <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
    

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

Para implantar o contêiner 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. Para criar seus recursos do Azure usando Azure PowerShell, você também precisa do módulo Az PowerShell, versão 5.9.0 ou posterior.

  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 AzureFunctionsContainers-rg na região de sua escolha.

    az group create --name AzureFunctionsContainers-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 <REGION>.

  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 AzureFunctionsContainers-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 de armazenamento precisam conter de três a 24 caracteres e só podem conter números e letras minúsculas. Standard_LRS especifica uma conta de uso geral, compatível com o Functions.

  4. Use o comando para criar um plano Premium do Azure Functions chamado myPremiumPlan, com o tipo de preço myPremiumPlan (--sku EP1), na sua <REGION> e em um contêiner Linux (--is-linux).

    az functionapp plan create --resource-group AzureFunctionsContainers-rg --name myPremiumPlan --location <REGION> --number-of-workers 1 --sku EP1 --is-linux
    

    Aqui, usamos o plano Premium, que pode ser dimensionado conforme necessário. Para obter mais informações sobre hospedagem, confira Comparação de planos de hospedagem do Azure Functions. Para obter mais informações sobre como calcular custos, confira a página de preço do Functions.

    O comando também cria uma instância associada do Azure Application Insights no mesmo grupo de recursos, com o qual será possível monitorar o aplicativo de funções e exibir os logs. Para saber mais, consulte Monitorar Azure Functions. A instância não gera nenhum custo até você ativá-la.

Criar e configurar um aplicativo de funções no Azure usando a imagem

Um aplicativo de funções no Azure gerencia a execução das funções em seu plano de hospedagem do Azure Functions. Nesta seção, você usa os recursos do Azure da seção anterior para criar um aplicativo de funções baseado em uma imagem em um registro de contêiner e configurá-lo com uma cadeia de conexão para o Armazenamento do Azure.

  1. Crie um aplicativo de funções usando o seguinte comando, dependendo do registro de contêiner:

    az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --resource-group AzureFunctionsContainers-rg --plan myPremiumPlan --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --registry-username <USERNAME> --registry-password <SECURE_PASSWORD> 
    

    Neste exemplo, substitua <STORAGE_NAME> pelo nome usado na seção anterior para a conta de armazenamento. Além disso, substitua <APP_NAME> por um nome globalmente exclusivo apropriado para você e <DOCKER_ID> ou <LOGIN_SERVER> com sua ID de conta do Docker Hub ou servidor de Registro de Contêiner, respectivamente. Ao implantar de um registro de contêiner personalizado, o nome da imagem indica o URL do registro.

    Quando você cria o aplicativo de funções pela primeira vez, ele efetua pull da imagem inicial do Docker Hub. Você também pode Habilitar a implantação contínua no Azure pelo seu registro de contêiner.

    Dica

    Você pode usar a configuração DisableColor no arquivo host.json para impedir que os caracteres de controle ANSI sejam gravados nos logs de contêiner.

  2. Use o seguinte comando para obter a cadeia de conexão para a conta de armazenamento que você criou:

    az storage account show-connection-string --resource-group AzureFunctionsContainers-rg --name <STORAGE_NAME> --query connectionString --output tsv
    

    A cadeia de conexão da conta de armazenamento é retornada usando o comando az storage account show-connection-string.

    Substitua <STORAGE_NAME> pelo nome da conta de armazenamento que você criou anteriormente.

  3. Use o seguinte comando para adicionar a configuração ao aplicativo de funções:

    az functionapp config appsettings set --name <APP_NAME> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage=<CONNECTION_STRING>
    

    O comando az functionapp config appsettings set cria a configuração.

    Neste comando, substitua <APP_NAME> pelo nome do aplicativo de funções e <CONNECTION_STRING> pela cadeia de conexão da etapa anterior. A conexão deve ser uma cadeia de caracteres codificada longa que começa com DefaultEndpointProtocol=.

  4. Agora, a função pode usar essa cadeia de conexão para acessar a conta de armazenamento.

Verificar as funções no Azure

Com a imagem implantada no aplicativo de funções no Azure, você pode invocar a função usando solicitações HTTP.

  1. Execute o comando az functionapp function show a seguir para obter a URL da nova função:

    az functionapp function show --resource-group AzureFunctionsContainers-rg --name <APP_NAME> --function-name HttpExample --query invokeUrlTemplate 
    

    Substitua <APP_NAME> pelo nome do aplicativo de funções.

  1. Use a URL que você acabou de obter para chamar o ponto de extremidade da função HttpExample, acrescentando a cadeia de caracteres de consulta ?name=Functions.
  1. Use a URL que você acabou de obter para chamar o ponto de extremidade da função 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 quiser continuar trabalhando com o Azure Functions usando os recursos criados neste artigo, mantenha todos esses recursos. Como criou um Plano Premium para o Azure Functions, você terá um custo contínuo de USD 1 ou 2 por dia.

Para evitar os custos contínuos, exclua o grupo de recursos AzureFunctionsContainers-rg para limpar todos os recursos que estão nele:

az group delete --name AzureFunctionsContainers-rg

Próximas etapas