Criar seu primeiro Azure Functions em contêineres no Azure Arc (versão prévia)

Neste artigo, você criará um aplicativo de funções em execução em um contêiner do Linux e o implantará em um cluster Kubernetes habilitado para Azure Arc de um registro de contêiner. Ao criar seu próprio contêiner, você pode personalizar o ambiente de execução para seu aplicativo de funções. Para saber mais, confira Serviço de Aplicativo, Functions e Aplicativos Lógicos no Azure Arc.

Observação

O suporte para implantar um contêiner personalizado em um cluster do Kubernetes habilitado para Azure Arc está atualmente em versão prévia.

Você também pode publicar suas funções em um cluster do Kubernetes habilitado para Azure Arc sem primeiro criar um contêiner. Para saber mais, confira Criar a primeira função no Azure Arc (versão prévia)

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" --authlevel anonymous

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" --authlevel anonymous

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 o comando a seguir para entrar na instância do registro:

    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 comando a seguir 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 o seguinte comando para enviar o contêiner por push para a instância do registro:

    docker push <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
    
  4. Use o seguinte comando para habilitar a conta do administrador interna para que o Functions possa se conectar ao registro com um nome de usuário e senha:

    az acr update -n <REGISTRY_NAME> --admin-enabled true
    
  1. Use o seguinte comando para recuperar o nome de usuário e a senha do administrador, que o Functions precisa para se conectar ao registro:

    az acr credential show -n <REGISTRY_NAME> --query "[username, passwords[0].value]" -o tsv
    

    Importante

    O nome de usuário e a senha da conta de administrador são credenciais importantes. Certifique-se de armazená-los com segurança e nunca em um local acessível, como um repositório público.

Criar o ambiente Kubernetes do Serviço de Aplicativo

Antes de começar, você deve criar um ambiente de Kubernetes do Serviço de Aplicativo para um cluster Kubernetes habilitado para Azure Arc

Observação

Ao criar o ambiente, anote o nome do local personalizado e o nome do grupo de recursos que contém o local personalizado. Você pode usá-los para localizar a ID de local personalizada, que será necessária ao criar seu aplicativo de funções no ambiente.

Se você não criou o ambiente, verifique com o administrador do cluster.

Adicionar extensões da CLI do Azure

Inicie o ambiente Bash no Azure Cloud Shell.

Como esses comandos da CLI ainda não fazem parte do conjunto da CLI principal, adicione-os com os comandos a seguir:

az extension add --upgrade --yes --name customlocation
az extension remove --name appservice-kube
az extension add --upgrade --yes --name appservice-kube

Criar recursos do Azure

Antes de implantar o contêiner no novo ambiente de Kubernetes do Serviço de Aplicativo, você precisa criar mais dois recursos:

  • Uma conta de armazenamento. Embora este artigo crie uma conta de armazenamento, em alguns casos uma conta de armazenamento pode não ser necessária. Para obter mais informações, confira Clusters habilitados para o Azure Arc no artigo de considerações de armazenamento.
  • Um aplicativo de funções, que fornece o contexto para executar seu contêiner. O aplicativo de funções é executado no ambiente de Kubernetes do Serviço de Aplicativo e mapeia para seu projeto de função local. Um aplicativo de funções permite que você agrupe funções como uma unidade lógica para facilitar o gerenciamento, a implantação e o compartilhamento de recursos.

Observação

Os aplicativos de funções são executados em um ambiente de Kubernetes do Serviço de Aplicativo em um plano Dedicado (Serviço de Aplicativo). Quando você cria o aplicativo de funções sem um plano existente, um plano é criado para você.

Criar Conta de Armazenamento

Use o comando az storage account create para criar uma conta de armazenamento para uso geral no grupo de recursos e região:

az storage account create --name <STORAGE_NAME> --location westeurope --resource-group myResourceGroup --sku Standard_LRS

Observação

Em alguns casos, uma conta de armazenamento pode não ser necessária. Para obter mais informações, confira Clusters habilitados para o Azure Arc no artigo de considerações 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. O valor --location é uma região padrão do Azure.

Crie o aplicativo de funções

Execute o comando az functionapp create para criar um novo aplicativo de funções no ambiente.

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

Neste exemplo, substitua <CUSTOM_LOCATION_ID> pela ID do local personalizado que você especificou para o ambiente de Kubernetes do Serviço de Aplicativo. Além disso, substitua <STORAGE_NAME> pelo nome da conta usada na etapa anterior, <APP_NAME> por um nome globalmente exclusivo e <DOCKER_ID> ou <LOGIN_SERVER> pela ID de conta do Docker Hub ou servidor do 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.

Definir configurações de aplicativo necessárias

Execute os seguintes comandos para criar uma configuração de aplicativo para a cadeia de conexão da conta de armazenamento:

storageConnectionString=$(az storage account show-connection-string --resource-group AzureFunctionsContainers-rg --name <STORAGE_NAME> --query connectionString --output tsv)
az functionapp config appsettings set --name <app_name> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage=$storageConnectionString

Esse código deve ser executado em Cloud Shell ou em Bash no seu computador local. Substitua <STORAGE_NAME> pelo nome da conta de armazenamento e <APP_NAME> pelo nome do aplicativo de funções.

Invocar a função no Azure

Como a função usa um gatilho HTTP, você a invoca fazendo uma solicitação HTTP para sua URL no navegador ou usando uma ferramenta como curl.

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. O navegador deverá exibir uma saída semelhante à que foi exibida quando você executou a função localmente.

The output of the function run on Azure in a browser

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

Isso só remove os recursos criados neste artigo. O ambiente subjacente do Azure Arc permanece em vigor.

Próximas etapas