Compartilhar via


Criar sua primeira função em contêineres nos Aplicativos de Contêiner do Azure

Neste artigo, você criará um aplicativo de funções em execução em um contêiner do Linux e o implantará em um ambiente de Aplicativos de Contêiner do Azure de um registro de contêiner. Ao implementar os Aplicativos de Contêiner, você pode integrar seus aplicativos de funções em microsserviços nativos da nuvem. Para obter mais informações, consulte Aplicativos de Contêiner do Azure que hospedam o Azure Functions.

Este artigo mostra como criar funções em execução em um contêiner do Linux e implantar o contêiner em um ambiente de Aplicativos de Contêiner.

A conclusão deste início rápido gera um pequeno custo de alguns centavos de dólar ou menos em sua conta do Azure, que você pode ser minimizado limpando recursos quando terminar.

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 ambiente de Aplicativos de Contêiner do Azure com um workspace do Log Analytics.

Use os comandos a seguir para criar esses itens.

  1. Caso ainda não tenha feito isso, entre no Azure.

    O comando az login conecta você à conta do Azure. Use az account set quando você tiver mais de uma assinatura associada à sua conta.

  2. Execute o comando a seguir para atualizar a CLI do Azure para a versão mais recente:

    az upgrade
    

    Se sua versão da CLI do Azure não for a versão mais recente, uma instalação será iniciada. A maneira de atualização depende do sistema operacional. Você pode continuar após a conclusão da atualização.

  3. Execute os seguintes comandos que atualizam a extensão dos Aplicativos de Contêiner do Azure e registram namespaces exigidos pelos Aplicativos de Contêiner:

    az extension add --name containerapp --upgrade -y
    az provider register --namespace Microsoft.Web 
    az provider register --namespace Microsoft.App 
    az provider register --namespace Microsoft.OperationalInsights 
    
  4. Crie um grupo de recursos nomeado AzureFunctionsContainers-rg.

    az group create --name AzureFunctionsContainers-rg --location eastus
    

    Este comando az group create cria um grupo de recursos na região Leste dos EUA. Se você quiser usar uma região perto de você, usando um código de região disponível retornado do comando az account list-locations. Você deve modificar comandos subsequentes para usar sua região personalizada em vez de eastus.

  5. Crie um ambiente de aplicativo de contêiner do Azure com perfis de carga de trabalho habilitados.

    az containerapp env create --name MyContainerappEnvironment --enable-workload-profiles --resource-group AzureFunctionsContainers-rg --location eastus
    

    O comando pode demorar alguns minutos para ser concluído.

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

    az storage account create --name <STORAGE_NAME> --location eastus --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.

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 ambiente de Aplicativos de Contêiner do Azure. Nesta seção, você usará os recursos do Azure da seção anterior para criar um aplicativo de funções de uma imagem em um registro de contêiner em um ambiente de Aplicativos de Contêiner. Você também configura o novo ambiente com uma cadeia de conexão para a conta de Armazenamento do Azure necessária.

Use o comando az functionapp create para criar um aplicativo de funções no novo ambiente gerenciado apoiado pelos Aplicativos de Contêiner do Azure:

az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime dotnet-isolated --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --assign-identity 
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime node --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --assign-identity 
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime java --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --assign-identity 
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime powershell --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --assign-identity 
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime python --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --assign-identity 
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime node --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --assign-identity 

No comando az functionapp create, o parâmetro --environment especifica o ambiente de Aplicativos de Contêiner e o parâmetro --image especifica a imagem a ser usada para o aplicativo de funções. 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 <LOGIN_SERVER> pelo servidor do Registro de Contêiner totalmente qualificado.

Para usar uma identidade gerenciada atribuída pelo sistema para acessar o registro de contêiner, você precisa habilitar identidades gerenciadas em seu aplicativo e conceder ao registro de identidade gerenciada atribuído pelo sistema o acesso à identidade gerenciada. Este exemplo usa o comando az functionapp identity assign e az role assignment create para habilitar identidades gerenciadas no aplicativo e atribuir a identidade atribuída pelo sistema à função ACRPull no registro de contêiner:

FUNCTION_APP_ID=$(az functionapp identity assign --name <APP_NAME> --resource-group AzureFunctionsContainers-rg --query principalId --output tsv)
ACR_ID=$(az acr show --name <REGISTRY_NAME> --query id --output tsv)
az role assignment create --assignee $FUNCTION_APP_ID --role AcrPull --scope $ACR_ID

No exemplo anterior, substitua <APP_NAME> e <REGISTRY_NAME> pelo nome do seu aplicativo de funções e pelo registro de contêiner, respectivamente.

A especificação de --workload-profile-name "Consumption" cria seu aplicativo em um ambiente usando o perfil de carga de trabalho Consumption padrão, que custa o mesmo que a execução em um plano de Consumo de Aplicativos de Contêiner. Quando você cria o aplicativo de funções pela primeira vez, ele efetua pull da imagem inicial do registro.

Neste ponto, suas funções estão em execução em um ambiente de Aplicativos de Contêiner, com as configurações de aplicativo necessárias já adicionadas. Quando for necessário, você poderá adicionar outras configurações no seu aplicativo de funções na forma padrão para o Functions. Para obter mais informações, confira Usar as configurações de aplicativo.

Dica

Ao fazer alterações subsequentes no código de função, você precisa recompilar o contêiner, republicar a imagem no registro e atualizar o aplicativo de funções com a nova versão da imagem. Para obter mais informações, consulte Atualizar uma imagem no registro

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.

A URL de solicitação deve ser semelhante a esta:

https://myacafunctionapp.kindtree-796af82b.eastus.azurecontainerapps.io/api/httpexample?name=functions

https://myacafunctionapp.kindtree-796af82b.eastus.azurecontainerapps.io/api/httpexample

Limpar os recursos

Se quiser continuar trabalhando com o Azure Functions usando os recursos criados neste artigo, mantenha todos esses recursos.

Quando terminar de trabalhar com essa implantação do aplicativo de funções, exclua o grupo de recursos AzureFunctionsContainers-rg para limpar todos os recursos desse grupo:

az group delete --name AzureFunctionsContainers-rg

Próximas etapas