Compartilhar via


Automatizar a implantação de recursos para seu aplicativo de funções no Azure Functions

Para automatizar a implantação do aplicativo de funções, use um arquivo Bicep ou um modelo do ARM (Azure Resource Manager). Durante a implantação, você pode usar recursos existentes do Azure ou criar novos.

Usando a automação de implantação, a IaC (infraestrutura como código) e a CI/CD (integração e implantação contínuas), você pode trazer esses benefícios para seus aplicativos de produção:

  • Consistência: defina sua infraestrutura no código para garantir implantações consistentes entre ambientes.
  • Controle de versão: acompanhe 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 implantação, o que reduz erros manuais e reduz o processo de versão.
  • Escalabilidade: replicar facilmente a infraestrutura para vários ambientes, como desenvolvimento, teste e produção.
  • Recuperação de Desastre: recrie rapidamente a infraestrutura após falhas ou durante as migrações.

Este artigo mostra como automatizar a criação de recursos Azure e configurações de implantação para Azure Functions. Para saber mais sobre a implantação contínua do código do projeto, consulte Implantação contínua para Azure Functions.

O código de modelo para criar os recursos de Azure necessários depende das opções de hospedagem desejadas para seu aplicativo de funções. Este artigo dá suporte às seguintes opções de hospedagem:

Opção de hospedagem Tipo de implantação Modelos de exemplo
Plano de Consumo Flexível Code-only Bicep
modelo ARM
Terraform
Plano Premium Código | Contêiner Bicep
modelo ARM
Plano dedicado Código | Contêiner Bicep
modelo ARM
Aplicativos de Contêiner do Azure Container-only Bicep
Plano de consumo(herdado) Code-only Bicep
modelo ARM

Para novos aplicativos de funções sem servidor, use o plano de Consumo Flex.
O plano de consumo é um plano de hospedagem herdado. Para aplicativos existentes, migre para o plano de consumo flexível.

Selecione seu plano de hospedagem na parte superior do artigo.

Important

Os Aplicativos de Função ainda executando o end-of-life v3 runtime no Linux em um plano Consumo deixarão de funcionar depois de 30 de setembro de 2026. Para evitar a interrupção do serviço, migre seu aplicativo para o runtime v4.

A opção de hospedar aplicativos de funções no Linux em um plano de consumo será desativada em 30 de setembro de 2028. O plano de consumo do Linux não está recebendo novos recursos ou versões de idioma. Os aplicativos em execução em Windows em um plano de consumo não são afetados no momento. Migre seus aplicativos para o plano de Consumo Flex antes da data de aposentadoria.

Ao usar esse artigo, tenha essas considerações em mente:

  • Não existe uma maneira canônica de estruturar um modelo ARM.

  • Você pode modularizar uma implantação do Bicep em vários arquivos Bicep e Módulos Verificados do Azure (AVMs).

  • Este artigo pressupõe que você tenha uma compreensão básica da criação de arquivos Bicep ou da elaboração de modelos do Azure Resource Manager.

  • Os exemplos são mostrados como seções individuais para recursos específicos.

Recursos necessários

Você deve criar ou configurar esses recursos para uma implantação hospedada Azure Functions:

Resource Requirement Referência da sintaxe e propriedades
Uma conta de armazenamento Required Microsoft. Storage/storageAccounts
Um componente do Application Insights Recommended Microsoft.Insights/components*
Um plano de hospedagem Required Microsoft. Web/serverfarms
Um aplicativo de funções Required Microsoft. Web/sites

Você deve criar ou configurar esses recursos para uma implantação hospedada Azure Functions:

Resource Requirement Referência da sintaxe e propriedades
Uma conta de armazenamento Required Microsoft. Storage/storageAccounts
Um componente do Application Insights Recommended Microsoft.Insights/components*
Um aplicativo de funções Required Microsoft. Web/sites

Uma implantação hospedada Azure Container Apps normalmente consiste nesses recursos:

Resource Requirement Referência da sintaxe e propriedades
Uma conta de armazenamento Required Microsoft. Storage/storageAccounts
Um componente do Application Insights Recommended Microsoft.Insights/components*
Um ambiente gerenciado Required Microsoft.App/managedEnvironments
Um aplicativo de funções Required Microsoft. Web/sites

*Se você ainda não tiver um workspace do Log Analytics que sua instância do Application Insights possa usar, você também precisará criar esse recurso.

