Azure资源模板依赖关系/应用程序洞察

时间:2016-06-01 13:39:07

标签: azure azure-web-sites azure-application-insights azure-resource-manager arm-template

我有一个鸡和蛋问题,将我的Web应用程序部署Application Insights到Azure。在ARM模板中,Application Insights模块依赖于应用程序ID的Web站点(请参阅下面的ARM模板中的依赖项)。另一方面,为了完全检测Web应用程序,我需要Application Insights模块中的检测键。如何解决这个问题?

门户网站的应用洞察视图

Application Insights module in the portal

适用于Web应用程序的ARM模板

Web App ARM Template

针对Application Insights的ARM模板

app insights arm template

3 个答案:

答案 0 :(得分:17)

解决方案是将连接字符串和应用程序设置创建为网站的嵌套子资源。通过使用子资源策略,可以使appsettings依赖于网站应用程序洞察。这允许按以下顺序进行配置:

  1. 网站
  2. Application Insights
  3. 网站配置/ appsettings
  4. 以下两个答案很有帮助。第一个说明了如何提取检测密钥。第二个示例说明如何将应用程序设置和连接字符串嵌套为网站的子资源。

    How to pull the instrumentation key

    How to nest app settings as child resources

    这是我的最终模板:

    {
      "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "webSiteName": {
          "type": "string"
        },
        "aadTenant": {
          "type": "string"
        },
        "aadAudience": {
          "type": "string"
        },
        "endpoints": {
          "type": "string",
          "defaultValue": "n/a"
        },
        "apiEndpoint": {
          "type": "string",
          "defaultValue": "n/a"
        },
        "sqlConnStrName": {
          "type": "string"
        },
        "sqlConnStrValue": {
          "type": "string"
        },
        "skuName": {
          "type": "string",
          "defaultValue": "F1",
          "allowedValues": [
            "F1",
            "D1",
            "B1",
            "B2",
            "B3",
            "S1",
            "S2",
            "S3",
            "P1",
            "P2",
            "P3",
            "P4"
          ],
          "metadata": {
            "description": "Describes plan's pricing tier and instance size. Check details at https://azure.microsoft.com/en-us/pricing/details/app-service/"
          }
        },
        "skuCapacity": {
          "type": "int",
          "defaultValue": 1,
          "minValue": 1,
          "metadata": {
            "description": "Describes plan's instance count"
          }
        }
      },
      "variables": {
        "hostingPlanName": "[concat(parameters('webSiteName'), '-hostingplan')]"
      },
      "resources": [
        {
          "apiVersion": "2015-08-01",
          "name": "[variables('hostingPlanName')]",
          "type": "Microsoft.Web/serverfarms",
          "location": "[resourceGroup().location]",
          "tags": {
            "displayName": "HostingPlan"
          },
          "sku": {
            "name": "[parameters('skuName')]",
            "capacity": "[parameters('skuCapacity')]"
          },
          "properties": {
            "name": "[variables('hostingPlanName')]"
          }
        },
        {
          "apiVersion": "2015-08-01",
          "name": "[parameters('webSiteName')]",
          "type": "Microsoft.Web/sites",
          "location": "[resourceGroup().location]",
          "dependsOn": [
            "[variables('hostingPlanName')]"
          ],
          "tags": {
            "[concat('hidden-related:', resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName')))]": "empty",
            "displayName": "Website"
          },
          "properties": {
            "name": "[parameters('webSiteName')]",
            "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]"
          },
          "resources": [
            {
              "apiVersion": "2015-08-01",
              "name": "appsettings",
              "type": "config",
              "dependsOn": [
                "[parameters('webSiteName')]",
                "[concat('AppInsights', parameters('webSiteName'))]"
              ],
              "properties": {
                "ida:Tenant": "[parameters('aadTenant')]",
                "ida:Audience": "[parameters('aadAudience')]",
                "endpoints": "[parameters('endpoints')]",
                "apiEndpoint": "[parameters('apiEndpoint')]",
                "applicationInsightsInstrumentationKey": "[reference(resourceId('Microsoft.Insights/components', concat('AppInsights', parameters('webSiteName'))), '2014-04-01').InstrumentationKey]"
              }
            },
            {
              "apiVersion": "2015-08-01",
              "type": "config",
              "name": "connectionstrings",
              "dependsOn": [
                "[parameters('webSiteName')]"
              ],
              "properties": {
                "[parameters('sqlConnStrName')]": {
                  "value": "[parameters('sqlConnStrValue')]",
                  "type": "SQLServer"
                }
              }
            },
            {
              "apiVersion": "2015-08-01",
              "name": "logs",
              "type": "config",
              "dependsOn": [
                "[parameters('webSiteName')]"
              ],
              "properties": {
                "applicationLogs": {
                  "fileSystem": {
                    "level": "Off"
                  },
                  "azureTableStorage": {
                    "level": "Off",
                    "sasUrl": null
                  },
                  "azureBlobStorage": {
                    "level": "Information",
                    "sasUrl": "TO DO: pass in a SAS Url",
                    "retentionInDays": null
                  }
                },
                "httpLogs": {
                  "fileSystem": {
                    "retentionInMb": 40,
                    "enabled": true
                  }
                },
                "failedRequestsTracing": {
                  "enabled": true
                },
                "detailedErrorMessages": {
                  "enabled": true
                }
              }
            }
          ]
        },
        {
          "apiVersion": "2014-04-01",
          "name": "[concat(variables('hostingPlanName'), '-', resourceGroup().name)]",
          "type": "Microsoft.Insights/autoscalesettings",
          "location": "[resourceGroup().location]",
          "tags": {
            "[concat('hidden-link:', resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName')))]": "Resource",
            "displayName": "AutoScaleSettings"
          },
          "dependsOn": [
            "[variables('hostingPlanName')]"
          ],
          "properties": {
            "profiles": [
              {
                "name": "Default",
                "capacity": {
                  "minimum": 1,
                  "maximum": 2,
                  "default": 1
                },
                "rules": [
                  {
                    "metricTrigger": {
                      "metricName": "CpuPercentage",
                      "metricResourceUri": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
                      "timeGrain": "PT1M",
                      "statistic": "Average",
                      "timeWindow": "PT10M",
                      "timeAggregation": "Average",
                      "operator": "GreaterThan",
                      "threshold": 80.0
                    },
                    "scaleAction": {
                      "direction": "Increase",
                      "type": "ChangeCount",
                      "value": 1,
                      "cooldown": "PT10M"
                    }
                  },
                  {
                    "metricTrigger": {
                      "metricName": "CpuPercentage",
                      "metricResourceUri": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
                      "timeGrain": "PT1M",
                      "statistic": "Average",
                      "timeWindow": "PT1H",
                      "timeAggregation": "Average",
                      "operator": "LessThan",
                      "threshold": 60.0
                    },
                    "scaleAction": {
                      "direction": "Decrease",
                      "type": "ChangeCount",
                      "value": 1,
                      "cooldown": "PT1H"
                    }
                  }
                ]
              }
            ],
            "enabled": false,
            "name": "[concat(variables('hostingPlanName'), '-', resourceGroup().name)]",
            "targetResourceUri": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]"
          }
        },
        {
          "apiVersion": "2014-04-01",
          "name": "[concat('ServerErrors ', parameters('webSiteName'))]",
          "type": "Microsoft.Insights/alertrules",
          "location": "[resourceGroup().location]",
          "dependsOn": [
            "[parameters('webSiteName')]"
          ],
          "tags": {
            "[concat('hidden-link:', resourceId('Microsoft.Web/sites', parameters('webSiteName')))]": "Resource",
            "displayName": "ServerErrorsAlertRule"
          },
          "properties": {
            "name": "[concat('ServerErrors ', parameters('webSiteName'))]",
            "description": "[concat(parameters('webSiteName'), ' has some server errors, status code 5xx.')]",
            "isEnabled": true,
            "condition": {
              "odata.type": "Microsoft.Azure.Management.Insights.Models.ThresholdRuleCondition",
              "dataSource": {
                "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleMetricDataSource",
                "resourceUri": "[resourceId('Microsoft.Web/sites', parameters('webSiteName'))]",
                "metricName": "Http5xx"
              },
              "operator": "GreaterThan",
              "threshold": 5.0,
              "windowSize": "PT5M"
            },
            "action": {
              "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleEmailAction",
              "sendToServiceOwners": true,
              "customEmails": ["you@example.com"]
            }
          }
        },
        {
          "apiVersion": "2014-04-01",
          "name": "[concat('ForbiddenRequests ', parameters('webSiteName'))]",
          "type": "Microsoft.Insights/alertrules",
          "location": "[resourceGroup().location]",
          "dependsOn": [
            "[parameters('webSiteName')]"
          ],
          "tags": {
            "[concat('hidden-link:', resourceId('Microsoft.Web/sites', parameters('webSiteName')))]": "Resource",
            "displayName": "ForbiddenRequestsAlertRule"
          },
          "properties": {
            "name": "[concat('ForbiddenRequests ', parameters('webSiteName'))]",
            "description": "[concat(parameters('webSiteName'), ' has some requests that are forbidden, status code 403.')]",
            "isEnabled": true,
            "condition": {
              "odata.type": "Microsoft.Azure.Management.Insights.Models.ThresholdRuleCondition",
              "dataSource": {
                "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleMetricDataSource",
                "resourceUri": "[resourceId('Microsoft.Web/sites', parameters('webSiteName'))]",
                "metricName": "Http403"
              },
              "operator": "GreaterThan",
              "threshold": 5,
              "windowSize": "PT5M"
            },
            "action": {
              "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleEmailAction",
              "sendToServiceOwners": true,
              "customEmails": [ ]
            }
          }
        },
        {
          "apiVersion": "2014-04-01",
          "name": "[concat('CPUHigh ', variables('hostingPlanName'))]",
          "type": "Microsoft.Insights/alertrules",
          "location": "[resourceGroup().location]",
          "dependsOn": [
            "[variables('hostingPlanName')]"
          ],
          "tags": {
            "[concat('hidden-link:', resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName')))]": "Resource",
            "displayName": "CPUHighAlertRule"
          },
          "properties": {
            "name": "[concat('CPUHigh ', variables('hostingPlanName'))]",
            "description": "[concat('The average CPU is high across all the instances of ', variables('hostingPlanName'))]",
            "isEnabled": false,
            "condition": {
              "odata.type": "Microsoft.Azure.Management.Insights.Models.ThresholdRuleCondition",
              "dataSource": {
                "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleMetricDataSource",
                "resourceUri": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
                "metricName": "CpuPercentage"
              },
              "operator": "GreaterThan",
              "threshold": 90,
              "windowSize": "PT15M"
            },
            "action": {
              "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleEmailAction",
              "sendToServiceOwners": true,
              "customEmails": [ ]
            }
          }
        },
        {
          "apiVersion": "2014-04-01",
          "name": "[concat('LongHttpQueue ', variables('hostingPlanName'))]",
          "type": "Microsoft.Insights/alertrules",
          "location": "[resourceGroup().location]",
          "dependsOn": [
            "[variables('hostingPlanName')]"
          ],
          "tags": {
            "[concat('hidden-link:', resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName')))]": "Resource",
            "displayName": "AutoScaleSettings"
          },
          "properties": {
            "name": "[concat('LongHttpQueue ', variables('hostingPlanName'))]",
            "description": "[concat('The HTTP queue for the instances of ', variables('hostingPlanName'), ' has a large number of pending requests.')]",
            "isEnabled": false,
            "condition": {
              "odata.type": "Microsoft.Azure.Management.Insights.Models.ThresholdRuleCondition",
              "dataSource": {
                "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleMetricDataSource",
                "resourceUri": "[concat(resourceGroup().id, '/providers/Microsoft.Web/serverfarms/', variables('hostingPlanName'))]",
                "metricName": "HttpQueueLength"
              },
              "operator": "GreaterThan",
              "threshold": 100.0,
              "windowSize": "PT5M"
            },
            "action": {
              "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleEmailAction",
              "sendToServiceOwners": true,
              "customEmails": [ ]
            }
          }
        },
        {
          "apiVersion": "2014-04-01",
          "name": "[concat('AppInsights', parameters('webSiteName'))]",
          "type": "Microsoft.Insights/components",
          "location": "Central US",
          "dependsOn": [
            "[parameters('webSiteName')]"
          ],
          "tags": {
            "[concat('hidden-link:', resourceId('Microsoft.Web/sites', parameters('webSiteName')))]": "Resource",
            "displayName": "AppInsightsComponent"
          },
          "properties": {
            "ApplicationId": "[parameters('webSiteName')]"
          }
        }
      ],
      "outputs": {
        "siteUri": {
          "type": "string",
          "value": "[reference(concat('Microsoft.Web/sites/', parameters('webSiteName')), '2015-08-01').hostnames[0]]"
        }
      }
    
    }
    

