Automatización de la implementación de recursos para una aplicación de función en Azure FunctionsAutomate resource deployment for your function app in Azure Functions

Puede usar una plantilla de Azure Resource Manager para implementar una aplicación de función.You can use an Azure Resource Manager template to deploy a function app. En este artículo se describen los recursos y los parámetros necesarios para hacerlo.This article outlines the required resources and parameters for doing so. Es posible que tenga que implementar recursos adicionales, dependiendo de los desencadenadores y enlaces de la aplicación de función.You might need to deploy additional resources, depending on the triggers and bindings in your function app.

Para más información sobre la creación de plantillas, consulte Creación de plantillas de Azure Resource Manager.For more information about creating templates, see Authoring Azure Resource Manager templates.

Para obtener las plantillas de ejemplo, vea:For sample templates, see:

Recursos necesariosRequired resources

Normalmente, una implementación de Azure Functions consta de estos recursos:An Azure Functions deployment typically consists of these resources:

ResourceResource RequisitoRequirement Referencia de sintaxis y propiedadesSyntax and properties reference
Una aplicación de función.A function app ObligatorioRequired Microsoft.Web/sitesMicrosoft.Web/sites
Una cuenta de Azure Storage.An Azure Storage account ObligatorioRequired Microsoft.Storage/storageAccountsMicrosoft.Storage/storageAccounts
Un componente de Application InsightsAn Application Insights component OpcionalOptional Microsoft.Insights/componentsMicrosoft.Insights/components
Un Plan de hospedajeA hosting plan Opcional1Optional1 Microsoft.Web/serverfarmsMicrosoft.Web/serverfarms

1Un plan de hospedaje solo es necesario si decide ejecutar la aplicación de función en un plan Premium o en un plan de App Service.1A hosting plan is only required when you choose to run your function app on a Premium plan or on an App Service plan.

Sugerencia

Aunque no es necesario, se recomienda encarecidamente configurar Application Insights para su aplicación.While not required, it is strongly recommended that you configure Application Insights for your app.

Cuenta de almacenamientoStorage account

Se necesita una cuenta de Azure Storage para una aplicación de función.An Azure storage account is required for a function app. Se necesita una cuenta de uso general que admita blobs, tablas, colas y archivos.You need a general purpose account that supports blobs, tables, queues, and files. Para más información, vea Requisitos de la cuenta de almacenamiento de Azure Functions.For more information, see Azure Functions storage account requirements.

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

Además, la propiedad AzureWebJobsStorage se debe especificar como una configuración de aplicación en la configuración del sitio.In addition, the property AzureWebJobsStorage must be specified as an app setting in the site configuration. Si la aplicación de función no usa Application Insights para la supervisión, debe especificar también AzureWebJobsDashboard como configuración de aplicación.If the function app doesn't use Application Insights for monitoring, it should also specify AzureWebJobsDashboard as an app setting.

El tiempo de ejecución de Azure Functions usa la cadena de conexión AzureWebJobsStorage para crear colas internas.The Azure Functions runtime uses the AzureWebJobsStorage connection string to create internal queues. Cuando Application Insights no está habilitado, el entorno de tiempo de ejecución usa la cadena de conexión AzureWebJobsDashboard para iniciar sesión en Azure Table Storage y activar la pestaña Supervisión en el portal.When Application Insights is not enabled, the runtime uses the AzureWebJobsDashboard connection string to log to Azure Table storage and power the Monitor tab in the portal.

Estas propiedades se especifican en la colección appSettings del objeto 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)]"
    }
]

Application InsightsApplication Insights

Para la supervisión de las aplicaciones de funciones, se recomienda Application Insights.Application Insights is recommended for monitoring your function apps. El recurso de Application Insights se define con el tipo Microsoft.Insights/components y el tipo web:The Application Insights resource is defined with the type Microsoft.Insights/components and the kind 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')]"
            }
        },

