Automatizzare la distribuzione di risorse per l'app per le funzioni in Funzioni di AzureAutomate resource deployment for your function app in Azure Functions

È possibile usare un modello di Azure Resource Manager per distribuire un'app per le funzioni.You can use an Azure Resource Manager template to deploy a function app. Questo articolo descrive le risorse e i parametri necessari per questa operazione.This article outlines the required resources and parameters for doing so. A seconda dei trigger e dei binding potrebbe essere necessario distribuire risorse aggiuntive nell'app per le funzioni.You might need to deploy additional resources, depending on the triggers and bindings in your function app.

Per altre informazioni sulla creazione dei modelli, vedere Creazione di modelli di Azure Resource Manager.For more information about creating templates, see Authoring Azure Resource Manager templates.

Per i modelli di esempio, vedere:For sample templates, see:

Risorse necessarieRequired resources

Un'app per le funzioni richiede le risorse seguenti:A function app requires these resources:

  • Un account di archiviazione di AzureAn Azure Storage account
  • Un piano di hosting (piano a consumo o piano di servizio app)A hosting plan (Consumption plan or App Service plan)
  • Un'app per le funzioniA function app

Account di archiviazioneStorage account

Per un'app per le funzioni è necessario l'account di archiviazione di Azure.An Azure storage account is required for a function app. È necessario un account per utilizzo generico che supporti BLOB, tabelle, code e i file.You need a general purpose account that supports blobs, tables, queues, and files. Per altre informazioni, vedere i requisiti dell'account di archiviazione per Funzioni di Azure.For more information, see Azure Functions storage account requirements.

{
    "type": "Microsoft.Storage/storageAccounts",
    "name": "[variables('storageAccountName')]",
    "apiVersion": "2015-06-15",
    "location": "[resourceGroup().location]",
    "properties": {
        "accountType": "[parameters('storageAccountType')]"
    }
}

È anche necessario specificare le proprietà AzureWebJobsStorage e AzureWebJobsDashboard come impostazioni dell'app nella configurazione del sito.In addition, the properties AzureWebJobsStorage and AzureWebJobsDashboard must be specified as app settings in the site configuration. Il runtime di Funzioni di Azure usa la stringa di connessione AzureWebJobsStorage per creare code interne.The Azure Functions runtime uses the AzureWebJobsStorage connection string to create internal queues. La stringa di connessione AzureWebJobsDashboard viene usata per accedere all'archivio tabelle di Azure e abilitare la scheda Monitoraggio nel portale.The connection string AzureWebJobsDashboard is used to log to Azure Table storage and power the Monitor tab in the portal.

Queste proprietà sono specificate nella raccolta appSettings dell'oggetto siteConfig:These properties are specified in the appSettings collection in the siteConfig object:

