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

Você pode usar um modelo do Azure Resource Manager para implantar um aplicativo de funções. Este artigo descreve os recursos e os parâmetros necessários para fazer isso. Talvez seja necessário implantar recursos adicionais, dependendo dos gatilhos e associações em seu aplicativo de funções.

Para saber mais sobre a criação de modelos, consulte Criação de modelos do Azure Resource Manager.

Para modelos de exemplo, consulte:

Recursos necessários

Uma implantação do Azure Functions normalmente consiste nesses recursos:

Recurso Requisito Referência da sintaxe e propriedades
Um aplicativo de funções Obrigatório Microsoft.Web/sites
Uma conta de Armazenamento do Azure Obrigatório Microsoft.Storage/storageAccounts
UmComponente do Application Insights Opcional microsoft.insights/componentes
UmPlano de hospedagem Opcional1 Microsoft.Web/serverfarms

1Um plano de hospedagem só é necessário quando você opta por executar o aplicativo de funções em um plano Premium para Contêineres do Windowsou em um Plano do Serviço de Aplicativo.

Dica

Embora não seja necessário, é extremamente recomendável que você configure o Application Insights para seu aplicativo.

Conta de armazenamento

Uma conta de armazenamento do Azure é necessária para um aplicativo de funções. Você precisa de uma conta de finalidade geral que dá suporte a blobs, tabelas, consultas e arquivos. Para saber mais, confira Requisitos da conta de armazenamento do Azure Functions.

{
    "type": "Microsoft.Storage/storageAccounts",
    "name": "[variables('storageAccountName')]",
    "apiVersion": "2019-06-01",
    "location": "[resourceGroup().location]",
    "kind": "StorageV2",
    "sku": {
        "name": "[parameters('storageAccountType')]"
    }
}

Você também deve especificar a propriedade AzureWebJobsStorage como uma configuração de aplicativo na configuração do site. Se o aplicativo de função não usar o Application Insights para monitoramento, também deverá especificar AzureWebJobsDashboard como uma configuração de aplicativo.

O Azure Functions runtime usa a cadeia de conexão AzureWebJobsStorage para criar filas internas. Quando o Application Insights não estiver habilitado, o runtime usará a cadeia de conexão AzureWebJobsDashboard para fazer logon no armazenamento de Tabela do Azure e capacitar a guia Monitor no portal.

Essas propriedades são especificadas na coleção appSettings no objeto siteConfig:

"appSettings": [
    {
        "name": "AzureWebJobsStorage",
        "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2019-06-01').keys[0].value)]"
    },
    {
        "name": "AzureWebJobsDashboard",
        "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2019-06-01').keys[0].value)]"
    }
]

Application Insights

O Application Insights é recomendado para monitorar seus aplicativos de funções. O recurso do Application Insights é definido com o tipo Microsoft. insights/Components e o tipo Web:

        {
            "apiVersion": "2015-05-01",
            "name": "[variables('appInsightsName')]",
            "type": "Microsoft.Insights/components",
            "kind": "web",
            "location": "[resourceGroup().location]",
            "tags": {
                "[concat('hidden-link:', resourceGroup().id, '/providers/Microsoft.Web/sites/', variables('functionAppName'))]": "Resource"
            },
            "properties": {
                "Application_Type": "web",
                "ApplicationId": "[variables('appInsightsName')]"
            }
        },

Além disso, a chave de instrumentação precisa ser fornecida ao aplicativo de funções usando aAPPINSIGHTS_INSTRUMENTATIONKEYconfiguração do aplicativo. Esta propriedade é especificada na coleçãoappSettingsno objetositeConfig:

"appSettings": [
    {
        "name": "APPINSIGHTS_INSTRUMENTATIONKEY",
        "value": "[reference(resourceId('microsoft.insights/components/', variables('appInsightsName')), '2015-05-01').InstrumentationKey]"
    }
]

Plano de hospedagem

A definição do plano de hospedagem varia e pode ser um dos seguintes:

Aplicativo de funções

O recurso do aplicativo de funções é definido usando um recurso do tipo Microsoft.Web/Site e variante functionapp:

