Criar o seu primeiro Azure Functions em contentores no Azure Arc (pré-visualização)

Neste artigo, você cria um aplicativo funcional em execução em um contêiner Linux e o implanta em um cluster Kubernetes habilitado para Azure Arc a partir 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ção. Para saber mais, consulte Serviço de Aplicativo, Funções e Aplicativos Lógicos no Azure Arc.

Nota

O suporte para implantar um contêiner personalizado em um cluster Kubernetes habilitado para Azure Arc está atualmente em visualização.

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

Escolher a linguagem de programação

Primeiro, você usa as ferramentas do Azure Functions para criar seu código de projeto como um aplicativo de função em um contêiner do Docker usando uma imagem base Linux específica do idioma. Certifique-se de selecionar 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 sua linguagem de funções. Você deve atualizar regularmente seu contêiner a partir da imagem base mais recente e reimplantar a partir da versão atualizada do contêiner. Para obter mais informações, consulte Criando aplicativos de função em contêiner.

Pré-requisitos

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

  • Instale o SDK do .NET 6.
  • Azure CLI versão 2.4 ou uma versão posterior.

Se não tiver uma subscrição do Azure, crie uma conta gratuita do Azure antes de começar.

Para publicar a imagem do aplicativo de função em contêiner que você cria em um registro de contêiner, você precisa de um ID do Docker e do Docker em execução no computador local. Se você não tiver uma ID do Docker, poderá criar 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 seu servidor de login totalmente qualificado.

Criar e ativar um ambiente virtual

Em uma pasta adequada, execute os seguintes comandos para criar e ativar um ambiente virtual chamado .venv. Certifique-se de usar uma das versões do Python suportadas pelo Azure Functions.

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

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

sudo apt-get install python3-venv

Execute todos os comandos subsequentes neste ambiente virtual ativado.

Criar e testar o projeto de funções locais

Em um terminal ou prompt de comando, execute o seguinte comando para o idioma escolhido para criar um projeto de aplicativo de função 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 Functions a partir de um arquétipo Maven:

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

O -DjavaVersion parâmetro informa ao tempo de execução do Functions qual versão do Java usar. Se quiser que as suas funções sejam executadas no Java 11, utilize -DjavaVersion=11. Quando você não especifica -DjavaVersion, o Maven assume como padrão o Java 8. Para obter mais informações, consulte Versões Java.

Importante

A JAVA_HOME variável de ambiente deve ser definida como o local 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 as instruções e forneça as seguintes informações:

Pedido valor Description
groupId com.fabrikam Um valor que identifica exclusivamente seu projeto em todos os projetos, seguindo as regras de nomenclatura de pacotes para Java.
artifactId fabrikam-functions Um valor que é o nome do jar, sem um número de versão.
Versão 1.0-SNAPSHOT Selecione o valor padrão.
embalagem com.fabrikam.functions Um valor que é o pacote Java para o código de função gerado. Utilize a predefiniçã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 --docker opção gera um Dockerfile para o projeto, que define um contêiner adequado para uso com o Azure Functions e o tempo de execução selecionado.

Navegue até a pasta do projeto:

cd fabrikam-functions

Use o comando a seguir para adicionar uma função ao seu projeto, onde o --name argumento é o nome exclusivo da sua função e o --template argumento 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 seu projeto, onde o --name argumento é o nome exclusivo da sua função e o --template argumento 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 function.json.

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

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

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

Depois de ver o HttpExample ponto de extremidade gravado na saída, navegue até esse ponto de extremidade. Você verá uma mensagem de boas-vindas na saída da resposta.

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

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

Crie a imagem do contêiner e verifique localmente

(Opcional) Examine o Dockerfile na raiz da pasta do projeto. O Dockerfile descreve o ambiente necessário para executar o aplicativo de função no Linux. A lista completa de imagens base suportadas para o Azure Functions pode ser encontrada na página de imagem base do Azure Functions.

Na pasta raiz do projeto, execute o comando docker build , forneça um nome como azurefunctionsimagee marque como v1.0.0. Substitua <DOCKER_ID> pelo ID da sua conta do Docker Hub. Este comando cria a imagem do Docker para o contentor.

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 a compilação, execute a imagem em um contêiner local usando o comando docker run, substitua <DOCKER_ID> novamente pelo ID da conta do Docker Hub e adicione o argumento ports como-p 8080:80:

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