"appSettings": [
    {
        "name": "AzureWebJobsStorage",
        "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"
    },
    {
        "name": "AzureWebJobsDashboard",
        "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"
    }

Piano di hostingHosting plan

La definizione del piano di hosting varia a seconda che si usi un piano a consumo o un piano di servizio app.The definition of the hosting plan varies, depending on whether you use a Consumption or App Service plan. Vedere Distribuire un'app per le funzioni nel piano a consumo e Distribuire un'app per le funzioni nel piano di servizio app.See Deploy a function app on the Consumption plan and Deploy a function app on the App Service plan.

App per le funzioniFunction app

L'app per le funzioni viene definita usando una risorsa Microsoft.Web/Site di tipo functionapp:The function app resource is defined by using a resource of type Microsoft.Web/Site and kind functionapp:

{
    "apiVersion": "2015-08-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'))]"
    ]

Distribuire un'app per le funzioni nel piano a consumoDeploy a function app on the Consumption plan

È possibile eseguire un'app per le funzioni in due modalità diverse, ovvero con piano a consumo e piano di servizio app di Azure.You can run a function app in two different modes: the Consumption plan and the App Service plan. Il piano a consumo alloca automaticamente funzionalità di calcolo durante l'esecuzione del codice, aumenta il numero di istanze in base alla necessità per gestire il carico e quindi riduce le prestazioni quando il codice non è in esecuzione.The Consumption plan automatically allocates compute power when your code is running, scales out as necessary to handle load, and then scales down when code is not running. Non è quindi necessario pagare per le macchine virtuali inattive e riservare in anticipo la capacità.So, you don't have to pay for idle VMs, and you don't have to reserve capacity in advance. Per altre informazioni sui piani di hosting, vedere Piani a consumo e piani di servizio app di Funzioni di Azure.To learn more about hosting plans, see Azure Functions Consumption and App Service plans.

Per un modello di Azure Resource Manager di esempio, vedere App per le funzioni nel piano a consumo.For a sample Azure Resource Manager template, see [Function app on Consumption plan].

Creare un piano a consumoCreate a Consumption plan

Un piano a consumo è un tipo particolare di risorsa "serverfarm".A Consumption plan is a special type of "serverfarm" resource. Viene specificato usando il valore Dynamic per le proprietà computeMode e sku:You specify it by using the Dynamic value for the computeMode and sku properties:

{
    "type": "Microsoft.Web/serverfarms",
    "apiVersion": "2015-04-01",
    "name": "[variables('hostingPlanName')]",
    "location": "[resourceGroup().location]",
    "properties": {
        "name": "[variables('hostingPlanName')]",
        "computeMode": "Dynamic",
        "sku": "Dynamic"
    }
}

Creare un'app per le funzioniCreate a function app

Un piano a consumo richiede anche due impostazioni aggiuntive nella configurazione del sito: WEBSITE_CONTENTAZUREFILECONNECTIONSTRING e WEBSITE_CONTENTSHARE.In addition, a Consumption plan requires two additional settings in the site configuration: WEBSITE_CONTENTAZUREFILECONNECTIONSTRING and WEBSITE_CONTENTSHARE. Queste proprietà consentono di configurare l'account di archiviazione e il percorso in cui vengono archiviati il codice dell'app per le funzioni e la configurazione.These properties configure the storage account and file path where the function app code and configuration are stored.

{
    "apiVersion": "2015-08-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": "AzureWebJobsDashboard",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"
                },
                {
                    "name": "AzureWebJobsStorage",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"
                },
                {
                    "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"
                },
                {
                    "name": "WEBSITE_CONTENTSHARE",
                    "value": "[toLower(variables('functionAppName'))]"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~1"
                }
            ]
        }
    }
}

Distribuire un'app per le funzioni nel piano di servizio appDeploy a function app on the App Service plan

Nel piano di servizio app, le app per le funzioni vengono eseguite in macchine virtuali dedicate in SKU Basic, Standard e Premium, analogamente alle app Web.In the App Service plan, your function app runs on dedicated VMs on Basic, Standard, and Premium SKUs, similar to web apps. Per informazioni dettagliate sul funzionamento del piano di servizio app, vedere Panoramica approfondita dei piani di servizio app di Azure.For details about how the App Service plan works, see the Azure App Service plans in-depth overview.

Per un modello di Azure Resource Manager di esempio, vedere App per le funzioni nel piano di servizio app di Azure.For a sample Azure Resource Manager template, see [Function app on Azure App Service plan].

Creare un piano di servizio appCreate an App Service plan

{
    "type": "Microsoft.Web/serverfarms",
    "apiVersion": "2015-04-01",
    "name": "[variables('hostingPlanName')]",
    "location": "[resourceGroup().location]",
    "properties": {
        "name": "[variables('hostingPlanName')]",
        "sku": "[parameters('sku')]",
        "workerSize": "[parameters('workerSize')]",
        "hostingEnvironment": "",
        "numberOfWorkers": 1
    }
}

Creare un'app per le funzioniCreate a function app