Quando você implanta vários recursos em um único arquivo Bicep ou modelo arm, a ordem na qual os recursos são criados é importante. Esse requisito resulta de dependências entre recursos. Para essas dependências, use o elemento dependsOn para definir a dependência no recurso dependente. Para obter mais informações, consulte Definir a ordem para implantar recursos em modelos ARM ou Dependências de recurso em Bicep.

Prerequisites

  • Esses exemplos funcionam no contexto de um grupo de recursos existente.
  • Tanto o Application Insights quanto os logs de armazenamento exigem um workspace existente do Azure Log Analytics. Você pode compartilhar espaços de trabalho entre serviços. Para melhorar o desempenho, crie um workspace em cada região geográfica. Para obter um exemplo de como criar um workspace Log Analytics, consulte Criar um workspace Log Analytics. Você pode encontrar a ID de recurso de workspace totalmente qualificada em uma página de workspace no portal do Azure em Configurações>Propriedades>ID de Recurso.
  • Este artigo pressupõe que você já criou um ambiente gerenciado nos Aplicativos de Contêiner do Azure. Você precisa do nome e da ID do ambiente gerenciado para criar um aplicativo de funções hospedado em Aplicativos de Contêiner.

Criar Conta de Armazenamento

Todos os aplicativos de funções exigem uma conta de armazenamento Azure. Você precisa de uma conta de uso geral que dê suporte a blobs, tabelas, filas e arquivos. Para obter mais informações, consulte Azure Functions requisitos da conta de armazenamento.

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 seção de exemplo cria uma conta de armazenamento de uso geral padrão 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 obter mais contexto, consulte o arquivo main.bicep completo no repositório de modelos.

Para obter mais contexto, consulte o arquivo storage-PrivateEndpoint.bicep completo no repositório de exemplo.

O aplicativo de funções precisa de uma conexão com essa conta de armazenamento. Configure essa conexão usando a AzureWebJobsStorage configuração. Para obter mais informações, consulte a configuração do aplicativo.

Dica

Para obter uma melhor segurança, adicione allowSharedKeyAccess: false às propriedades da conta de armazenamento e use conexões baseadas em identidade gerenciada em vez de cadeias de conexão. Os exemplos do plano Flex Consumption neste artigo usam essa abordagem, incluindo configurações baseadas em identidade e uma identidade gerenciada atribuída pelo sistema. Para obter mais informações, consulte Conectando ao armazenamento do host com identidade.

Dica

Para obter melhor segurança, defina allowSharedKeyAccessfalse em sua conta de armazenamento e use conexões baseadas em identidade gerenciada em vez de cadeias de conexão. Para obter mais informações, consulte Conectando ao armazenamento do host com uma identidade.

Important

Os planos Elastic Premium e Consumption usam arquivos do Azure para compartilhamento de conteúdo e os Arquivos do Azure atualmente não dão suporte a conexões gerenciadas baseadas em identidade. Essa limitação significa que esses planos exigem acesso de chave compartilhada à conta de armazenamento, então não defina allowSharedKeyAccess como false. Quando você precisar usar cadeias de conexão, armazene-as no Azure Key Vault e use referências do Key Vault nas configurações do aplicativo em vez de armazenar chaves diretamente. Se você quiser remover a dependência dos Arquivos do Azure, consulte Criar um aplicativo sem arquivos do Azure.

Contêiner de implantação

Para implantar em um aplicativo em execução no plano de Consumo Flex, você precisa de um contêiner no Armazenamento de Blobs do Azure como fonte de implantação. Você pode usar a conta de armazenamento padrão ou especificar uma conta de armazenamento separada. Para obter mais informações, veja Definir configurações de implantação.

Você deve configurar essa conta de implantação ao criar seu aplicativo, incluindo o contêiner específico usado para implantações. Para saber mais sobre como configurar implantações, consulte as fontes de implantação.

Esse 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 contêiner de armazenamento de blobs junto com a conta de armazenamento. Para ver o trecho no contexto, consulte este exemplo de implantação.

Defina outras configurações de implantação com o próprio aplicativo.

Habilitar os logs de armazenamento

Como a conta de armazenamento é usada para dados importantes do aplicativo de funções, monitore a conta para modificação desse conteúdo. Para monitorar sua conta de armazenamento, configure os logs de recursos do Azure Monitor para o Armazenamento do Azure. Nesta seção de exemplo, um workspace Log Analytics chamado myLogAnalytics é usado como destino para esses logs.

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
      }
    ]
  }
}