Depois que a imagem for iniciada no contêiner local, navegue até http://localhost:8080/api/HttpExample, que deve exibir a mesma mensagem de saudação de antes. Como a função acionada HTTP que você criou usa autorização anônima, você pode chamar a função em execução no contêiner sem precisar obter uma chave de acesso. Para obter mais informações, consulte chaves de autorização.

Depois que a imagem for iniciada no contêiner local, navegue até http://localhost:8080/api/HttpExample?name=Functions, que deve exibir a mesma mensagem de "olá" que antes. Como a função acionada HTTP que você criou usa autorização anônima, você pode chamar a função em execução no contêiner sem precisar obter uma chave de acesso. Para obter mais informações, consulte chaves de autorização.

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

Publicar a imagem do contêiner em um registro

Para disponibilizar sua imagem de contêiner para implantação em um ambiente de hospedagem, você deve enviá-la por push para um registro de contêiner.

O Registro de Contêiner do Azure é um serviço de registro privado para criar, armazenar e gerenciar 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 em sua 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 este comando para marcar sua imagem com o nome totalmente qualificado do seu servidor de login do registro:

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

    Substitua <LOGIN_SERVER> pelo nome totalmente qualificado do seu servidor de login do Registro e <DOCKER_ID> pelo seu ID do Docker.

  3. Use este comando para enviar o contêiner para sua instância do Registro:

    docker push <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
    

Criar um ambiente Kubernetes do Serviço de Aplicativo

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

Nota

Ao criar o ambiente, certifique-se de anotar o nome do local personalizado e o nome do grupo de recursos que contém o local personalizado. Você pode usá-los para encontrar a ID de local personalizada, que você precisará ao criar seu aplicativo de função 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 principal da CLI, adicione-os com os seguintes comandos:

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 seu contêiner em seu novo ambiente 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, consulte Clusters habilitados para Arco do Azure no artigo de considerações sobre armazenamento.
  • Um aplicativo de função, que fornece o contexto para executar seu contêiner. O aplicativo de função é executado no ambiente Kubernetes do Serviço de Aplicativo e mapeia para seu projeto de função local. Uma aplicação de funções permite-lhe agrupar funções como unidades lógicas para uma gestão, implementação e partilha de recursos mais fácil.

Nota

Os aplicativos de função são executados em um ambiente Kubernetes do Serviço de Aplicativo em um plano Dedicado (Serviço de Aplicativo). Quando você cria seu aplicativo de função 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 de uso geral em seu grupo de recursos e região:

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

Nota

Em alguns casos, uma conta de armazenamento pode não ser necessária. Para obter mais informações, consulte Clusters habilitados para Arco do Azure no artigo de considerações sobre armazenamento.

No exemplo anterior, substitua <STORAGE_NAME> por um nome apropriado para você e exclusivo no Armazenamento do Azure. Os nomes devem conter de três a 24 caracteres, números e letras minúsculas apenas. Standard_LRS especifica uma conta de uso geral, que é suportada pelo Functions. O --location valor é uma região padrão do Azure.

Criar a aplicação de funções

Execute o comando az functionapp create para criar um novo aplicativo de função 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ê determinou para o ambiente 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> pelo ID da conta do Docker Hub ou pelo servidor do Registro de Contêiner, respectivamente. Quando você está implantando a partir de um registro de contêiner personalizado, o nome da imagem indica a URL do registro.

Quando você cria o aplicativo de função pela primeira vez, ele extrai a imagem inicial do seu Docker Hub.

Definir as configurações necessárias do aplicativo

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 no Cloud Shell ou no Bash no computador local. Substitua <STORAGE_NAME> pelo nome da conta de armazenamento e <APP_NAME> pelo nome do aplicativo da função.

Invoque a função no Azure

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

Copie o URL Invoke completo mostrado na saída do comando publish em uma barra de endereço do navegador, anexando o parâmetro ?name=Functionsquery . O navegador deve exibir uma saída semelhante à de quando você executou a função localmente.

A saída da função é executada no Azure em um navegador

Clean up resources (Limpar recursos)

Se quiser continuar a trabalhar com o Azure Function utilizando os recursos que criou neste artigo, pode deixar todos esses recursos no lugar.

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

az group delete --name AzureFunctionsContainers-rg

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

Próximos passos