Dopo aver selezionato un'opzione di scalabilità, creare un'app per le funzioni.After you've selected a scaling option, create a function app. L'app è il contenitore che incorpora tutte le funzioni.The app is the container that holds all your functions.

Un'app per le funzioni contiene numerose risorse figlio che possono essere usate nella distribuzione, incluse le impostazioni dell'app e le opzioni di controllo del codice sorgente.A function app has many child resources that you can use in your deployment, including app settings and source control options. È anche possibile scegliere di rimuovere la risorsa figlio sourcecontrols e usare un'altra opzione di distribuzione.You also might choose to remove the sourcecontrols child resource, and use a different deployment option instead.

Importante

Per poter distribuire l'applicazione usando Azure Resource Manager, è importante comprendere come vengono distribuite le risorse in Azure.To successfully deploy your application by using Azure Resource Manager, it's important to understand how resources are deployed in Azure. Nell'esempio seguente, le configurazioni di livello superiore vengono applicate usando siteConfig.In the following example, top-level configurations are applied by using siteConfig. È importante impostare le configurazioni a un livello superiore perché forniscono informazioni al motore di runtime e di distribuzione di Funzioni di Azure.It's important to set these configurations at a top level, because they convey information to the Functions runtime and deployment engine. Le informazioni di livello superiore sono necessarie prima di applicare la risorsa figlia sourcecontrols/web.Top-level information is required before the child sourcecontrols/web resource is applied. Anche se è possibile configurare queste impostazioni nella risorsa config/appSettings del livello figlio, in alcuni casi l'app per le funzioni deve essere distribuita prima di applicare config/appSettings.Although it's possible to configure these settings in the child-level config/appSettings resource, in some cases your function app must be deployed before config/appSettings is applied. Quando ad esempio si usano le funzioni con app per la logica, le funzioni sono una dipendenza di un'altra risorsa.For example, when you are using functions with Logic Apps, your functions are a dependency of another resource.

{
  "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": "~1" },
            { "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'),'2015-05-01-preview').key1)]",
          "AzureWebJobsDashboard": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"
        }
     },
     {
          "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')]"
          }
     }
  ]
}

Suggerimento

Questo modello usa il valore dell'impostazione app Project, che imposta la directory di base in cui il motore di distribuzione di Funzioni di Azure (Kudu) cercherà il codice distribuibile.This template uses the Project app settings value, which sets the base directory in which the Functions deployment engine (Kudu) looks for deployable code. Nel repository le funzioni sono in una sottocartella della cartella src.In our repository, our functions are in a subfolder of the src folder. Pertanto, nell'esempio precedente abbiamo impostato il valore di impostazione dell'app su src.So, in the preceding example, we set the app settings value to src. Se le funzioni sono nella radice del repository o se non si sta distribuendo dal controllo del codice sorgente, è possibile rimuovere questo valore di impostazione dell'app.If your functions are in the root of your repository, or if you are not deploying from source control, you can remove this app settings value.

Distribuire il modelloDeploy your template

Il modello può essere distribuito in uno dei modi seguenti:You can use any of the following ways to deploy your template:

Pulsante Deploy to Azure per la distribuzione in AzureDeploy to Azure button

Sostituire <url-encoded-path-to-azuredeploy-json> con una versione con codifica URL del percorso non elaborato del file azuredeploy.json in GitHub.Replace <url-encoded-path-to-azuredeploy-json> with a URL-encoded version of the raw path of your azuredeploy.json file in GitHub.

Di seguito è riportato un esempio che usa la sintassi markdown:Here is an example that uses markdown:

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

Di seguito è riportato un esempio che usa HTML:Here is an example that uses HTML:

<a href="https://portal.azure.com/#create/Microsoft.Template/uri/<url-encoded-path-to-azuredeploy-json>" target="_blank"><img src="http://azuredeploy.net/deploybutton.png"></a>

Passaggi successiviNext steps

Altre informazioni su come sviluppare e configurare le Funzioni di Azure.Learn more about how to develop and configure Azure Functions.