Você pode usar o mesmo workspace para o recurso do Application Insights definido posteriormente. Para obter mais informações, incluindo como trabalhar com esses logs, consulte Monitoring Azure Storage.

Criar Application Insights

Use o Application Insights para monitorar as execuções do aplicativo de funções. O Application Insights agora requer um workspace do Azure Log Analytics, que pode ser compartilhado. Esses exemplos pressupõem que você está usando um espaço de trabalho existente e tem a ID de recurso totalmente qualificada para o espaço de trabalho. Para obter mais informações, consulte Azure Log Analytics workspace.

Nesta seção de exemplo, defina o recurso do 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 obter mais contexto, consulte o arquivo main.bicep completo no repositório de modelos.

Você deve fornecer a conexão ao aplicativo de funções usando a configuração do APPLICATIONINSIGHTS_CONNECTION_STRING aplicativo. Para obter mais informações, consulte a configuração do aplicativo.

Os exemplos neste artigo obtêm o valor da cadeia de conexão para a instância criada. Em vez disso, as 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

Você deve definir explicitamente o plano de hospedagem para aplicativos hospedados em um plano de consumo flex do Azure Functions, plano Premium ou plano dedicado (Serviço de Aplicativo).

Consumo Flex é um plano de hospedagem baseado em Linux que se baseia no modelo de cobrança sem servidor Consumo pague pelo que usar. O plano oferece suporte para rede privada, seleção de tamanho de memória de instância e suporte aprimorado de identidade gerenciada.

Um plano Consumo Flex é um tipo especial de recurso serverfarm. Você pode especificá-lo usando FC1 para o valor da propriedade Name na propriedade sku com um valor tier de FlexConsumption.

