Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Para automatizar a implementação da sua aplicação de funções, utilize um ficheiro Bicep ou um modelo Azure Resource Manager (template ARM). Durante a implementação, pode usar recursos existentes do Azure ou criar novos.
Ao utilizar a automação de implementação, tanto infraestrutura como código (IaC) como integração contínua e implementação (CI/CD), pode trazer estes benefícios para as suas aplicações de produção:
- Consistência: defina sua infraestrutura em código para garantir implantações consistentes em todos os ambientes.
- Controle de versão: controle as alterações na infraestrutura e nas configurações do aplicativo no controle do código-fonte, juntamente com o código do projeto.
- Automação: Automatizar a implementação, o que reduz erros manuais e encurta o processo de lançamento.
- Escalabilidade: replique facilmente a infraestrutura para vários ambientes, como desenvolvimento, teste e produção.
- Recuperação de desastres: recrie rapidamente a infraestrutura após falhas ou durante migrações.
Este artigo mostra-lhe como automatizar a criação de recursos Azure e configurações de implementação para Azure Functions. Para saber mais sobre a implementação contínua do seu código de projeto, consulte Implementação contínua para Azure Functions.
O código modelo para criar os recursos necessários do Azure depende das opções de alojamento desejadas para a sua aplicação de funções. Este artigo suporta as seguintes opções de hospedagem:
| Opção de hospedagem | Tipo de implantação | Modelos de exemplo |
|---|---|---|
| Plano de consumo Flex | Code-only |
Bicep template ARM Terraform |
| Plano Premium | Código | Contentor |
Bicep template ARM |
| Plano dedicado | Código | Contentor |
Bicep template ARM |
| Aplicativos de contêiner do Azure | Container-only | Bicep |
| Plano de consumo (legado) | Code-only |
Bicep template ARM |
Para novas funções em aplicações sem servidor, utilize o plano Flex Consumption.
O plano de Consumo é um plano de alojamento antigo. Para as aplicações existentes, migre para o plano Flex Consumption.
Certifique-se de selecionar seu plano de hospedagem no topo do artigo.
Important
As aplicações funcionais que ainda estão a correr o runtime final de vida v3 no Linux num plano de Consumo deixam de funcionar após 30 de setembro de 2026. Para evitar interrupções no serviço, migre a sua aplicação para o runtime da v4.
A opção de alojar aplicações funcionais no Linux num plano Consumption será retirada a 30 de setembro de 2028. O plano Linux Consumption não está a receber novas funcionalidades nem versões de linguagem. As aplicações a correr no Windows num plano de Consumo não estão atualmente afetadas. Migre as suas aplicações para o plano Flex Consumption antes da data de reforma.
Ao usar este artigo, tenha estas considerações em mente:
Não há uma maneira canônica de estruturar um modelo ARM.
Pode modularizar uma implementação do Bicep em múltiplos ficheiros Bicep e Azure Verified Modules (AVMs).
Este artigo parte do princípio de que tens uma compreensão básica de criação de ficheiros Bicep ou de autoria de modelos de Azure Resource Manager.
- Os exemplos são mostrados como seções individuais para recursos específicos. Para um conjunto alargado de exemplos completos de ficheiros Bicep e modelos ARM, veja estes exemplos de implementação de aplicações funcionais.
- Os exemplos são mostrados como seções individuais para recursos específicos. Para Bicep, Módulos Verificados Azure (AVM) são mostrados, quando disponíveis. Para um conjunto abrangente de exemplos completos de ficheiros Bicep e modelos ARM, veja estes exemplos de implementação de aplicações Flex Consumption.
- Os exemplos são mostrados como seções individuais para recursos específicos.
Recursos necessários
Deve criar ou configurar estes recursos para uma implementação hospedada no Azure Functions:
| Resource | Requirement | Sintaxe e referência de propriedades |
|---|---|---|
| Uma conta de armazenamento | Required | Microsoft.Storage/ContasDeArmazenamento |
| Um componente do Application Insights | Recommended | Microsoft. Insights/componentes* |
| Um plano de hospedagem | Required | Microsoft. Web/serverfarms |
| Um aplicativo de função | Required | Microsoft.Web/sites |
Deve criar ou configurar estes recursos para uma implementação hospedada no Azure Functions:
| Resource | Requirement | Sintaxe e referência de propriedades |
|---|---|---|
| Uma conta de armazenamento | Required | Microsoft.Storage/ContasDeArmazenamento |
| Um componente do Application Insights | Recommended | Microsoft. Insights/componentes* |
| Um aplicativo de função | Required | Microsoft.Web/sites |
Uma implementação hospedada no Azure Container Apps normalmente consiste nestes recursos:
| Resource | Requirement | Sintaxe e referência de propriedades |
|---|---|---|
| Uma conta de armazenamento | Required | Microsoft.Storage/ContasDeArmazenamento |
| Um componente do Application Insights | Recommended | Microsoft. Insights/componentes* |
| Um ambiente gerenciado | Required | Microsoft.App/managedEnvironments |
| Um aplicativo de função | Required | Microsoft.Web/sites |
*Se ainda não tem um Log Analytics Workspace que a sua instância de Application Insights possa usar, também precisa de criar este recurso.
Quando se implementam múltiplos recursos num único ficheiro Bicep ou modelo ARM, a ordem em que os recursos são criados é importante. Este requisito resulta de dependências entre recursos. Para essas dependências, certifique-se de usar o dependsOn elemento para definir a dependência no recurso dependente. Para mais informações, consulte Define a ordem para a implementação de recursos em templates ARM ou Dependências de recursos em Bicep.
Prerequisites
- Estes exemplos funcionam no contexto de um grupo de recursos já existente.
- Tanto o Application Insights como os registos de armazenamento requerem um espaço de trabalho do Azure Log Analytics existente. Pode partilhar espaços de trabalho entre serviços. Para melhorar o desempenho, crie um espaço de trabalho em cada região geográfica. Para um exemplo de como criar um espaço de trabalho Log Analytics, veja Criar um espaço de trabalho Log Analytics. Pode encontrar o ID de recurso de espaço de trabalho completamente qualificado numa página de espaço de trabalho no portal Azure, em Definições, Propriedades, ID de Recurso.
- Este artigo parte do princípio de que já criou um ambiente gerido no Azure Container Apps. Você precisa do nome e da ID do ambiente gerenciado para criar um aplicativo funcional hospedado em Aplicativos de Contêiner.
Criar conta de armazenamento
Todas as aplicações de funções requerem uma conta de armazenamento no Azure. Precisas de uma conta de uso geral que suporte blobs, tabelas, filas e ficheiros. Para mais informações, consulte requisitos da conta de armazenamento do Azure Functions.
Important
A conta de armazenamento é usada para armazenar dados importantes do aplicativo, às vezes incluindo o próprio código do aplicativo. Você deve limitar o acesso de outros aplicativos e usuários à conta de armazenamento.
Esta secção de exemplo cria uma conta de armazenamento padrão de uso geral v2:
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = {
name: storageAccountName
location: location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
properties: {
supportsHttpsTrafficOnly: true
defaultToOAuthAuthentication: true
allowBlobPublicAccess: false
minimumTlsVersion: 'TLS1_2'
}
}
Para mais contexto, consulte o ficheiro completo main.bicep no repositório de templates.
Para mais contexto, consulte o ficheiro completo storage-PrivateEndpoint.bicep no repositório de exemplos.
A aplicação de funções precisa de uma ligação a esta conta de armazenamento. Configure esta ligação usando a AzureWebJobsStorage definição. Para obter mais informações, consulte Configuração do aplicativo.
Tip
Para maior segurança, adicione allowSharedKeyAccess: false às propriedades da sua conta de armazenamento e use conexões geridas baseadas em identidade em vez de cadeias de conexão. Os exemplos de planos Flex Consumption neste artigo utilizam esta abordagem, incluindo as AzureWebJobsStorage__* definições baseadas em identidade e uma identidade gerida atribuída pelo sistema. Para obter mais informações, consulte Ligação ao armazenamento do host com uma identidade.
Tip
Para maior segurança, defina allowSharedKeyAccess para false na sua conta de armazenamento e use ligações geridas baseadas em identidade em vez de strings de ligação. Para obter mais informações, consulte Ligação ao armazenamento do host com uma identidade.
Important
Os planos Elastic Premium e Consumption usam Azure Files para partilha de conteúdos, e o Azure Files atualmente não suporta ligações geridas baseadas em identidade. Esta limitação significa que estes planos exigem acesso com chave partilhada à conta de armazenamento, por isso não defina allowSharedKeyAccess para false. Quando tiver de usar cadeias de ligação, guarde-as no Azure Key Vault e use referências do Azure Key Vault nas configurações da aplicação em vez de armazenar as chaves diretamente. Se quiseres remover a dependência dos Ficheiros Azure, vê Criar uma aplicação sem Ficheiros Azure.
Contêiner de implantação
Para implementar numa aplicação a correr no plano Flex Consumption, precisa de um contentor no Azure Blob Storage como fonte de implementação. Pode usar a conta de armazenamento padrão ou especificar uma conta de armazenamento separada. Para obter mais informações, consulte Definir configurações de implantação.
Deve configurar esta conta de implementação ao criar a sua aplicação, incluindo o contentor específico usado para as implementações. Para saber mais sobre como configurar implantações, consulte Fontes de implantação.
Este exemplo mostra como criar um contêiner na conta de armazenamento:
}
// Azure Functions Flex Consumption
module functionApp 'br/public:avm/res/web/site:0.16.0' = {
name: 'functionapp'
scope: rg
params: {
kind: 'functionapp,linux'
name: functionAppName_resolved
location: location
tags: union(tags, { 'azd-service-name': 'api' })
serverFarmResourceId: appServicePlan.outputs.resourceId
managedIdentities: {
systemAssigned: true
}
functionAppConfig: {
deployment: {
storage: {
type: 'blobContainer'
value: '${storage.outputs.primaryBlobEndpoint}${deploymentStorageContainerName}'
authentication: {
type: 'SystemAssignedIdentity'
}
Este exemplo mostra como usar o AVM para contas de armazenamento para criar o contentor de armazenamento blob juntamente com a conta de armazenamento. Para o excerto em contexto, veja este exemplo de implementação.
Configura outras definições de implementação com a própria aplicação.
Habilitar logs de armazenamento
Como a conta de armazenamento é usada para dados importantes da aplicação funcional, monitorize a conta para modificações desse conteúdo. Para monitorizar a sua conta de armazenamento, configure os registos de recursos do Azure Monitor para o Azure Storage. Nesta secção de exemplo, um espaço de trabalho de Log Analytics chamado myLogAnalytics é usado como destino para estes registos.
resource blobService 'Microsoft.Storage/storageAccounts/blobServices@2023-05-01' existing = {
name:'default'
parent:storageAccountName
}
resource storageDataPlaneLogs 'Microsoft.Insights/diagnosticSettings@2021-05-01-preview' = {
name: '${storageAccountName}-logs'
scope: blobService
properties: {
workspaceId: myLogAnalytics.id
logs: [
{
category: 'StorageWrite'
enabled: true
}
]
metrics: [
{
category: 'Transaction'
enabled: true
}
]
}
}
Pode usar o mesmo espaço de trabalho para o recurso Application Insights definido mais tarde. Para mais informações, incluindo como trabalhar com estes registos, consulte Monitorização Azure Storage.
Criar Application Insights
Use o Application Insights para monitorizar a execução da sua aplicação de funções. O Application Insights requer agora um espaço de trabalho Azure Log Analytics, que pode ser partilhado. Estes exemplos pressupõem que você esteja usando um espaço de trabalho existente e tenha a ID de recurso totalmente qualificada para o espaço de trabalho. Para mais informações, consulte Azure Log Analytics workspace.
Nesta secção de exemplo, defina o recurso Application Insights com o tipo Microsoft.Insights/components e o tipo web:
resource applicationInsight 'Microsoft.Insights/components@2020-02-02' = {
name: applicationInsightsName
location: appInsightsLocation
tags: tags
kind: 'web'
properties: {
Application_Type: 'web'
WorkspaceResourceId: '<FULLY_QUALIFIED_RESOURCE_ID>'
}
}
Para mais contexto, consulte o ficheiro completo main.bicep no repositório de templates.
Deve fornecer a ligação à aplicação de funções usando as APPLICATIONINSIGHTS_CONNECTION_STRING definições da aplicação. Para obter mais informações, consulte Configuração do aplicativo.
Os exemplos neste artigo obtêm o valor da cadeia de ligação para a instância criada. Versões mais antigas podem usar APPINSIGHTS_INSTRUMENTATIONKEY para definir a chave de instrumentação, o que não é mais recomendado.
Criar o plano de hospedagem
Deve definir explicitamente o plano de alojamento para aplicações alojadas num plano Azure Functions Flex Consumption, plano Premium ou plano Dedicado (App Service).
O Flex Consumption é um plano de hospedagem baseado em Linux que se baseia no modelo de pagamento de consumo pelo que você usa sem servidor. O plano oferece suporte para redes privadas, seleção de tamanho de memória de instância e suporte aprimorado a identidades gerenciadas.
Um plano Flex Consumption é um recurso especial do tipo serverfarm. Você pode especificá-lo usando FC1 para o valor da propriedade Name na propriedade sku com valor de tierFlexConsumption.
Esta seção de exemplo cria um plano Flex Consumption:
scaleAndConcurrency: {
maximumInstanceCount: maximumInstanceCount
instanceMemoryMB: instanceMemoryMB
}
runtime: {
name: functionAppRuntime
version: functionAppRuntimeVersion
}
}
siteConfig: {
alwaysOn: false
}
configs: [{
name: 'appsettings'
properties:{
Este exemplo utiliza o AVM para planos de Serviços de Aplicações. Para o excerto em contexto, veja este exemplo de implementação.
Como o plano Flex Consumption atualmente só suporta Linux, você também deve definir a reserved propriedade como true.
O plano Premium oferece o mesmo escalonamento que o plano de Consumo, mas inclui recursos dedicados e recursos extras. Para saber mais, consulte Azure Functions Plano Premium.
Um plano Premium é um tipo especial de serverfarm recurso. Você pode especificá-lo para o valor da propriedade EP1 na propriedade EP2 usando EP3, Name, ou sku. A forma como defines o plano de alojamento Functions depende de a tua aplicação funcional correr no Windows ou no Linux. Esta seção de exemplo cria um EP1 plano:
resource hostingPlan 'Microsoft.Web/serverfarms@2024-04-01' = {
name: hostingPlanName
location: location
sku: {
name: 'EP1'
tier: 'ElasticPremium'
family: 'EP'
}
kind: 'elastic'
properties: {
maximumElasticWorkerCount: 20
}
}
Para mais contexto, consulte o ficheiro completo main.bicep no repositório de templates.
Para obter mais informações sobre o sku objeto, consulte SkuDefinition ou revise os modelos de exemplo.
No plano Dedicado (App Service), a sua aplicação de funções corre em máquinas virtuais dedicadas em SKUs Basic, Standard e Premium nos planos App Service, semelhante às aplicações web. Para obter mais informações, consulte Plano dedicado.
Para um exemplo de modelo de ficheiro Bicep/Azure Resource Manager, consulte Aplicação de Função no plano Azure App Service.
Nas Funções, o plano Dedicado é apenas um plano regular do Serviço de Aplicações, definido por um recurso serverfarm. Você deve fornecer pelo menos o name valor. Para obter uma lista de nomes de planos suportados, consulte a definição em --sku em az appservice plan create para a lista atual de valores suportados para um plano dedicado.
A forma como define o plano de alojamento depende se a sua aplicação funcional funciona no Windows ou no Linux:
resource hostingPlanName 'Microsoft.Web/serverfarms@2024-04-01' = {
name: hostingPlanName
location: location
sku: {
tier: 'Standard'
name: 'S1'
size: 'S1'
family: 'S'
capacity: 1
}
}
Para mais contexto, consulte o ficheiro completo main.bicep no repositório de templates.
Criar o plano de hospedagem
Você não precisa definir explicitamente um recurso de plano de hospedagem de consumo. Quando se salta esta definição de recurso, o portal cria ou seleciona automaticamente um plano por região quando cria o próprio recurso da aplicação de funções.
Pode definir explicitamente um plano de Consumo como um tipo especial de serverfarm recurso. Defina as computeMode propriedades e sku como Dynamic. Esta seção de exemplo mostra como definir explicitamente um plano de consumo. A forma como defines um plano de alojamento depende se a tua aplicação funciona no Windows ou no Linux.
resource hostingPlan 'Microsoft.Web/serverfarms@2024-04-01' = {
name: hostingPlanName
location: location
sku: {
name: 'Y1'
tier: 'Dynamic'
size: 'Y1'
family: 'Y'
capacity: 0
}
properties: {
computeMode: 'Dynamic'
}
}
Para mais contexto, consulte o ficheiro completo main.bicep no repositório de templates.
Criar o aplicativo de função
Defina o recurso de uma aplicação de função como um recurso do tipo Microsoft.Web/sites com uma propriedade kind que inclui functionapp.
A forma como defines um recurso de aplicação de função depende de estares a hospedar no Linux ou no Windows:
Para uma lista de definições de aplicação necessárias ao correr em Windows, veja Application configuration. Para um exemplo de ficheiro Bicep ou modelo Azure Resource Manager, consulte a aplicação de funções alojada no Windows num modelo de plano de Consumo .
Para uma lista de definições de aplicação necessárias ao correr em Windows, veja Application configuration.
Flex Consumption substitui muitas das definições padrão de aplicações e propriedades de configuração do site usadas nas implementações de templates Bicep e ARM. Para obter mais informações, consulte Configuração do aplicativo.
AzureWebJobsStorage__blobServiceUri: 'https://${storage.outputs.name}.blob.${environment().suffixes.storage}'
AzureWebJobsStorage__queueServiceUri: 'https://${storage.outputs.name}.queue.${environment().suffixes.storage}'
AzureWebJobsStorage__tableServiceUri: 'https://${storage.outputs.name}.table.${environment().suffixes.storage}'
// Application Insights settings are always included
APPLICATIONINSIGHTS_CONNECTION_STRING: applicationInsights.outputs.connectionString
APPLICATIONINSIGHTS_AUTHENTICATION_STRING: 'Authorization=AAD'
}
}]
}
}
// Consolidated Role Assignments
module rbacAssignments 'rbac.bicep' = {
name: 'rbacAssignments'
scope: rg
params: {
storageAccountName: storage.outputs.name
appInsightsName: applicationInsights.outputs.name
managedIdentityPrincipalId: functionApp.outputs.?systemAssignedMIPrincipalId ?? ''
userIdentityPrincipalId: principalId
allowUserIdentityPrincipal: !empty(principalId)
}
}
// Outputs
output AZURE_LOCATION string = location
output AZURE_TENANT_ID string = tenant().tenantId
output AZURE_FUNCTION_NAME string = functionApp.outputs.name
output APPLICATIONINSIGHTS_CONNECTION_STRING string = applicationInsights.outputs.connectionString
Este exemplo utiliza o AVM para aplicações funcionais. Para o excerto em contexto, veja este exemplo de implementação.
Note
Se optar por definir de forma opcional o seu plano de Consumo, deverá definir a propriedade serverFarmId na aplicação para que ela aponte para a ID do recurso do plano. Verifique se o aplicativo de função tem uma dependsOn configuração que também faz referência ao plano. Se você não definiu explicitamente um plano, um será criado para você.
Defina a serverFarmId propriedade no aplicativo para que ela aponte para a ID do recurso do plano. Verifique se o aplicativo de função tem uma dependsOn configuração que também faz referência ao plano.
resource functionAppName_resource 'Microsoft.Web/sites@2024-04-01' = {
name: functionAppName
location: location
kind: 'functionapp'
properties: {
serverFarmId: hostingPlanName.id
siteConfig: {
appSettings: [
{
name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
value: applicationInsightsName.properties.ConnectionString
}
{
name: 'AzureWebJobsStorage'
value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
}
{
name: 'WEBSITE_CONTENTAZUREFILECONNECTIONSTRING'
value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
}
{
name: 'WEBSITE_CONTENTSHARE'
value: toLower(functionAppName)
}
{
name: 'FUNCTIONS_EXTENSION_VERSION'
value: '~4'
}
{
name: 'FUNCTIONS_WORKER_RUNTIME'
value: 'node'
}
{
name: 'WEBSITE_NODE_DEFAULT_VERSION'
value: '~20'
}
]
}
}
}
Para um exemplo completo de ponta a ponta, veja este ficheiro main.bicep.
resource functionApp 'Microsoft.Web/sites@2024-04-01' = {
name: functionAppName
location: location
kind: 'functionapp'
properties: {
serverFarmId: hostingPlan.id
siteConfig: {
alwaysOn: true
appSettings: [
{
name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
value: applicationInsightsName.properties.ConnectionString
}
{
name: 'AzureWebJobsStorage'
value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
}
{
name: 'FUNCTIONS_EXTENSION_VERSION'
value: '~4'
}
{
name: 'FUNCTIONS_WORKER_RUNTIME'
value: 'node'
}
{
name: 'WEBSITE_NODE_DEFAULT_VERSION'
value: '~20'
}
]
}
}
}
Para um exemplo completo de ponta a ponta, veja este ficheiro main.bicep.
Fontes de implantação
Use a definição do site linuxFxVersion para solicitar um contentor Linux específico para implementar para a sua aplicação ao criá-la. Para aceder a imagens num repositório privado, precisas de mais definições. Para obter mais informações, consulte Configuração do aplicativo.
Important
Ao criar seus próprios contêineres, é necessário manter a imagem base do contêiner atualizada para a imagem base suportada mais recente. As imagens base suportadas para Azure Functions são específicas de cada linguagem. Veja os repositórios de imagens base de Azure Functions.
A equipa do Functions está empenhada em publicar atualizações mensais para estas imagens base. As atualizações regulares incluem as últimas atualizações de versões menores e correções de segurança tanto para o runtime do Functions quanto para as linguagens. Você deve atualizar regularmente seu contêiner a partir da imagem base mais recente e reimplantar a versão atualizada do contêiner. Para obter mais informações, consulte Mantendo contêineres personalizados.
O seu ficheiro Bicep ou modelo ARM pode, opcionalmente, também definir uma implementação para o seu código de funções. Esta implementação pode incluir os seguintes métodos:
O plano Flex Consumption mantém o código do seu projeto num ficheiro de pacote comprimido em zip, num contentor de armazenamento blob conhecido como contentor de implantação. Você pode configurar a conta de armazenamento e o contêiner usados para implantação. Para obter mais informações, consulte Implantação.
Você deve usar um deploy para publicar o seu pacote de código no contêiner de implantação. Durante uma implementação de template ARM ou Bicep, pode fazer este passo definindo uma fonte de pacote que utilize a /onedeploy extensão. Se optar por carregar diretamente o seu pacote para o contentor, o pacote não é automaticamente implementado.
Contêiner de implantação
Defina a conta de armazenamento específica e o contentor utilizados para as implementações, o método de autenticação e as credenciais no elemento functionAppConfig.deployment.storage do properties para o site. O contentor e quaisquer definições da aplicação devem existir quando crias a aplicação. Para obter um exemplo de como criar o contêiner de armazenamento, consulte Contêiner de implantação.
Este exemplo usa uma identidade gerenciada atribuída ao sistema para acessar o contêiner de armazenamento de blob especificado, que é criado em outro lugar na implantação:
// Consolidated Role Assignments
module rbacAssignments 'rbac.bicep' = {
name: 'rbacAssignments'
scope: rg
params: {
storageAccountName: storage.outputs.name
appInsightsName: applicationInsights.outputs.name
managedIdentityPrincipalId: functionApp.outputs.?systemAssignedMIPrincipalId ?? ''
userIdentityPrincipalId: principalId
allowUserIdentityPrincipal: !empty(principalId)
}
}
// Outputs
output AZURE_LOCATION string = location
output AZURE_TENANT_ID string = tenant().tenantId
output AZURE_FUNCTION_NAME string = functionApp.outputs.name
output APPLICATIONINSIGHTS_CONNECTION_STRING string = applicationInsights.outputs.connectionString
Este exemplo utiliza o AVM para aplicações funcionais. Para o excerto em contexto, veja este exemplo de implementação.
Quando usa identidades geridas, também deve ativar a aplicação de funções para aceder à conta de armazenamento usando a identidade, como mostrado neste exemplo:
module storageRoleAssignment_User 'br/public:avm/ptn/authorization/resource-role-assignment:0.1.2' = if (allowUserIdentityPrincipal && !empty(userIdentityPrincipalId)) {
name: 'storageRoleAssignment-User-${uniqueString(storageAccount.id, userIdentityPrincipalId)}'
params: {
resourceId: storageAccount.id
roleDefinitionId: roleDefinitions.storageBlobDataOwner
principalId: userIdentityPrincipalId
principalType: 'User'
description: 'Storage Blob Data Owner role for user identity (development/testing)'
roleName: 'Storage Blob Data Owner'
}
}
Este exemplo utiliza o AVM para atribuição de funções com escopo de recursos. Para o excerto em contexto, veja este exemplo de implementação.
Este exemplo exige que saibas o valor do GUID para a função que estás a atribuir. Para obter este valor de ID para qualquer nome de função amigável, use o comando az role definition list, como mostrado neste exemplo:
az role definition list --output tsv --query "[?roleName=='Storage Blob Data Owner'].{name:name}"
Quando utilizar uma cadeia de conexão em vez de identidades geridas, defina authentication.type para StorageAccountConnectionString e defina authentication.storageAccountConnectionStringName para o nome da configuração da aplicação que contém a cadeia de conexão da conta de armazenamento de implantação.
Pacote de implantação
O plano Flex Consumption usa uma implantação para implantar seu projeto de código. O próprio pacote de código é o mesmo que utiliza para implementação zip em outros planos de alojamento de funções. No entanto, o nome do ficheiro do pacote deve ser released-package.zip.
Para incluir um pacote de uma única implantação no seu modelo, use a definição de recurso /onedeploy para a URL remota que contém o pacote de implantação. O host Functions deve ser capaz de acessar essa fonte de pacote remoto e o contêiner de implantação.
Este exemplo adiciona uma fonte de implantação única a um aplicativo existente:
@description('The name of the function app.')
param functionAppName string
@description('The location into which the resources should be deployed.')
param location string = resourceGroup().location
@description('The zip content URL for released-package.zip.')
param packageUri string
resource functionAppName_OneDeploy 'Microsoft.Web/sites/extensions@2022-09-01' = {
name: '${functionAppName}/onedeploy'
location: location
properties: {
packageUri: packageUri
remoteBuild: false
}
}
O seu ficheiro Bicep ou modelo ARM pode também definir, opcionalmente, uma implantação para o seu código da função, usando um pacote de implantação zip.
Para implementar com sucesso a sua aplicação usando o Azure Resource Manager, precisa de compreender como os recursos são implementados no Azure. Na maioria dos exemplos, aplica-se configurações de topo usando siteConfig. Defina estas configurações a um nível superior, porque transmitem informação ao motor de execução e implementação das funções. O motor de implementação requer informação de nível superior antes de aplicar o recurso filho sourcecontrols/web. Embora possas configurar estas definições no recurso a nível config/appSettings filho, em alguns casos a tua aplicação de funções tem de ser implementada antesconfig/appSettings de ser aplicada.
Pacote de implantação Zip
A implementação por Zip é a forma recomendada de implementar o código da sua aplicação de função. Por padrão, as funções que usam a implantação zip são executadas no próprio pacote de implantação. Para mais informações, incluindo os requisitos para um pacote de implementação, consulte Zip deployment para Azure Functions. Ao usar a automação de implementação de recursos, pode referenciar o pacote de implementação .zip no seu modelo de Bicep ou ARM.
Para usar o desdobramento zip no modelo, defina a configuração WEBSITE_RUN_FROM_PACKAGE no aplicativo como 1 e inclua a definição do recurso /zipDeploy.
Para um plano de Consumo no Linux, defina em vez disso o URI do pacote de implementação diretamente na definição WEBSITE_RUN_FROM_PACKAGE, como mostrado em este modelo de exemplo.
Este exemplo adiciona uma fonte de implantação zip a um aplicativo existente:
@description('The name of the function app.')
param functionAppName string
@description('The location into which the resources should be deployed.')
param location string = resourceGroup().location
@description('The zip content url.')
param packageUri string
resource functionAppName_ZipDeploy 'Microsoft.Web/sites/extensions@2024-04-01' = {
name: '${functionAppName}/ZipDeploy'
location: location
properties: {
packageUri: packageUri
}
}
Tenha em mente as seguintes considerações ao incluir recursos de implantação zip no seu modelo:
- Os planos de consumo no Linux não suportam
WEBSITE_RUN_FROM_PACKAGE = 1. Em vez disso, você deve definir o URI do pacote de implantação diretamente naWEBSITE_RUN_FROM_PACKAGEconfiguração. Para obter mais informações, consulte WEBSITE_RUN_FROM_PACKAGE. Para um modelo de exemplo, veja a aplicação Function alojada no Linux num plano de Consumo.
O
packageUrideve ser um local ao qual as Funções possam aceder. Considere usar armazenamento Azure Blob com uma assinatura de acesso partilhada (SAS). Depois que o SAS expira, o Functions não pode mais acessar o compartilhamento para implantações. Ao regenerar sua SAS, lembre-se de atualizar aWEBSITE_RUN_FROM_PACKAGEconfiguração com o novo valor de URI.Ao definir
WEBSITE_RUN_FROM_PACKAGEcomo um URI, você deve sincronizar manualmente os disparadores.Define sempre todas as definições necessárias da aplicação na
appSettingscoleção ao adicionar ou atualizar definições. A atualização remove definições existentes que não definiste explicitamente. Para obter mais informações, consulte Configuração do aplicativo.O serviço Functions não oferece suporte à Web Deploy (
msdeploy) para implantações de pacotes. Em vez disso, você deve usar a implantação zip em seus pipelines de implantação e automação. Para mais informações, consulte a implementação Zip para Azure Functions.
Compilações remotas
O processo de implementação assume que o ficheiro .zip que utiliza ou uma implementação zip contém uma aplicação pronta a executar. Esta suposição significa que, por defeito, não são feitas personalizações.
Alguns cenários exigem que reconstruas a tua aplicação remotamente. Um exemplo é quando precisas de incluir pacotes específicos para Linux em Python ou Node.js aplicações que desenvolveste num computador Windows. Nesse caso, você pode configurar o Functions para executar uma compilação remota em seu código após a implantação zip.
A maneira como você solicita uma compilação remota depende do sistema operacional no qual você está implantando:
Quando implementas uma aplicação no Windows, o processo de implementação executa comandos específicos da linguagem, como dotnet restore para aplicações C# ou npm install para aplicações Node.js.
Para permitir os mesmos processos de compilação que obténs com integração contínua, adiciona SCM_DO_BUILD_DURING_DEPLOYMENT=true às definições da tua aplicação no código de implementação e remove completamente essa WEBSITE_RUN_FROM_PACKAGE definição.
Contentores do Linux
Se estiver a desenvolver uma aplicação de funções containerizada para um plano Dedicado ou Premium do Azure Functions, deve:
- Defina a configuração do
linuxFxVersionsite com o identificador da imagem do contêiner. - Defina todas as configurações necessárias
DOCKER_REGISTRY_SERVER_*ao obter o contêiner de um registro privado. - Defina a configuração da aplicação
WEBSITES_ENABLE_APP_SERVICE_STORAGEparafalse.
Se algumas configurações estiverem faltando, o provisionamento do aplicativo pode falhar com este erro HTTP/500:
Function app provisioning failed.
Para obter mais informações, consulte Configuração do aplicativo.
resource functionApp 'Microsoft.Web/sites@2024-04-01' = {
name: functionAppName
location: location
kind: 'functionapp'
properties: {
serverFarmId: hostingPlan.id
siteConfig: {
appSettings: [
{
name: 'AzureWebJobsStorage'
value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};AccountKey=${storageAccount.listKeys().keys[0].value}'
}
{
name: 'FUNCTIONS_WORKER_RUNTIME'
value: 'node'
}
{
name: 'WEBSITE_NODE_DEFAULT_VERSION'
value: '~20'
}
{
name: 'FUNCTIONS_EXTENSION_VERSION'
value: '~4'
}
{
name: 'DOCKER_REGISTRY_SERVER_URL'
value: dockerRegistryUrl
}
{
name: 'DOCKER_REGISTRY_SERVER_USERNAME'
value: dockerRegistryUsername
}
{
name: 'DOCKER_REGISTRY_SERVER_PASSWORD'
value: dockerRegistryPassword
}
{
name: 'WEBSITES_ENABLE_APP_SERVICE_STORAGE'
value: 'false'
}
]
linuxFxVersion: 'DOCKER|myacr.azurecr.io/myimage:mytag'
}
}
dependsOn: [
storageAccount
]
}
Ao implementar funções containerizadas para Azure Container Apps, o seu modelo deve:
- Defina o
kindcampo como um valor defunctionapp,linux,container,azurecontainerapps. - Defina a propriedade do
managedEnvironmentIdsite para o URI completamente qualificado do ambiente do Container Apps. - Adicione um link de recurso na coleção
dependsOndo site ao criar um recursoMicrosoft.App/managedEnvironmentsao mesmo tempo que o site.
A definição de uma aplicação de função contentorizada implantada a partir de um registo de contentores privado para um ambiente de Aplicações de Contentores existente pode parecer com este exemplo:
resource functionApp 'Microsoft.Web/sites@2024-04-01' = {
name: functionAppName
kind: 'functionapp,linux,container,azurecontainerapps'
location: location
properties: {
serverFarmId: hostingPlanName
siteConfig: {
linuxFxVersion: 'DOCKER|myacr.azurecr.io/myimage:mytag'
appSettings: [
{
name: 'FUNCTIONS_EXTENSION_VERSION'
value: '~4'
}
{
name: 'AzureWebJobsStorage'
value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};AccountKey=${storageAccount.listKeys().keys[0].value}'
}
{
name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
value: applicationInsightsName.properties.ConnectionString
}
]
}
managedEnvironmentId: managedEnvironmentId
}
dependsOn: [
storageAccount
hostingPlan
]
}
Configuração da aplicação
Num plano Flex Consumption, configura a sua aplicação de funções no Azure com dois tipos de propriedades:
| Configuration |
Microsoft.Web/sites propriedade |
|---|---|
| Configuração da aplicação | functionAppConfig |
| Configurações do aplicativo |
siteConfig.appSettings Coleção |
Estas configurações de aplicação são mantidas em functionAppConfig.
| Behavior | Configuração em functionAppConfig |
|---|---|
| Instâncias prontas a qualquer momento | scaleAndConcurrency.alwaysReady |
| Origem da implantação | deployment |
| Tamanho da instância | scaleAndConcurrency.instanceMemoryMB |
| Simultaneidade de gatilho HTTP | scaleAndConcurrency.triggers.http.perInstanceConcurrency |
| Tempo de execução da linguagem | runtime.name |
| Versão linguística | runtime.version |
| Contagem máxima de instâncias | scaleAndConcurrency.maximumInstanceCount |
| Estratégia de atualização do site | siteUpdateStrategy.type |
O plano Flex Consumption também suporta estas configurações do aplicativo:
- Configurações baseadas em cadeia de conexão:
- Configurações gerenciadas baseadas em identidade:
O Functions oferece as seguintes opções para configurar a sua aplicação de funções no Azure:
| Configuration |
Microsoft.Web/sites propriedade |
|---|---|
| Configurações do site | siteConfig |
| Configurações do aplicativo |
siteConfig.appSettings Coleção |
Estas configurações do site são necessárias na propriedade siteConfig.
Estas definições do site são necessárias apenas quando se utilizam identidades geridas para obter a imagem de uma instância do Azure Container Register:
Estas configurações de aplicativo são necessárias (ou recomendadas) para um sistema operacional específico e opção de hospedagem:
Estas configurações de aplicativo são necessárias para implantações de contêiner:
Essas configurações só são necessárias ao implantar a partir de um registro de contêiner privado:
Tenha estas considerações em mente ao trabalhar com definições de sites e aplicações usando ficheiros Bicep ou modelos ARM:
- A configuração opcional
alwaysReadycontém uma matriz de um ou mais{name,instanceCount}objetos, com um para cada grupo de escala por função. Estes grupos de escala tomam decisões de escala sempre prontas. Este exemplo define contagens sempre prontas para o grupohttpe uma única função chamadahelloworld, que é de um tipo de gatilho não agrupado.alwaysReady: [ { name: 'http' instanceCount: 2 } { name: 'function:helloworld' instanceCount: 1 } ]
- Considere quando definir
WEBSITE_CONTENTSHAREem uma implementação automatizada. Para obter orientações detalhadas, consulte aWEBSITE_CONTENTSHAREreferência.
- Para implantações de contêiner, também defina
WEBSITES_ENABLE_APP_SERVICE_STORAGEcomofalse, já que o conteúdo do aplicativo é fornecido no próprio contêiner.
Defina sempre as definições da sua aplicação como uma
siteConfig/appSettingscoleção doMicrosoft.Web/sitesrecurso que está a criar, como mostrado nos exemplos deste artigo. Essa definição garante que as configurações que seu aplicativo de função precisa executar estejam disponíveis na inicialização inicial.Ao adicionar ou atualizar as definições da aplicação usando templates, certifique-se de incluir todas as definições existentes na atualização. Você deve fazer isso porque as chamadas de API REST de atualização subjacentes substituem todo o recurso
/config/appsettings. Se você remover as configurações existentes, seu aplicativo de função não será executado. Para atualizar programaticamente as definições individuais das aplicações, pode usar a Azure CLI, Azure PowerShell ou o portal Azure para fazer estas alterações. Para obter mais informações, consulte Trabalhar com configurações do aplicativo.Sempre que possível, utilize ligações baseadas em identidade gerida para outros serviços Azure, incluindo a ligação
AzureWebJobsStorage. Para obter mais informações, consulte Configurar uma conexão baseada em identidade.
Implantações de slots
O Functions permite implantar diferentes versões do seu código em pontos de extremidade exclusivos em seu aplicativo de função. Essa opção facilita o desenvolvimento, a validação e a implantação de atualizações de funções sem afetar as funções em execução na produção. Os slots de implementação são uma funcionalidade do Azure App Service. O número de slots disponíveis depende do seu plano de hospedagem. Para obter mais informações, consulte os slots de implementação do Azure Functions.
Defines um recurso slot da mesma forma que um recurso de aplicação de função (Microsoft.Web/sites), mas em vez disso usas o identificador de Microsoft.Web/sites/slots recurso. Para um exemplo de implementação (tanto em templates Bicep como ARM) que crie tanto um slot de produção como um de staging num plano Premium, veja Azure Function App with a Deployment Slot.
Para saber como trocar slots usando templates, veja Automate with Resource Manager templates.
Tenha em mente as seguintes considerações ao trabalhar com implantações de slots:
Não defina a configuração
WEBSITE_CONTENTSHAREexplicitamente na definição do slot de implantação. O processo de criação da aplicação no slot de implementação gera esta configuração para si.Quando você troca slots, algumas configurações do aplicativo são consideradas "pegajosas", na medida em que ficam com o slot e não com o código que está sendo trocado. Você pode definir esta definição de slot inserindo
"slotSetting":truena definição específica da aplicação no seu modelo. Para obter mais informações, consulte Gerenciar configurações.
Implantações seguras
Pode criar a sua aplicação de funções numa implementação onde protege um ou mais dos recursos integrando-se com redes virtuais. Um Microsoft.Web/sites/networkConfig recurso define a integração da rede virtual para a sua aplicação de funções. Essa integração depende do aplicativo de função referenciado e dos recursos da rede virtual. A sua aplicação de funções também pode depender de outros recursos de rede privada, como endpoints privados e rotas privadas. Para mais informações, consulte Azure Functions opções de rede.
Estes projetos fornecem exemplos baseados no Bicep de como implementar as suas aplicações funcionais numa rede virtual, incluindo com restrições de acesso à rede:
- Função HTTP de alta escala liga-se a um hub de eventos protegido por uma rede virtual: Uma função ativada por HTTP (.NET modo trabalhador isolado) aceita chamadas de qualquer fonte e depois envia o corpo dessas chamadas HTTP para um hub de eventos seguro a correr numa rede virtual, utilizando integração com rede virtual.
- Função é acionada por uma fila de Service Bus protegida numa rede virtual: Uma função Python é acionada por uma fila de Service Bus assegurada numa rede virtual. A fila é acessada na rede virtual usando um endpoint privado. Uma máquina virtual na rede virtual é usada para enviar mensagens.
Quando cria uma implementação que utiliza uma conta de armazenamento segura, deve definir explicitamente a WEBSITE_CONTENTSHARE definição e criar o recurso de partilha de ficheiros nomeado nessa definição. Certifique-se de criar um Microsoft.Storage/storageAccounts/fileServices/shares recurso utilizando o valor de WEBSITE_CONTENTSHARE, conforme demonstrado neste exemplo (ARM template|ficheiro Bicep). Também tens de definir a propriedade vnetContentShareEnabled do site como verdadeira.
Note
Quando estas definições não fazem parte de uma implementação que utiliza uma conta de armazenamento segura, vê este erro durante a validação da implementação: Could not access storage account using provided connection string.
Estes projetos fornecem exemplos de modelos Bicep e ARM de como implementar as suas aplicações funcionais numa rede virtual, incluindo com restrições de acesso à rede:
| Cenário restrito | Description |
|---|---|
| Crie uma aplicação de funções com integração de rede virtual | Crias a tua aplicação de funções numa rede virtual com acesso total aos recursos dessa rede. O acesso de entrada e saída ao seu aplicativo de função não é restrito. Para obter mais informações, consulte Integração de rede virtual. |
| Crie uma aplicação funcional que aceda a uma conta de armazenamento segura | Seu aplicativo de função criado usa uma conta de armazenamento segura, que o Functions acessa usando pontos de extremidade privados. Para obter mais informações, veja Restringir a conta de armazenamento a uma rede virtual. |
| Crie uma aplicação de funções e uma conta de armazenamento que usem ambos endpoints privados | Seu aplicativo de função criado só pode ser acessado usando pontos de extremidade privados e usa pontos de extremidade privados para acessar recursos de armazenamento. Para obter mais informações, consulte Endereços privados. |
Configurações de rede restritas
Você também pode precisar usar essas configurações quando seu aplicativo de função tiver restrições de rede:
| Setting | Value | Description |
|---|---|---|
WEBSITE_CONTENTOVERVNET |
1 |
Definição da aplicação que permite que a sua aplicação de funções seja dimensionada quando a conta de armazenamento está limitada a uma rede virtual. Para obter mais informações, veja Restringir a conta de armazenamento a uma rede virtual. |
vnetrouteallenabled |
1 |
Configuração do site que obriga todo o tráfego da aplicação de função a usar a rede virtual. Para obter mais informações, consulte Integração de rede virtual regional. Esta configuração do site substitui a configuração WEBSITE_VNET_ROUTE_ALLdo aplicativo . |
Considerações para restrições de rede
Quando restringe o acesso à conta de armazenamento através dos endpoints privados, não pode aceder à conta de armazenamento pelo portal ou por qualquer dispositivo fora da rede virtual. Você pode conceder acesso ao seu endereço IP seguro ou rede virtual na conta de armazenamento gerenciando a regra de acesso à rede padrão.
Teclas de acesso à função
Defina chaves de acesso à função ao nível do host como os recursos do Azure. Esta abordagem permite-lhe criar e gerir chaves de host nos seus templates ARM e ficheiros Bicep. Uma chave host é definida como um recurso do tipo Microsoft.Web/sites/host/functionKeys. O exemplo seguinte cria uma chave de acesso ao nível do anfitrião, nomeada my_custom_key quando a aplicação de função é criada:
resource functionKey 'Microsoft.Web/sites/host/functionKeys@2022-09-01' = {
name: '${parameters('name')}/default/my_custom_key'
properties: {
name: 'my_custom_key'
}
dependsOn: [
resourceId('Microsoft.Web/Sites', parameters('name'))
]
}
Neste exemplo, o name parâmetro é o nome do novo aplicativo de função. Você deve incluir uma definição de dependsOn para garantir que a chave seja criada com a nova aplicação de funções. Finalmente, o properties objeto da chave host pode também incluir uma value propriedade que pode usar para definir uma chave específica.
Quando você não define a value propriedade, o Functions gera automaticamente uma nova chave para você quando o recurso é criado, o que é recomendado. Para saber mais sobre chaves de acesso, incluindo as melhores práticas de segurança para trabalhar com chaves de acesso, consulte Trabalhar com chaves de acesso em Azure Functions.
Crie o seu modelo
Especialistas com modelos Bicep ou ARM podem programar manualmente as suas implementações usando um editor de texto simples. Para o resto de nós, várias opções tornam o processo de desenvolvimento mais fácil:
Visual Studio Code: Existem extensões disponíveis para o ajudar a trabalhar tanto com ficheiros Bicep como com templates ARM. Use estas ferramentas para garantir que o seu código está correto. Eles fornecem alguma validação básica.
Azure: Quando criar a sua aplicação de funções e recursos relacionados no portal , o ecrã finalRevisão + criar tem um linkDescarregar um modelo para automação .
Este link mostra o modelo ARM gerado com base nas opções que você escolheu no portal. Este modelo pode parecer um pouco complexo quando você está criando um aplicativo de função com muitos recursos novos. No entanto, ele pode fornecer uma boa referência de como pode ser o seu template ARM.
Valide o seu modelo
Quando você cria manualmente o arquivo de modelo de implantação, é importante validar o modelo antes da implantação. Todos os métodos de implantação validam a sintaxe do modelo e geram uma mensagem de validation failed erro, conforme mostrado no seguinte exemplo formatado em JSON:
{"error":{"code":"InvalidTemplate","message":"Deployment template validation failed: 'The resource 'Microsoft.Web/sites/func-xyz' is not defined in the template. Please see https://aka.ms/arm-template for usage details.'.","additionalInfo":[{"type":"TemplateViolation","info":{"lineNumber":0,"linePosition":0,"path":""}}]}}
Use os seguintes métodos para validar o seu modelo antes da implementação:
A seguinte tarefa Azure resource group deployment v2 com deploymentMode: 'Validation' instrui Azure Pipelines a validar o template.
- task: AzureResourceManagerTemplateDeployment@3
inputs:
deploymentScope: 'Resource Group'
subscriptionId: # Required subscription ID
action: 'Create Or Update Resource Group'
resourceGroupName: # Required resource group name
location: # Required when action == Create Or Update Resource Group
templateLocation: 'Linked artifact'
csmFile: # Required when TemplateLocation == Linked Artifact
csmParametersFile: # Optional
deploymentMode: 'Validation'
Você também pode criar um grupo de recursos de teste para localizar erros de verificação prévia e implantação.
Implante seu modelo
Use qualquer um dos seguintes métodos para implementar o seu ficheiro e modelo Bicep:
Botão Implementar no Azure
Note
Este método não suporta atualmente a implementação de ficheiros Bicep.
Substitui <url-encoded-path-to-azuredeploy-json> por uma versão URL-encoded do caminho bruto do teu ficheiro azuredeploy.json no GitHub.
Aqui está um exemplo que usa markdown:
[](https://portal.azure.com/#create/Microsoft.Template/uri/<url-encoded-path-to-azuredeploy-json>)
Aqui está um exemplo que usa HTML:
<a href="https://portal.azure.com/#create/Microsoft.Template/uri/<url-encoded-path-to-azuredeploy-json>" target="_blank"><img src="https://azuredeploy.net/deploybutton.png"></a>
Implementar usando PowerShell
Os seguintes comandos PowerShell criam um grupo de recursos e implementam um ficheiro Bicep ou modelo ARM que cria uma aplicação de funções com os recursos necessários. Para executar os comandos localmente, tens de ter o Azure PowerShell instalado. Para iniciar sessão no Azure, primeiro execute Connect-AzAccount.
# Register Resource Providers if they're not already registered
Register-AzResourceProvider -ProviderNamespace "microsoft.web"
Register-AzResourceProvider -ProviderNamespace "microsoft.storage"
# Create a resource group for the function app
New-AzResourceGroup -Name "MyResourceGroup" -Location 'West Europe'
# Deploy the template
New-AzResourceGroupDeployment -ResourceGroupName "MyResourceGroup" -TemplateFile main.bicep -Verbose
Para testar esta implementação, use um modelo como este , que cria uma aplicação funcional no Windows num plano de Consumo.
Próximos passos
Saiba mais sobre como desenvolver e configurar o Azure Functions.