答案 1 :(得分:2)

替代和更新的答案(2020/03):执行Azure Portal UX的操作(可以在创建Webapp的最后一步中通过“下载模板”查看)。

对于应用程序见解资源,您不一定需要等待网站资源被创建。根据applicationInsights ARM,website.Name用于applicaitonInsights.properties.ApplicationId。 由于您同时创建两者,因此可以将名称值从输入传递给ApplicationInsights和网站资源:

{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "subscriptionId": {
            "type": "string"
        },
        "name": {
            "type": "string"
        },
        "location": {
            "type": "string"
        },
        "hostingEnvironment": {
            "type": "string"
        },
        "hostingPlanName": {
            "type": "string"
        },
        "serverFarmResourceGroup": {
            "type": "string"
        },
        "alwaysOn": {
            "type": "bool"
        },
        "sku": {
            "type": "string"
        },
        "skuCode": {
            "type": "string"
        },
        "workerSize": {
            "type": "string"
        },
        "workerSizeId": {
            "type": "string"
        },
        "numberOfWorkers": {
            "type": "string"
        },
        "currentStack": {
            "type": "string"
        },
        "netFrameworkVersion": {
            "type": "string"
        }
    },
    "resources": [
        {
            "apiVersion": "2018-11-01",
            "name": "[parameters('name')]",
            "type": "Microsoft.Web/sites",
            "location": "[parameters('location')]",
            "tags": {},
            "dependsOn": [
                "microsoft.insights/components/testapp01",
                "[concat('Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]"
            ],
            "properties": {
                "name": "[parameters('name')]",
                "siteConfig": {
                    "appSettings": [
                        {
                            "name": "APPINSIGHTS_INSTRUMENTATIONKEY",
                            "value": "[reference('microsoft.insights/components/testapp01', '2015-05-01').InstrumentationKey]"
                        },
                        {
                            "name": "APPLICATIONINSIGHTS_CONNECTION_STRING",
                            "value": "[reference('microsoft.insights/components/testapp01', '2015-05-01').ConnectionString]"
                        },
                        {
                            "name": "ApplicationInsightsAgent_EXTENSION_VERSION",
                            "value": "~2"
                        }
                    ],
                    "metadata": [
                        {
                            "name": "CURRENT_STACK",
                            "value": "[parameters('currentStack')]"
                        }
                    ],
                    "netFrameworkVersion": "[parameters('netFrameworkVersion')]",
                    "alwaysOn": "[parameters('alwaysOn')]"
                },
                "serverFarmId": "[concat('/subscriptions/', parameters('subscriptionId'),'/resourcegroups/', parameters('serverFarmResourceGroup'), '/providers/Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]",
                "hostingEnvironment": "[parameters('hostingEnvironment')]",
                "clientAffinityEnabled": true
            }
        },
        {
            "apiVersion": "2018-11-01",
            "name": "[parameters('hostingPlanName')]",
            "type": "Microsoft.Web/serverfarms",
            "location": "[parameters('location')]",
            "kind": "",
            "tags": {},
            "dependsOn": [],
            "properties": {
                "name": "[parameters('hostingPlanName')]",
                "workerSize": "[parameters('workerSize')]",
                "workerSizeId": "[parameters('workerSizeId')]",
                "numberOfWorkers": "[parameters('numberOfWorkers')]",
                "hostingEnvironment": "[parameters('hostingEnvironment')]"
            },
            "sku": {
                "Tier": "[parameters('sku')]",
                "Name": "[parameters('skuCode')]"
            }
        },
        {
            "apiVersion": "2015-05-01",
            "name": "testapp01",
            "type": "microsoft.insights/components",
            "location": "centralus",
            "tags": {},
            "properties": {
                "ApplicationId": "[parameters('name')]",
                "Request_Source": "IbizaWebAppExtensionCreate"
            }
        }
    ]
}

创建顺序如下:

  1. Application Insights资源
  2. 应用服务网络应用

答案 2 :(得分:0)

要详细说明Mikl X答案,您可以让网站依赖于应用程序见解资源,并在网站的应用程序设置上设置检测键。

跳过不相关的部分:

    "resources": [
        {
            "type": "Microsoft.Insights/components",
            "name": "[variables('appInsightsName')]"
            ... more config
        },
        {
            "type": "Microsoft.Web/sites",
            "name": "[variables('apiName')]",
            "dependsOn": [
                "[resourceId('Microsoft.Insights/components', variables('appInsightsName'))]" <-- ensure app insights is created first
            ],
            "properties": {
                "siteConfig": {
                    "appSettings": [
                        {
                            "name": "APPINSIGHTS_INSTRUMENTATIONKEY",
                            "value": "[reference(variables('appInsightsName')).InstrumentationKey]" <-- use key of previously created resource
                        }
                    ]
                }
            }
        }
        ... more config
    ]