Además, se debe proporcionar la clave de instrumentación a la aplicación de funciones mediante la configuración de la aplicación APPINSIGHTS_INSTRUMENTATIONKEY.In addition, the instrumentation key needs to be provided to the function app using the APPINSIGHTS_INSTRUMENTATIONKEY application setting. Esta propiedad se especifica en la colección appSettings del objeto siteConfig:This property is specified in the appSettings collection in the siteConfig object:

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

Plan de hospedajeHosting plan

La definición del plan de hospedaje varía y puede ser una de las siguientes:The definition of the hosting plan varies, and can be one of the following:

Aplicación de funciónFunction app

El recurso de aplicación de funciones se define mediante un recurso de tipo Microsoft.Web/sites y ewl tipo functionapp:The function app resource is defined by using a resource of type Microsoft.Web/sites and kind 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

Si está definiendo un plan de hospedaje explícitamente, es posible que necesite un elemento adicional en la matriz de dependsOn: "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]"If you are explicitly defining a hosting plan, an additional item would be needed in the dependsOn array: "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]"

Una aplicación de funciones debe incluir esta configuración de la aplicación:A function app must include these application settings:

Nombre del valorSetting name DescripciónDescription Valores de ejemploExample values
AzureWebJobsStorageAzureWebJobsStorage Cadena de conexión a una cuenta de almacenamiento que Functions Runtime usará para la cola internaA connection string to a storage account that the Functions runtime uses for internal queueing Consulte Cuenta de almacenamiento.See Storage account
FUNCTIONS_EXTENSION_VERSIONFUNCTIONS_EXTENSION_VERSION Versión del entorno de ejecución de Azure Functions.The version of the Azure Functions runtime ~2
FUNCTIONS_WORKER_RUNTIMEFUNCTIONS_WORKER_RUNTIME Pila de lenguaje que se usará para las funciones de esta aplicación.The language stack to be used for functions in this app dotnet, node, java, python o powershelldotnet, node, java, python, or powershell
WEBSITE_NODE_DEFAULT_VERSIONWEBSITE_NODE_DEFAULT_VERSION Solo es necesario si usa la pila de lenguaje node y especifica la versión que se usará.Only needed if using the node language stack, specifies the version to use 10.14.1

Estas propiedades se especifican en la colección appSettings de la propiedad siteConfig:These properties are specified in the appSettings collection in the siteConfig property:

"properties": {
    "siteConfig": {
        "appSettings": [
            {
                "name": "AzureWebJobsStorage",
                "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"
            },
            {
                "name": "FUNCTIONS_WORKER_RUNTIME",
                "value": "node"
            },
            {
                "name": "WEBSITE_NODE_DEFAULT_VERSION",
                "value": "10.14.1"
            },
            {
                "name": "FUNCTIONS_EXTENSION_VERSION",
                "value": "~2"
            }
        ]
    }
}

Implementación en el plan de consumoDeploy on Consumption plan

El plan de consumo asigna automáticamente potencia de proceso cuando se ejecuta código, se escala horizontalmente cuando es necesario para gestionar la carga y se reduce horizontalmente cuando no se ejecuta código.The Consumption plan automatically allocates compute power when your code is running, scales out as necessary to handle load, and then scales in when code is not running. No tiene que pagar por VM inactivas y no tiene que reservar capacidad de antemano.You don't have to pay for idle VMs, and you don't have to reserve capacity in advance. Para más información, consulte Escalado y hospedaje de Azure Functions.To learn more, see Azure Functions scale and hosting.

Para obtener una plantilla de Azure Resource Manager de ejemplo, vea Aplicación de función en el plan de consumo.For a sample Azure Resource Manager template, see Function app on Consumption plan.

Crear un plan de consumoCreate a Consumption plan

No es necesario definir un plan de consumo.A Consumption plan does not need to be defined. Se creará o se seleccionará uno automáticamente por región al crear el propio recurso de la aplicación de funciones.One will automatically be created or selected on a per-region basis when you create the function app resource itself.