Esta seção de exemplo cria um plano de consumo flex:

  scaleAndConcurrency: {
    maximumInstanceCount: maximumInstanceCount
    instanceMemoryMB: instanceMemoryMB
  }
  runtime: { 
    name: functionAppRuntime
    version: functionAppRuntimeVersion
  }
}
siteConfig: {
  alwaysOn: false
}
configs: [{
  name: 'appsettings'
  properties:{

Este exemplo usa o AVM para planos do App Service. Para ver o trecho no contexto, consulte este exemplo de implantação.

Como o plano Consumo Flex atualmente tem suporte apenas para Linux, você também deve definir a propriedade reserved como true.

O Plano Premium oferece a mesma colocação em escala do Plano de Consumo, mas inclui os recursos dedicados e as funcionalidades adicionais. Para saber mais, consulte Azure Functions Plano Premium.

Um plano Premium é um tipo especial de recurso serverfarm. Especifique-o usando EP1, EP2 ou EP3 para o valor da propriedade Name na propriedade sku. A maneira como você define o plano de hospedagem do Functions depende se o aplicativo de funções é executado no Windows ou no Linux. Esta seção de exemplo cria um plano EP1:

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 obter mais contexto, consulte o arquivo main.bicep completo no repositório de modelos.

Para obter mais informações sobre o objeto sku, consulte SkuDefinition ou examine os modelos de exemplo.

No plano Dedicado (Serviço de Aplicativos), seu aplicativo de funções é executado em máquinas virtuais dedicadas nos SKUs Básico, Standard e Premium dos planos de Serviço de Aplicativos, semelhante aos aplicativos da Web. Para obter mais informações, consulte Plano dedicado.

Para ver um exemplo de arquivo Bicep/modelo do Azure Resource Manager, confira Aplicativo de funções no Plano do Serviço de Aplicativo do Azure.

No Functions, o plano dedicado é apenas um Plano do Serviço de Aplicativo regular, definido por um recurso serverfarm. Você precisa fornecer pelo menos um valor name. Para obter uma lista de nomes de plano com suporte, consulte a configuração --sku em az appservice plan create para a lista atual de valores com suporte para um plano Dedicado.

A maneira como você define o plano de hospedagem depende se o aplicativo de funções é executado 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 obter mais contexto, consulte o arquivo main.bicep completo no repositório de modelos.

Criar o plano de hospedagem

Você não precisa definir explicitamente um recurso de plano de hospedagem de consumo. Quando você ignora essa definição de recurso, o portal cria ou seleciona automaticamente um plano por região quando você cria o próprio recurso do aplicativo de funções.

Você pode definir explicitamente um plano de consumo como um tipo especial de serverfarm recurso. Defina as propriedades computeMode e sku para Dynamic. Esta seção de exemplo mostra como definir explicitamente um plano de consumo. A maneira como você define um plano de hospedagem depende se o aplicativo de funções é executado 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 obter mais contexto, consulte o arquivo main.bicep completo no repositório de modelos.

Crie o aplicativo de funções

Defina o recurso do aplicativo de funções como um recurso do tipo Microsoft.Web/sites com uma kind propriedade que inclui functionapp.

A maneira como você define um recurso de aplicativo de funções depende se você está hospedando no Linux ou no Windows:

Para obter uma lista das configurações de aplicativo necessárias ao executar em Windows, consulte Configuração do Aplicativo. Para obter um arquivo Bicep de exemplo ou um modelo do Azure Resource Manager, consulte o aplicativo de funções hospedado no Windows em um modelo de plano de consumo .

Para obter uma lista das configurações de aplicativo necessárias ao executar em Windows, consulte Configuração do Aplicativo.

O Consumo Flexível substitui muitas das configurações padrão do aplicativo e propriedades de configuração do site usadas nas implantações de modelos do Bicep e do ARM. Para obter mais informações, consulte a 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 usa o AVM para aplicativos de funções. Para ver o trecho no contexto, consulte este exemplo de implantação.

Note

Se você optar por definir explicitamente o plano de Consumo, precisará definir a propriedade serverFarmId no aplicativo, de modo que ele aponte para a ID do recurso do plano. Verifique se o aplicativo de funções tem uma configuração dependsOn que também referencia o plano. Se você não definiu explicitamente um plano, um será criado para você.

Defina a propriedade serverFarmId no aplicativo, de modo que ele aponte para a ID do recurso do plano. Verifique se o aplicativo de funções tem uma configuração dependsOn que também referencia o 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 obter um exemplo completo de ponta a ponta, consulte este arquivo 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 obter um exemplo completo de ponta a ponta, consulte este arquivo main.bicep.

Fontes de implantação

Use a configuração do linuxFxVersion site para solicitar um contêiner específico do Linux para implantar em seu aplicativo ao criá-lo. Para acessar imagens em um repositório privado, você precisa de mais configurações. Para obter mais informações, consulte a configuração do aplicativo.

Important

Ao criar seus próprios contêineres, você precisará manter a imagem base do contêiner atualizada para a imagem base com suporte mais recente. As imagens base com suporte para Azure Functions são específicas do idioma. Consulte os repositórios de imagens base do Azure Functions.

A equipe do Functions está comprometida em publicar atualizações mensais para essas imagens base. As atualizações regulares incluem as atualizações de versão secundária mais recentes e as correções de segurança para o runtime e os idiomas do Functions. Você deve atualizar regularmente o seu contêiner da imagem base mais recente e reimplantar a versão atualizada do seu contêiner. Para obter mais informações, consulte Manter contêineres personalizados.

Opcionalmente, o arquivo Bicep ou o modelo do ARM também pode definir uma implantação para seu código de função. Essa implantação pode incluir estes métodos:

O plano Flex Consumption mantém o código do projeto em um arquivo de pacote zip em um contêiner de armazenamento de blobs conhecido como contêiner 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 uma implantação para publicar seu pacote de código no contêiner de implantação. Durante a implantação com um modelo ARM ou Bicep, você pode realizar essa etapa definindo uma fonte de pacote que usa a /onedeploy extensão. Se você optar por carregar diretamente o pacote no contêiner, o pacote não será implantado automaticamente.

Contêiner de implantação

Defina a conta de armazenamento e o contêiner específicos usados para implantações, o método de autenticação e as credenciais no elemento functionAppConfig.deployment.storage do properties para o site. O contêiner e as configurações de aplicativo devem existir quando você cria o aplicativo. Para obter um exemplo de como criar o contêiner de armazenamento, consulte o contêiner de implantação.

Esse exemplo utiliza uma identidade gerida atribuída pelo sistema para aceder ao contêiner de armazenamento de bolhas especificado, que é criado noutro local da 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 usa o AVM para aplicativos de funções. Para ver o trecho no contexto, consulte este exemplo de implantação.

Ao usar identidades gerenciadas, você também deve habilitar o aplicativo de funções para acessar a conta de armazenamento usando a identidade, conforme 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 usa o AVM para atribuição de função com escopo de recurso. Para ver o trecho no contexto, consulte este exemplo de implantação.

Este exemplo exige que você saiba o valor GUID da função que está atribuindo. Para obter esse valor de ID para qualquer nome de função amigável, use o comando az role definition list , conforme mostrado neste exemplo:

az role definition list --output tsv --query "[?roleName=='Storage Blob Data Owner'].{name:name}"

Quando você usa uma cadeia de conexão em vez de identidades gerenciadas, defina authentication.type como StorageAccountConnectionString e defina authentication.storageAccountConnectionStringName como o nome da configuração do aplicativo que contém a cadeia de conexão da conta de armazenamento de implantação.

Pacote de implantação

O plano de Consumo Flexível usa uma implantação para implantar seu projeto de código. O pacote de código em si é o mesmo que o pacote usado para implantação zip em outros planos de hospedagem do Functions. No entanto, o nome do arquivo de pacote deve ser released-package.zip.

Para incluir um pacote de implantação em seu modelo, use a definição de recurso /onedeploy para a URL remota que contém o pacote de implantação. O host do Functions deve ser capaz de acessar essa origem do pacote remoto e o contêiner de implantação.

Este exemplo adiciona uma origem de implantação 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 
  }
}

Opcionalmente, o arquivo Bicep ou o modelo do ARM também pode definir uma implantação para seu código de função usando um pacote de implantação zip.

Para implantar seu aplicativo com êxito usando o Azure Resource Manager, você precisa entender como os recursos são implantados no Azure. Na maioria dos exemplos, você aplica configurações de nível superior usando siteConfig. Defina essas configurações em um nível superior, pois elas transmitem informações para o runtime do Functions e o mecanismo de implantação. O mecanismo de implantação requer informações de nível hierárquico superior antes de aplicar o recurso filho sourcecontrols/web. Embora você possa definir essas configurações no recurso de nível config/appSettings filho, em alguns casos seu aplicativo de funções deve ser implantado antesconfig/appSettings de ser aplicado.

Pacote de implantação de zip

A implantação com arquivo Zip é a maneira recomendada de implantar o código do aplicativo de função. Por padrão, as funções que usam a implantação de zip são executadas no próprio pacote de implantação. Para obter mais informações, incluindo os requisitos de um pacote de implantação, consulte Implantação de arquivo zip para Azure Functions. Ao usar a automação de implantação de recursos, você pode referenciar o pacote de implantação de .zip em seu modelo do ARM ou Bicep.

Para usar a implantação de zip em seu modelo, defina a configuração de WEBSITE_RUN_FROM_PACKAGE no aplicativo para 1 e inclua a definição de recurso /zipDeploy.

Para um plano de consumo no Linux, em vez disso, defina o URI do pacote de implantação diretamente na configuração WEBSITE_RUN_FROM_PACKAGE, conforme mostrado em tis 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 as seguintes considerações em mente ao incluir recursos de implantação zip em seu modelo:

  • O packageUri deve ser um local que o Functions possa acessar. Considere usar o Armazenamento de Blobs do Azure com uma SAS (assinatura de acesso compartilhado). Depois que a SAS expirar, o Functions não poderá mais acessar o compartilhamento para implantações. Ao regenerar sua SAS, lembre-se de atualizar a configuração de WEBSITE_RUN_FROM_PACKAGE com o novo valor de URI.

  • Ao definir WEBSITE_RUN_FROM_PACKAGE como um URI, você deve sincronizar gatilhos manualmente.

  • Sempre defina todas as configurações necessárias do aplicativo na coleção appSettings ao adicionar ou atualizar as configurações. A atualização remove as configurações existentes que você não define explicitamente. Para obter mais informações, consulte a configuração do aplicativo.

  • As Functions não dão suporte ao Web Deploy (msdeploy) para implantação de pacotes. Você precisa usar a implantação de zip em seus pipelines de implantação e automação. Para obter mais informações, consulte Implantação Zip para Azure Functions.

Builds remotos

O processo de implantação pressupõe que o arquivo .zip que você usa ou uma implantação zip contém um aplicativo pronto para execução. Essa suposição significa que, por padrão, nenhuma personalização é executada.

Alguns cenários exigem que você recompile seu aplicativo remotamente. Um exemplo é quando você precisa incluir pacotes específicos do Linux em Python ou Node.js aplicativos que você desenvolveu em um computador Windows. Nesse caso, você pode configurar o Functions para executar um build remoto em seu código após a implantação de zip.

A maneira como você solicita um build remoto depende do sistema operacional no qual você está implantando:

Quando você implanta um aplicativo no Windows, o processo de implantação executa comandos específicos de linguagem, como dotnet restore para aplicativos C# ou npm install para aplicativos Node.js.

Para habilitar os mesmos processos de build obtidos com integração contínua, adicione SCM_DO_BUILD_DURING_DEPLOYMENT=true às configurações do aplicativo no código de implantação e remova totalmente a WEBSITE_RUN_FROM_PACKAGE configuração.

Contêineres do Linux

Se você estiver implantando um aplicativo de funções contenerizado em um plano Azure Functions Premium ou Dedicado, você deverá:

Se algumas configurações estiverem ausentes, o provisionamento do aplicativo poderá falhar com este erro HTTP/500:

Function app provisioning failed.

Para obter mais informações, consulte a 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 implantar funções contenerizadas em Azure Container Apps, seu modelo deve:

  • Definir o campo kind como um valor de functionapp,linux,container,azurecontainerapps.
  • Defina a propriedade de site managedEnvironmentId como o URI totalmente qualificado do ambiente de Aplicativos de Contêiner.
  • Adicione um link de recurso na coleção dependsOn do site ao criar um recurso Microsoft.App/managedEnvironments ao mesmo tempo que o site.

A definição de um aplicativo de funções em contêineres implantado de um registro de contêiner privado para um ambiente de Aplicativos de Contêiner existente pode ser semelhante a 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 de aplicativo

Em um plano de Consumo Flex, você configura seu aplicativo de funções em Azure com dois tipos de propriedades:

Configuration propriedade Microsoft.Web/sites
Configuração de aplicativo functionAppConfig
Configurações do aplicativo Coleção siteConfig.appSettings

Você mantém essas configurações de aplicativo em functionAppConfig:

Behavior Instalando no functionAppConfig
Instâncias sempre prontas scaleAndConcurrency.alwaysReady
Origem da implantação deployment
Tamanho da instância scaleAndConcurrency.instanceMemoryMB
Simultaneidade do gatilho HTTP scaleAndConcurrency.triggers.http.perInstanceConcurrency
Ambiente de execução de linguagem runtime.name
Versão do idioma runtime.version
Contagem máxima de instâncias scaleAndConcurrency.maximumInstanceCount
Estratégia de atualização de site siteUpdateStrategy.type

O plano Consumo Flex também oferece suporte a essas configurações de aplicativo:

O Functions fornece as seguintes opções para configurar seu aplicativo de funções no Azure:

Configuration propriedade Microsoft.Web/sites
Configurações do site siteConfig
Configurações do aplicativo Coleção siteConfig.appSettings

Essas configurações de site são obrigatórias na propriedade siteConfig:

Essas configurações de site são necessárias somente ao usar identidades gerenciadas para obter a imagem de uma instância do Registro de Contêiner do Azure:

Estas configurações de aplicativo são necessárias (ou recomendadas) para um sistema operacional específico e uma opção de hospedagem:

Estas configurações de aplicativo são necessárias para implantações de contêiner:

Estas configurações só são necessárias ao implantar de um registro de contêiner privado:

Tenha essas considerações em mente ao trabalhar com configurações de site e aplicativo usando arquivos Bicep ou modelos do ARM:

  • A configuração opcional alwaysReady contém uma matriz de um ou mais objetos {name,instanceCount}, cada um representando grupo de escala por função. Esses grupos de escalonamento tomam decisões de escala prontas para uso imediato. Este exemplo define contagens de escala de forma "always-ready"para o grupo http e também para uma função específica chamada helloworld, que usa um tipo de gatilho não agrupado:
      alwaysReady: [
        {
          name: 'http'
          instanceCount: 2
        }
        {
          name: 'function:helloworld'
          instanceCount: 1
        }
      ]
    
  • Considere quando definir WEBSITE_CONTENTSHARE em uma implantação automatizada. Para obter diretrizes detalhadas, veja a referência WEBSITE_CONTENTSHARE.
  • Sempre defina as configurações do aplicativo como uma siteConfig/appSettings coleção do Microsoft.Web/sites recurso que você está criando, conforme mostrado nos exemplos deste artigo. Essa definição garante que as configurações que seu aplicativo de funções precisa para executar estejam disponíveis na inicialização.

  • Ao adicionar ou atualizar as configurações do aplicativo usando modelos, certifique-se de incluir todas as configurações existentes com a atualização. Você precisa fazer isso porque as chamadas à API REST de atualização subjacente substituem todo o recurso /config/appsettings. Se você remover as configurações existentes, seu aplicativo de funções não será executado. Para atualizar programaticamente as configurações individuais do aplicativo, você pode usar o Azure CLI, Azure PowerShell ou o portal Azure para fazer essas alterações. Para obter mais informações, confira Trabalhar com configurações de aplicativo.

  • Quando possível, use conexões baseadas em identidade gerenciada para outros serviços do Azure, incluindo a AzureWebJobsStorage conexão. Para obter mais informações, consulte Configurar uma conexão baseada em identidade.

Implantações de slots

O Functions permite implantar versões diferentes do código em pontos de extremidade exclusivos em seu aplicativo de funções. 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 implantação são um recurso de Azure App Service. O número de slots disponíveis depende do seu plano de hospedagem. Para obter mais informações, consulte slots de implantação do Azure Functions.

Você define um recurso de slot da mesma forma que um recurso de aplicativo de funções (Microsoft.Web/sites), mas, em vez disso, usa o identificador do recurso Microsoft.Web/sites/slots. Para obter um exemplo de implantação (em modelos Bicep e ARM) que cria um slot de produção e um slot de preparo em um plano Premium, consulte Aplicativo de Funções do Azure com um Slot de Implantação.

Para saber mais sobre como trocar slots usando modelos, consulte Automatizar com modelos do Gerenciador de Recursos.

Tenha em mente as seguintes considerações ao trabalhar com implantações de slot:

  • Não defina explicitamente a configuração de WEBSITE_CONTENTSHARE na definição do slot de implantação. O processo de criação do aplicativo no slot de implantação faz com que essa configuração seja gerada automaticamente para você.

  • Quando você troca slots, algumas configurações de aplicativo são consideradas "grudentas", pois permanecem com o slot e não com o código sendo trocado. Você pode definir uma configuração de slot incluindo "slotSetting":true na definição de configuração de aplicativo específica em seu modelo. Para obter mais informações, consulte Gerenciar configurações.

Implantações protegidas

Você pode criar seu aplicativo de funções em uma implantação em que protege um ou mais dos recursos integrando-se com redes virtuais. Um Microsoft.Web/sites/networkConfig recurso define a integração de rede virtual para seu aplicativo de funções. Essa integração depende do aplicativo de funções referenciado e dos recursos de rede virtual. O aplicativo de funções também pode depender de outros recursos da rede privada, como rotas e pontos de extremidade privados. Para obter mais informações, consulte Azure Functions opções de rede.

Esses projetos fornecem exemplos baseados em Bicep de como implantar seus aplicativos de funções em uma rede virtual, inclusive com restrições de acesso à rede:

Ao criar uma implantação que use uma conta de armazenamento protegida, você deve definir explicitamente a WEBSITE_CONTENTSHARE configuração e criar o recurso de compartilhamento de arquivos nomeado nessa configuração. Certifique-se de criar um Microsoft.Storage/storageAccounts/fileServices/shares recurso usando o valor de WEBSITE_CONTENTSHARE, como mostrado neste exemplo (modelo ARM|arquivo Bicep). Você também precisa definir a propriedade vnetContentShareEnabled do site como true.

Note

Quando essas configurações não fazem parte de uma implantação que usa uma conta de armazenamento protegida, você vê esse erro durante a validação da implantação: Could not access storage account using provided connection string.

Esses projetos fornecem exemplos de modelo de Bicep e ARM de como implantar seus aplicativos de funções em uma rede virtual, inclusive com restrições de acesso à rede:

Cenário restrito Description
Criar um aplicativo de funções com integração de rede virtual Você cria seu aplicativo de funções em uma rede virtual com acesso total aos recursos nessa rede. O acesso de entrada e saída ao aplicativo de funções não é restrito. Para saber mais, veja Integração de rede virtual.
Criar um aplicativo de funções que acessa uma conta de armazenamento protegida Seu aplicativo de funções criado usa uma conta de armazenamento protegida, que o Functions acessa usando pontos de extremidade privados. Para obter mais informações, confira Restringir a conta de armazenamento a uma rede virtual.
Criar um aplicativo de funções e uma conta de armazenamento que usam pontos de extremidade privados Seu aplicativo de funções 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, veja Pontos de extremidade privados.

Configurações de rede restrita

Talvez você também precise usar essas configurações quando seu aplicativo de funções tiver restrições de rede:

Setting Value Description
WEBSITE_CONTENTOVERVNET 1 Configuração de aplicativo que permite que o aplicativo de funções seja dimensionado quando a conta de armazenamento é restrita a uma rede virtual. Para obter mais informações, confira Restringir a conta de armazenamento a uma rede virtual.
vnetrouteallenabled 1 Configuração de site que força todo o tráfego do aplicativo de funções a usar a rede virtual. Para obter mais informações, confira Integração de rede virtual regional. Essa configuração de site substitui a configuração do aplicativo WEBSITE_VNET_ROUTE_ALL.

Considerações sobre restrições de rede

Quando você restringe o acesso à conta de armazenamento por meio dos pontos de extremidade privados, não é possível acessar a conta de armazenamento por meio do portal ou de qualquer dispositivo fora da rede virtual. Você pode dar acesso ao endereço IP protegido ou à rede virtual na conta de armazenamento gerenciando a regra de acesso à rede padrão.

Chaves de acesso de função

Defina as chaves de acesso à função no nível do host como recursos do Azure. Essa abordagem permite que você crie e gerencie chaves de host em seus modelos do ARM e arquivos Bicep. Uma chave de host é definida como um recurso do tipo Microsoft.Web/sites/host/functionKeys. O exemplo a seguir cria uma chave de acesso no nível do host chamada my_custom_key quando o aplicativo de funções é criado:

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'))
  ]
}