{
    "apiVersion": "2015-08-01",
    "type": "Microsoft.Web/sites",
    "name": "[variables('functionAppName')]",
    "location": "[resourceGroup().location]",
    "kind": "functionapp",
    "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]",
        "[resourceId('Microsoft.Insights/components', variables('appInsightsName'))]"
    ]
}

Importante

Se você estiver definindo explicitamente um plano de hospedagem, um item adicional será necessário na matriz de dependências"[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]"

Um aplicativo de funções deve incluir estas configurações do aplicativo:

Nome da configuração Descrição Valores de exemplo
AzureWebJobsStorage Uma cadeia de conexão de uma conta de armazenamento que o tempo de execução da Functions usa para a fila interna ConfiraConta de armazenamento
VERSION_FUNCTIONS_EXTENSION Versão do Azure Functions Runtime ~3
RUNTIME_FUNCTIONS_WORKER A pilha de idiomas a ser usada nas funções deste aplicativo dotnet, node, java, python ou powershell
WEBSITE_NODE_DEFAULT_VERSION Necessário somente se estiver usando anodepilha de idiomas, especifica a versão a ser usada 10.14.1

Estas propriedades são especificadas na coleçãoappSettingsna proprieddesiteConfig:

"properties": {
    "siteConfig": {
        "appSettings": [
            {
                "name": "AzureWebJobsStorage",
                "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2019-06-01').keys[0].value)]"
            },
            {
                "name": "FUNCTIONS_WORKER_RUNTIME",
                "value": "node"
            },
            {
                "name": "WEBSITE_NODE_DEFAULT_VERSION",
                "value": "10.14.1"
            },
            {
                "name": "FUNCTIONS_EXTENSION_VERSION",
                "value": "~3"
            }
        ]
    }
}

Plano de consumo de Implantação

O plano de Consumo aloca automaticamente a potência de computação quando o código está em execução, escala horizontalmente conforme a necessidade para identificar a carga e reduz horizontalmente quando o código não está em execução. Assim, você não precisa pagar pelo tempo limite ocioso das VMs e não precisa reservar a capacidade com antecedência. Para saber mais, confira Escala e hospedagem do Azure Functions.

Para um exemplo de modelo do Azure Resource Manager, consulte Aplicativo de funções no Plano de Consumo.

Criar um Plano de Consumo

Um Plano de Consumo não precisa ser definido. Um será criado automaticamente ou selecionada em uma base por região quando você criar o recurso do aplicativo de funções próprio.

Um Plano de Consumo é um tipo especial de recurso "ServerFarm". Para o Windows,você o especificá-lo usando o valorDynamicpara as propriedadescomputeMode esku:

{
   "type":"Microsoft.Web/serverfarms",
   "apiVersion":"2016-09-01",
   "name":"[variables('hostingPlanName')]",
   "location":"[resourceGroup().location]",
   "properties":{
      "name":"[variables('hostingPlanName')]",
      "computeMode":"Dynamic"
   },
   "sku":{
      "name":"Y1",
      "tier":"Dynamic",
      "size":"Y1",
      "family":"Y",
      "capacity":0
   }
}

Observação

O Plano de Consumo não pode ser explicitamente definido para o Linux. Ele será criado automaticamente.

Se você definir explicitamente o Plano de Consumo, será necessário o conjunto daserverFarmIdpropriedade no aplicativo para que ele aponte para a ID de recurso do plano. Você deve garantir que o aplicativo de funções tenha umadependsOn configuração para o plano.

Criar um aplicativo de funções

As configurações exigidas por um aplicativo de funções em execução no Plano de consumo diferem entre o Windows e o Linux.

Windows

No Windows, um Plano de Consumo requer uma configuração adicional na configuração do site: WEBSITE_CONTENTAZUREFILECONNECTIONSTRING. Esta propriedade configura a conta de armazenamento na qual o código do aplicativo de funções e a configuração são armazenados.

{
    "apiVersion": "2016-03-01",
    "type": "Microsoft.Web/sites",
    "name": "[variables('functionAppName')]",
    "location": "[resourceGroup().location]",
    "kind": "functionapp",
    "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
    ],
    "properties": {
        "siteConfig": {
            "appSettings": [
                {
                    "name": "AzureWebJobsStorage",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2019-06-01').keys[0].value)]"
                },
                {
                    "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2019-06-01').keys[0].value)]"
                },
                {
                    "name": "FUNCTIONS_WORKER_RUNTIME",
                    "value": "node"
                },
                {
                    "name": "WEBSITE_NODE_DEFAULT_VERSION",
                    "value": "10.14.1"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~3"
                }
            ]
        }
    }
}