El plan de consumo es un tipo especial de recurso de "granja de servidores".The Consumption plan is a special type of "serverfarm" resource. Para Windows, se especifica mediante el valor Dynamic para las propiedades computeMode y sku:For Windows, you can specify it by using the Dynamic value for the computeMode and sku properties:

{  
   "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
   }
}

Nota

El plan de consumo no se puede definir explícitamente para Linux.The Consumption plan cannot be explicitly defined for Linux. Se creará automáticamente.It will be created automatically.

Si define explícitamente su plan de consumo, deberá establecer la propiedad serverFarmId en la aplicación, de forma que apunte al identificador de recurso del plan.If you do explicitly define your Consumption plan, you will need to set the serverFarmId property on the app so that it points to the resource ID of the plan. Debe asegurarse de que la aplicación de funciones también tiene una opción dependsOn para el plan.You should ensure that the function app has a dependsOn setting for the plan as well.

Creación de una aplicación de funciónCreate a function app

WindowsWindows

En Windows, un plan de consumo requiere dos configuraciones adicionales en la configuración del sitio: WEBSITE_CONTENTAZUREFILECONNECTIONSTRING y WEBSITE_CONTENTSHARE.On Windows, a Consumption plan requires two additional settings in the site configuration: WEBSITE_CONTENTAZUREFILECONNECTIONSTRING and WEBSITE_CONTENTSHARE. Estas propiedades configuran la cuenta de almacenamiento y la ruta de acceso del archivo donde se almacenan el código y la configuración de la aplicación de función.These properties configure the storage account and file path where the function app code and configuration are stored.

{
    "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'),'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_WORKER_RUNTIME",
                    "value": "node"
                },
                {
                    "name": "WEBSITE_NODE_DEFAULT_VERSION",
                    "value": "10.14.1"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~2"
                }
            ]
        }
    }
}

LinuxLinux

En Linux, la aplicación de funciones debe tener kind establecido en functionapp,linux y la propiedad reserved establecida en true:On Linux, the function app must have its kind set to functionapp,linux, and it must have the reserved property set to true:

{
    "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'),'2015-05-01-preview').key1)]"
                },
                {
                    "name": "FUNCTIONS_WORKER_RUNTIME",
                    "value": "node"
                },
                {
                    "name": "WEBSITE_NODE_DEFAULT_VERSION",
                    "value": "10.14.1"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~2"
                }
            ]
        },
        "reserved": true
    }
}

Implementación en el plan PremiumDeploy on Premium plan

El plan Premium ofrece la misma escala que el plan de consumo, pero incluye funcionalidades adicionales y recursos dedicados.The Premium plan offers the same scaling as the Consumption plan but includes dedicated resources and additional capabilities. Para obtener más información, consulte Plan Premium de Azure Functions.To learn more, see Azure Functions Premium Plan.

Creación de un plan PremiumCreate a Premium plan

Un plan Premium es un tipo especial de recurso de "granja de servidores".A Premium plan is a special type of "serverfarm" resource. Puede especificarlo mediante EP1, EP2 o EP3 para el valor de la propiedad Name en el objeto de descripción de sku.You can specify it by using either EP1, EP2, or EP3 for the Name property value in the sku description object.

{
    "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"
    }
}

Creación de una aplicación de funciónCreate a function app

Una aplicación de funciones en un plan Premium debe tener la propiedad serverFarmId establecida en el identificador de recurso del plan creado anteriormente.A function app on a Premium plan must have the serverFarmId property set to the resource ID of the plan created earlier. Además, un plan Premium requiere dos configuraciones adicionales en la configuración del sitio: WEBSITE_CONTENTAZUREFILECONNECTIONSTRING y WEBSITE_CONTENTSHARE.In addition, a Premium plan requires two additional settings in the site configuration: WEBSITE_CONTENTAZUREFILECONNECTIONSTRING and WEBSITE_CONTENTSHARE. Estas propiedades configuran la cuenta de almacenamiento y la ruta de acceso del archivo donde se almacenan el código y la configuración de la aplicación de función.These properties configure the storage account and file path where the function app code and configuration are stored.