Nesse exemplo, o parâmetro name é o nome do novo aplicativo de funções. Você deve incluir uma configuração dependsOn para garantir que a chave seja criada com o novo aplicativo de funções. Por fim, o properties objeto da chave de host também pode incluir uma value propriedade que você pode usar para definir uma chave específica.

Quando você não define a propriedade value, 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 práticas recomendadas de segurança para trabalhar com chaves de acesso, consulte Trabalho com chaves de acesso em Azure Functions.

Criar seu modelo

Especialistas com modelos Bicep ou ARM podem codificar manualmente suas implantações usando um editor de texto simples. Para o restante de nós, várias opções facilitam o processo de desenvolvimento:

  • Visual Studio Code: extensões estão disponíveis para ajudá-lo a trabalhar com arquivos Bicep e modelos ARM. Use essas ferramentas para ajudar a garantir que seu código esteja correto. Eles fornecem alguma validação básica.

  • Portal do Azure: quando você criar seu aplicativo de funções e recursos relacionados no portal, a tela final Revisar + criar terá um link Baixar um modelo para automação.

    Link para download do modelo a partir do processo de criação do Azure Functions no portal Azure.

    Este link mostra o modelo do ARM gerado com base nas opções escolhidas no portal. Esse modelo pode parecer um pouco complexo quando você cria um aplicativo de funções com muitos recursos novos. No entanto, pode fornecer uma boa referência sobre a aparência do seu modelo ARM.