Importante

Não defina a configuração WEBSITE_CONTENTSHARE em um slot de implantação. Essa configuração é gerada para você quando o aplicativo for criado no slot de implantação.

Linux

No Linux, o aplicativo de funções deve ter seukindconjuntofunctionapp,linux e deve ter areservedpropriedade definida comotrue.

{
    "apiVersion": "2016-03-01",
    "type": "Microsoft.Web/sites",
    "name": "[variables('functionAppName')]",
    "location": "[resourceGroup().location]",
    "kind": "functionapp,linux",
    "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
    ],
    "properties": {
        "siteConfig": {
            "appSettings": [
                {
                    "name": "AzureWebJobsStorage",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountName'),'2019-06-01').keys[0].value)]"
                },
                {
                    "name": "FUNCTIONS_WORKER_RUNTIME",
                    "value": "node"
                },
                {
                    "name": "WEBSITE_NODE_DEFAULT_VERSION",
                    "value": "10.14.1"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~3"
                }
            ]
        },
        "reserved": true
    }
}

AsWEBSITE_CONTENTAZUREFILECONNECTIONSTRINGWEBSITE_CONTENTSHAREconfigurações não estão com suporte no Linux.

Implantação do Plano Premium

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,consultePlano Premium do Azure Functions.

Criar um plano Premium

Um Plano Premium é um tipo especial de recurso "serverfarm". Você pode especificá-lo usandoEP1 EP2ou,ouEP3para oName valor da propriedade nasku Descrição do objeto.

{
    "type": "Microsoft.Web/serverfarms",
    "apiVersion": "2018-02-01",
    "name": "[parameters('hostingPlanName')]",
    "location": "[resourceGroup().location]",
    "properties": {
        "name": "[parameters('hostingPlanName')]",
        "workerSize": "[parameters('workerSize')]",
        "workerSizeId": "[parameters('workerSizeId')]",
        "numberOfWorkers": "[parameters('numberOfWorkers')]",
        "hostingEnvironment": "[parameters('hostingEnvironment')]",
        "maximumElasticWorkerCount": "20"
    },
    "sku": {
        "Tier": "ElasticPremium",
        "Name": "EP1"
    }
}

Criar um aplicativo de funções

Um aplicativo de funções em um Plano Premium deve ter o serverFarmIdconjunto da propriedade como a ID de recurso do plano criado anteriormente. Além do mais,um Plano Premium requer uma configuração extra na configuração do site: WEBSITE_CONTENTAZUREFILECONNECTIONSTRING. Esta propriedade configura a conta de armazenamento na qual o código do aplicativo de funções e a configuração são armazenados.

{
    "apiVersion": "2016-03-01",
    "type": "Microsoft.Web/sites",
    "name": "[variables('functionAppName')]",
    "location": "[resourceGroup().location]",
    "kind": "functionapp",
    "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
    ],
    "properties": {
        "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
        "siteConfig": {
            "appSettings": [
                {
                    "name": "AzureWebJobsStorage",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2019-06-01').keys[0].value)]"
                },
                {
                    "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2019-06-01').keys[0].value)]"
                },
                {
                    "name": "FUNCTIONS_WORKER_RUNTIME",
                    "value": "node"
                },
                {
                    "name": "WEBSITE_NODE_DEFAULT_VERSION",
                    "value": "10.14.1"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~3"
                }
            ]
        }
    }
}

Importante

Não defina aWEBSITE_CONTENTSHAREconfiguração conforme ela é gerada quando o site for criado pela primeira vez.

Implantar um plano do Serviço de Aplicativo

No Plano do Serviço de Aplicativo, seus aplicativos de funções são executados em VMs dedicadas, em SKUs Basic, Standard e Premium, assim como os aplicativos Web. Para obter detalhes sobre como o plano do Serviço de Aplicativo funciona, consulte Visão geral detalhada de planos de Serviço de Aplicativo do Azure.