{
    "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'),'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_WORKER_RUNTIME",
                    "value": "node"
                },
                {
                    "name": "WEBSITE_NODE_DEFAULT_VERSION",
                    "value": "10.14.1"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~2"
                }
            ]
        }
    }
}

Implementación de plan de App ServiceDeploy on App Service plan

En el plan de App Service, la aplicación de función se ejecuta en máquinas virtuales dedicadas en las SKU de los niveles Básico, Estándar y Premium, de un modo similar a las aplicaciones web.In the App Service plan, your function app runs on dedicated VMs on Basic, Standard, and Premium SKUs, similar to web apps. Para más información acerca del funcionamiento del plan de App Service, consulte Introducción detallada sobre los planes de Azure App Service.For details about how the App Service plan works, see the Azure App Service plans in-depth overview.

Para obtener una plantilla de Azure Resource Manager de ejemplo, vea Aplicación de función en el plan Azure App Service.For a sample Azure Resource Manager template, see Function app on Azure App Service plan.

Creación de un plan de App ServiceCreate an App Service plan

Un plan de App Service se define mediante un recurso de "granja de servidores".An App Service plan is defined by a "serverfarm" resource.

{
    "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 ejecutar la aplicación en Linux, también debe establecer kind en Linux:To run your app on Linux, you must also set the kind to Linux:

{
    "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
    }
}

Creación de una aplicación de funciónCreate a function app

Una aplicación de funciones en un plan de App Service debe tener la propiedad serverFarmId establecida en el identificador de recurso del plan creado anteriormente.A function app on an App Service plan must have the serverFarmId property set to the resource ID of the plan created earlier.

{
    "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'),'2015-05-01-preview').key1)]"
                },
                {
                    "name": "FUNCTIONS_WORKER_RUNTIME",
                    "value": "node"
                },
                {
                    "name": "WEBSITE_NODE_DEFAULT_VERSION",
                    "value": "10.14.1"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~2"
                }
            ]
        }
    }
}

Las aplicaciones de Linux también deberían incluir una propiedad linuxFxVersion en siteConfig.Linux apps should also include a linuxFxVersion property under siteConfig. Si solo implementa código, el valor viene determinado por la pila en tiempo de ejecución deseada:If you are just deploying code, the value for this is determined by your desired runtime stack:

PilaStack Valor de ejemploExample value
PythonPython DOCKER|microsoft/azure-functions-python3.6:2.0
JavaScriptJavaScript DOCKER|microsoft/azure-functions-node8:2.0
.NET.NET DOCKER|microsoft/azure-functions-dotnet-core2.0:2.0
{
    "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'),'2015-05-01-preview').key1)]"
                },
                {
                    "name": "FUNCTIONS_WORKER_RUNTIME",
                    "value": "node"
                },
                {
                    "name": "WEBSITE_NODE_DEFAULT_VERSION",
                    "value": "10.14.1"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~2"
                }
            ],
            "linuxFxVersion": "DOCKER|microsoft/azure-functions-node8:2.0"
        }
    }
}

Si está implementando una imagen de contenedor personalizada, debe especificarla con linuxFxVersion e incluir una configuración que permita extraer la imagen, como en Web Apps for Containers.If you are deploying a custom container image, you must specify it with linuxFxVersion and include configuration that allows your image to be pulled, as in Web App for Containers. Además, establezca WEBSITES_ENABLE_APP_SERVICE_STORAGE en false, ya que el contenido de la aplicación se proporciona en el propio contenedor:Also, set WEBSITES_ENABLE_APP_SERVICE_STORAGE to false, since your app content is provided in the container itself:

{
    "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'),'2015-05-01-preview').key1)]"
                },
                {
                    "name": "FUNCTIONS_WORKER_RUNTIME",
                    "value": "node"
                },
                {
                    "name": "WEBSITE_NODE_DEFAULT_VERSION",
                    "value": "10.14.1"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~2"
                },
                {
                    "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"
        }
    }
}

Personalización de una implementaciónCustomizing a deployment