Validar o modelo

Quando você cria manualmente o arquivo de modelo de implantação, é importante validar seu modelo antes da implantação. Todos os métodos de implantação validam a sintaxe do modelo e geram uma mensagem de erro validation failed, 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 seu modelo antes da implantação:

A seguinte tarefa de implantação do grupo de recursos do Azure v2 com deploymentMode: 'Validation' instrui o Azure Pipelines a validar o modelo.

- 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 encontrar pré-lançamento e erros de implantação.

Implantar o modelo

Use qualquer um dos seguintes métodos para implantar seu arquivo e modelo Bicep:

Botão Implantar no Azure

Note

Esse método não dá suporte à implantação de arquivos Bicep no momento.

Substitua <url-encoded-path-to-azuredeploy-json> por uma versão codificada em URL do caminho bruto do seu arquivo azuredeploy.json no GitHub.

Este é um exemplo que usa markdown:

[![Deploy to Azure](https://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/<url-encoded-path-to-azuredeploy-json>)

Este é 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>

Implantar usando o PowerShell

Os comandos do PowerShell a seguir criam um grupo de recursos e implantam um arquivo Bicep ou um modelo do ARM que cria um aplicativo de funções com seus recursos necessários. Para executar os comandos localmente, você deve ter o Azure PowerShell instalado. Para entrar 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 essa implantação, use um modelo como este que cria um aplicativo de funções no Windows em um plano de consumo.

Próximas etapas

Saiba mais sobre como desenvolver e configurar Azure Functions.