Para um exemplo de modelo do Azure Resource Manager, consulte Aplicativo de funções no Plano do Serviço de Aplicativo do Azure.

Criar um plano de Serviço de Aplicativo

Plano do Serviço de Aplicativo é definido por um recurso "ServerFarm".

{
    "type": "Microsoft.Web/serverfarms",
    "apiVersion": "2018-02-01",
    "name": "[variables('hostingPlanName')]",
    "location": "[resourceGroup().location]",
    "sku": {
        "name": "S1",
        "tier": "Standard",
        "size": "S1",
        "family": "S",
        "capacity": 1
    }
}

Para executar o aplicativo no Linux, você também deve definir okindparaLinux:

{
    "type": "Microsoft.Web/serverfarms",
    "apiVersion": "2018-02-01",
    "name": "[variables('hostingPlanName')]",
    "location": "[resourceGroup().location]",
    "kind": "Linux",
    "sku": {
        "name": "S1",
        "tier": "Standard",
        "size": "S1",
        "family": "S",
        "capacity": 1
    }
}

Criar um aplicativo de funções

Um aplicativo de funções em um Plano do Serviço de Aplicativo deve ter oserverFarmIdconjunto da propriedade como a ID de recurso do plano criado anteriormente.

{
    "apiVersion": "2016-03-01",
    "type": "Microsoft.Web/sites",
    "name": "[variables('functionAppName')]",
    "location": "[resourceGroup().location]",
    "kind": "functionapp",
    "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
    ],
    "properties": {
        "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
        "siteConfig": {
            "appSettings": [
                {
                    "name": "AzureWebJobsStorage",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2019-06-01').keys[0].value)]"
                },
                {
                    "name": "FUNCTIONS_WORKER_RUNTIME",
                    "value": "node"
                },
                {
                    "name": "WEBSITE_NODE_DEFAULT_VERSION",
                    "value": "10.14.1"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~3"
                }
            ]
        }
    }
}

Os aplicativos do Linux também devem incluir umalinuxFxVersion propriedade emsiteConfig. Se você estiver apenas implantando o código, o valor para isso será determinado pela pilha de tempo de execução desejada no formulário deruntime|runtimeVersion:

Pilha Valor de exemplo
Python python|3.7
JavaScript node|12
.NET dotnet|3.1
{
    "apiVersion": "2016-03-01",
    "type": "Microsoft.Web/sites",
    "name": "[variables('functionAppName')]",
    "location": "[resourceGroup().location]",
    "kind": "functionapp",
    "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
    ],
    "properties": {
        "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
        "siteConfig": {
            "appSettings": [
                {
                    "name": "AzureWebJobsStorage",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2019-06-01').keys[0].value)]"
                },
                {
                    "name": "FUNCTIONS_WORKER_RUNTIME",
                    "value": "node"
                },
                {
                    "name": "WEBSITE_NODE_DEFAULT_VERSION",
                    "value": "10.14.1"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~3"
                }
            ],
            "linuxFxVersion": "node|12"
        }
    }
}

Se você estiverimplantando uma imagem de contêiner personalizada,deverá especificá-la comlinuxFxVersione incluir a configuração que permite que a imagem seja arrastada, como noAplicativo Web para Contêineres. Além disso,definaWEBSITES_ENABLE_APP_SERVICE_STORAGEcomofalse,desde que o conteúdo do aplicativo seja fornecido no próprio contêiner:

{
    "apiVersion": "2016-03-01",
    "type": "Microsoft.Web/sites",
    "name": "[variables('functionAppName')]",
    "location": "[resourceGroup().location]",
    "kind": "functionapp",
    "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
    ],
    "properties": {
        "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
        "siteConfig": {
            "appSettings": [
                {
                    "name": "AzureWebJobsStorage",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2019-06-01').keys[0].value)]"
                },
                {
                    "name": "FUNCTIONS_WORKER_RUNTIME",
                    "value": "node"
                },
                {
                    "name": "WEBSITE_NODE_DEFAULT_VERSION",
                    "value": "10.14.1"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~3"
                },
                {
                    "name": "DOCKER_REGISTRY_SERVER_URL",
                    "value": "[parameters('dockerRegistryUrl')]"
                },
                {
                    "name": "DOCKER_REGISTRY_SERVER_USERNAME",
                    "value": "[parameters('dockerRegistryUsername')]"
                },
                {
                    "name": "DOCKER_REGISTRY_SERVER_PASSWORD",
                    "value": "[parameters('dockerRegistryPassword')]"
                },
                {
                    "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
                    "value": "false"
                }
            ],
            "linuxFxVersion": "DOCKER|myacr.azurecr.io/myimage:mytag"
        }
    }
}

