为 Azure Functions 中的函数应用自动执行资源部署

可以使用 Azure 资源管理器模板来部署函数应用。 本文概述了完成此操作所需的资源和参数。 可能还需要部署其他资源,具体取决于函数应用中的触发器和绑定

有关创建模板的详细信息,请参阅创作 Azure 资源管理器模板

有关示例模板,请参阅:

所需资源

函数应用需要以下资源:

  • Azure 存储帐户
  • 托管计划(应用服务计划)
  • 函数应用

有关这些资源的 JSON 语法和属性,请参阅:

存储帐户

函数应用需要 Azure 存储帐户。 你需要一个支持 blob、表、队列和文件的常规用途帐户。 有关详细信息,请参阅 Azure Functions 存储帐户要求

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

此外,在站点配置中,必须将属性 AzureWebJobsStorage 指定为应用设置。 函数应用应将 AzureWebJobsDashboard 指定为应用设置。

Azure Functions 运行时使用 AzureWebJobsStorage 连接字符串创建内部队列。 运行时使用 AzureWebJobsDashboard 连接字符串登录到 Azure 表存储并为为门户中的“监视器”选项卡提供支持。

这些属性在 siteConfig 对象中的 appSettings 集合中指定:

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

托管计划

托管计划的定义取决于是否使用应用服务计划。 请参阅基于应用服务计划部署函数应用

函数应用

函数应用资源使用 Microsoft.Web/Site 类型和 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'))]"
    ]

基于应用服务计划部署函数应用

在应用服务计划中,函数应用在基本、标准和高级 SKU 中的专用 VM 上运行,类似于 Web 应用。 如需详细了解如何使用应用服务计划,请参阅 Azure 应用服务计划深入概述

有关 Azure 资源管理器模板示例,请参阅基于 Azure 应用服务计划的函数应用

创建应用服务计划

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

创建函数应用

选择缩放选项后,便会创建函数应用。 该应用是一个包含所有函数的容器。

函数应用有许多可用于部署的子资源,包括应用设置和源代码管理选项。 还可以选择删除 sourcecontrols 子资源,改用另一个部署选项。

Important

若要使用 Azure 资源管理器成功部署应用程序,了解如何在 Azure 中部署资源尤为重要。 在下面的示例中,通过使用 siteConfig 应用顶级配置。 请务必在顶级设置这些配置,因为这些配置会将信息传达给 Functions 运行时和部署引擎。 应用 sourcecontrols/web 子资源前,需要顶级信息。 虽然可以在子级别 config/appSettings 资源中配置这些设置,但在某些情况下,需要在应用 config/appSettings 之前部署函数应用。 比如在逻辑应用中使用函数时,函数是另一资源的依赖项。

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

Tip

此模板使用 Project 应用设置值,这将设置基本目录,Functions 部署引擎 (Kudu) 在此目录中查找可部署代码。 在存储库内,函数位于 src 文件夹的子文件夹中。 因此,在前一个示例中,将应用设置值设置为 src。 如果函数位于存储库的根目录中,或者不从源代码管理进行部署,则可删除此应用设置值。

部署模板

可以使用以下任意方法部署模板:

“部署到 Azure”按钮

<url-encoded-path-to-azuredeploy-json> 替换为 GitHub 中 azuredeploy.json 文件的原始路径的 URL 编码版本。

以下示例使用 Markdown:

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

以下示例使用 HTML:

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

后续步骤

深入了解如何开发和配置 Azure Functions。