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:
Instale o SDK do .NET 8.0.
Instale o Azure Functions Core Tools versão 4.0.5198 ou posterior.
- Instale o Azure Functions Core Tools versão 4.x.
- Instale uma versão do Node.js com suporte do Azure Functions.
- Instale uma versão do Python com suporte do Azure Functions.
- Instale o SDK do .NET 6.
Instale uma versão do Java Developer Kit com suporte do Azure Functions.
Instale o Apache Maven, versão 3.0 ou posterior.
- A CLI do Azure versão 2.4 ou mais recente.
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.
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.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.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.
Caso ainda não tenha feito isso, entre no Azure.
O comando
az login
conecta você à conta do Azure. Useaz account set
quando você tiver mais de uma assinatura associada à sua conta.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.
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
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 deeastus
.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.
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.
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.
- 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
.
- 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