Implantar no Azure Arc

O Azure Functions pode ser implantado no Kubernetes habilitado para Azure Arc. Esse processo segue amplamente a implantação em um plano do Serviço de Aplicativo, com algumas diferenças a serem observadas.

Para criar o aplicativo e planejar recursos, você já deve ter criado um ambiente Kubernetes do Serviço de Aplicativo para um cluster Kubernetes habilitado para o Azure Arc. Esses exemplos presumem que você tenha a ID do recurso do local personalizado e do ambiente Kubernetes do Serviço de Aplicativo em que você está fazendo a implantação. Para a maioria dos modelos, você pode fornecer esses como parâmetros.

{
    "parameters": {
        "kubeEnvironmentId" : {
            "type": "string"
        },
        "customLocationId" : {
            "type": "string"
        }
    }
}

Ambos os sites e planos devem referenciar o local personalizado por meio de um campo extendedLocation. Esse bloco fica fora de properties, par com kind e location:

{
    "extendedLocation": {
        "type": "customlocation",
        "name": "[parameters('customLocationId')]"
    },
}

O recurso de plano deve usar o SKU do Kubernetes (K1) e seu campo kind deve ser "linux,kubernetes". No properties, reserved deve ser "true", e kubeEnvironmentProfile.id deve ser definido como a ID do recurso de ambiente do Kubernetes do Serviço de Aplicativo. Um plano de exemplo pode parecer com o seguinte:

{
    "type": "Microsoft.Web/serverfarms",
    "name": "[variables('hostingPlanName')]",
    "location": "[parameters('location')]",
    "apiVersion": "2020-12-01",
    "kind": "linux,kubernetes",
    "sku": {
        "name": "K1",
        "tier": "Kubernetes"
    },
    "extendedLocation": {
        "type": "customlocation",
        "name": "[parameters('customLocationId')]"
    },
    "properties": {
        "name": "[variables('hostingPlanName')]",
        "location": "[parameters('location')]",
        "workerSizeId": "0",
        "numberOfWorkers": "1",
        "kubeEnvironmentProfile": {
            "id": "[parameters('kubeEnvironmentId')]"
        },
        "reserved": true
    }
}

O recurso do aplicativo de funções deve ter seu campo kind definido como "functionapp,linux,kubernetes" ou "functionapp,linux,kubernetes,container", dependendo se você pretende implantar por meio de código ou de contêiner. Um exemplo de um aplicativo de funções pode ser semelhante ao seguinte:

 {
    "apiVersion": "2018-11-01",
    "type": "Microsoft.Web/sites",
    "name": "[variables('appName')]",
    "kind": "kubernetes,functionapp,linux,container",
    "location": "[parameters('location')]",
    "extendedLocation": {
        "type": "customlocation",
        "name": "[parameters('customLocationId')]"
    },
    "dependsOn": [
        "[resourceId('Microsoft.Insights/components', variables('appInsightsName'))]",
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]",
        "[variables('hostingPlanId')]"
    ],
    "properties": {
        "serverFarmId": "[variables('hostingPlanId')]",
        "siteConfig": {
            "linuxFxVersion": "DOCKER|mcr.microsoft.com/azure-functions/dotnet:3.0-appservice-quickstart",
            "appSettings": [
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~3"
                },
                {
                    "name": "AzureWebJobsStorage",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"

                },
                {
                    "name": "APPINSIGHTS_INSTRUMENTATIONKEY",
                    "value": "[reference(resourceId('microsoft.insights/components/', variables('appInsightsName')), '2015-05-01').InstrumentationKey]"
                }
            ],
            "alwaysOn": true
        }
    }
}

Uma implantação personalizando

Um aplicativo de funções tem muitos recursos filho que podem ser usados na sua implantação, incluindo configurações do aplicativo e opções de controle do código-fonte. Você também pode optar por remover o recurso filho sourcecontrols e usar uma outra opção de implantação.