Una aplicación de función tiene muchos recursos secundarios que puede usar en la implementación, incluidas la configuración de la aplicación y las opciones de control del código fuente.A function app has many child resources that you can use in your deployment, including app settings and source control options. Es posible que también elija quitar el recurso secundario sourcecontrols y usar otra opción de implementación en su lugar.You also might choose to remove the sourcecontrols child resource, and use a different deployment option instead.

Importante

Para implementar la aplicación de forma correcta mediante Azure Resource Manager, es importante comprender cómo se implementan los recursos en Azure.To successfully deploy your application by using Azure Resource Manager, it's important to understand how resources are deployed in Azure. En el siguiente ejemplo, se aplican configuraciones de nivel superior mediante siteConfig.In the following example, top-level configurations are applied by using siteConfig. Es importante establecer estas configuraciones en un nivel superior porque transmiten información al motor de implementación y en tiempo de ejecución de Functions.It's important to set these configurations at a top level, because they convey information to the Functions runtime and deployment engine. Se necesita información de nivel superior antes de aplicar el recurso secundario sourcecontrols/web.Top-level information is required before the child sourcecontrols/web resource is applied. Aunque es posible configurar estas opciones en el recurso de nivel secundario config/appSettings, en algunos casos debe implementar la aplicación de función antes de que se aplique 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. Por ejemplo, cuando se usan funciones con Logic Apps, las funciones son una dependencia de otro recurso.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": "~2"
            },
            {
                "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)]",
          "FUNCTIONS_EXTENSION_VERSION": "~2",
          "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')]"
          }
     }
  ]
}

Sugerencia

En esta plantilla se usa el valor de configuración de aplicación Project, que establece el directorio base en el que el motor de implementación de Functions (Kudu) busca código que se pueda implementar.This template uses the Project app settings value, which sets the base directory in which the Functions deployment engine (Kudu) looks for deployable code. En nuestro repositorio, nuestras funciones están en una subcarpeta de la carpeta src.In our repository, our functions are in a subfolder of the src folder. Por tanto, en el ejemplo anterior, se establece el valor de configuración de la aplicación en src.So, in the preceding example, we set the app settings value to src. Si las funciones se encuentran en la raíz del repositorio, o si no va a implementar desde el control de código fuente, puede quitar este valor de configuración de la aplicación.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.

Implementación de la plantillaDeploy your template

Puede usar cualquiera de los siguientes métodos para implementar la plantilla:You can use any of the following ways to deploy your template:

Botón Implementación en AzureDeploy to Azure button

Reemplace <url-encoded-path-to-azuredeploy-json> por una versión codificada de la URL de la ruta de acceso sin formato del archivo azuredeploy.json en GitHub.Replace <url-encoded-path-to-azuredeploy-json> with a URL-encoded version of the raw path of your azuredeploy.json file in GitHub.

A continuación se muestra un ejemplo que usa Markdown:Here is an example that uses markdown:

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

A continuación se muestra un ejemplo que 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="https://azuredeploy.net/deploybutton.png"></a>

Implementación mediante PowerShellDeploy using PowerShell

Los siguientes comandos de PowerShell crean un grupo de recursos e implementan una plantilla que crea una aplicación de funciones con los recursos necesarios.The following PowerShell commands create a resource group and deploy a template that create a function app with its required resources. Para la ejecución local, es preciso tener instalado Azure PowerShell.To run locally, you must have Azure PowerShell installed. Ejecute Connect-AzAccount para iniciar sesión.Run Connect-AzAccount to sign in.

# 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 probar esta implementación, puede usar una plantilla como esta, que crea una aplicación de funciones en Windows en un plan de consumo.To test out this deployment, you can use a template like this one that creates a function app on Windows in a Consumption plan. Reemplace <function-app-name> por un nombre único para la aplicación de funciones.Replace <function-app-name> with a unique name for your function app.

Pasos siguientesNext steps

Aprenda a desarrollar y configurar Azure Functions.Learn more about how to develop and configure Azure Functions.