Importante

Para implantar seu aplicativo com êxito usando o Azure Resource Manager, é importante entender como os recursos são implantados no Azure. No exemplo a seguir, as configurações de nível superior são aplicadas usando siteConfig. É importante definir essas configurações em um nível superior porque transmitem informações para o mecanismo de implantação e de runtime do Functions. Informações de nível superior são necessárias antes do recurso filho sourcecontrols/web ser aplicado. Embora seja possível definir essas configurações no nível de recurso filho config/appSettings, em alguns casos, o aplicativo de funções deve ser implantado antes de config/appSettings ser aplicado. Por exemplo, quando você está usado funções com aplicativos lógicos, as funções são uma dependência de outro recurso.

{
  "apiVersion": "2015-08-01",
  "name": "[parameters('appName')]",
  "type": "Microsoft.Web/sites",
  "kind": "functionapp",
  "location": "[parameters('location')]",
  "dependsOn": [
    "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]",
    "[resourceId('Microsoft.Web/serverfarms', parameters('appName'))]"
  ],
  "properties": {
     "serverFarmId": "[variables('appServicePlanName')]",
     "siteConfig": {
        "alwaysOn": true,
        "appSettings": [
            {
                "name": "FUNCTIONS_EXTENSION_VERSION",
                "value": "~3"
            },
            {
                "name": "Project",
                "value": "src"
            }
        ]
     }
  },
  "resources": [
     {
        "apiVersion": "2015-08-01",
        "name": "appsettings",
        "type": "config",
        "dependsOn": [
          "[resourceId('Microsoft.Web/Sites', parameters('appName'))]",
          "[resourceId('Microsoft.Web/Sites/sourcecontrols', parameters('appName'), 'web')]",
          "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
        ],
        "properties": {
          "AzureWebJobsStorage": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2019-06-01').keys[0].value)]",
          "AzureWebJobsDashboard": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2019-06-01').keys[0].value)]",
          "FUNCTIONS_EXTENSION_VERSION": "~3",
          "FUNCTIONS_WORKER_RUNTIME": "dotnet",
          "Project": "src"
        }
     },
     {
          "apiVersion": "2015-08-01",
          "name": "web",
          "type": "sourcecontrols",
          "dependsOn": [
            "[resourceId('Microsoft.Web/sites/', parameters('appName'))]"
          ],
          "properties": {
            "RepoUrl": "[parameters('sourceCodeRepositoryURL')]",
            "branch": "[parameters('sourceCodeBranch')]",
            "IsManualIntegration": "[parameters('sourceCodeManualIntegration')]"
          }
     }
  ]
}

Dica

Este modelo usa o valor das configurações do aplicativo Projeto, que determina o diretório-base cujo mecanismo de implantação de funções (Kudu) procura o código implantável. Em nosso repositório, nossas funções estão em uma subpasta da pasta src. Assim, no exemplo anterior, definimos o valor de configurações do aplicativo para src. Se as funções estão na raiz do seu repositório, ou se não está implantando do controle de origem, você pode remover esse valor de configurações do aplicativo.

Implantar o modelo

Você pode usar qualquer uma das seguintes maneiras para implantar o modelo:

Botão Implantar no Azure

Substitua <url-encoded-path-to-azuredeploy-json> por uma versão codificada de URL do caminho bruto de seu azuredeploy.json arquivo 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 modelo que cria um aplicativo de funções com seus recursos necessários. Para executar o loca, você deve ter oMicrosoft Azure PowerShellinstalado. Execute Connect-AzAccountpara entrar.

# 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'

# Create the parameters for the file, which for this template is the function app name.
$TemplateParams = @{"appName" = "<function-app-name>"}

# Deploy the template
New-AzResourceGroupDeployment -ResourceGroupName "MyResourceGroup" -TemplateFile template.json -TemplateParameterObject $TemplateParams -Verbose

Para testar essa implantação, você pode usar ummodelo de curtidaque cria um aplicativo de funções no Windows em um Plano de Consumo. Substitua<function-app-name>por um nome exclusivo do aplicativo de funções.

Próximas etapas

Saiba mais sobre como desenvolver e configurar o Azure Functions.