Eseguire il provisioning di un'app Web con un database SQL

In questo argomento si apprenderà come creare un modello di Gestione risorse di Azure che consente di distribuire un'app Web e un database SQL. Verrà illustrato come definire le risorse da distribuire e i parametri specificati quando viene eseguita la distribuzione. È possibile usare questo modello per le proprie distribuzioni o personalizzarlo in base alle esigenze.

Per altre informazioni sulla creazione dei modelli, vedere Creazione di modelli di Gestione risorse di Azure.

Per altre informazioni sulla distribuzione di app, vedere Distribuire un'applicazione complessa in modo prevedibile in Azure.

Per il modello completo, vedere Modello di app Web con database SQL.

Nota

Sebbene in questo articolo si faccia riferimento alle app Web, è applicabile anche ad app per le API e app per dispositivi mobili.

Elementi distribuiti

In questo modello, verrà distribuito quanto segue:

  • Un'app Web
  • Server di database SQL
  • Database SQL
  • Impostazioni di scalabilità automatica
  • Regole di avviso
  • Informazioni sull'app

Per eseguire automaticamente la distribuzione, fare clic sul pulsante seguente:

Distribuzione in Azure

Parametri da specificare

Gestione risorse di Azure permette di definire i parametri per i valori da specificare durante la distribuzione del modello. Il modello include una sezione denominata Parametri che contiene tutti i valori dei parametri. È necessario definire un parametro per i valori che variano in base al progetto distribuito o all'ambiente in cui viene distribuito il progetto. Non definire i parametri per i valori che rimangono invariati. Ogni valore di parametro nel modello viene usato per definire le risorse distribuite.

Durante la definizione dei parametri, usare il campo allowedValues per specificare i valori che l'utente può fornire durante la distribuzione. Usare il campo defaultValue per assegnare un valore al parametro, se non viene specificato alcun valore durante la distribuzione.

Di seguito è fornita la descrizione di ogni parametro del modello.

siteName

Il nome dell'app Web che si desidera creare.

"siteName":{
  "type":"string"
}

hostingPlanName

Il nome del piano di servizio app da usare per l'hosting dell'app Web.

"hostingPlanName":{
  "type":"string"
}

sku

Il piano tariffario del piano di hosting.

"sku": {
  "type": "string",
  "allowedValues": [
    "F1",
    "D1",
    "B1",
    "B2",
    "B3",
    "S1",
    "S2",
    "S3",
    "P1",
    "P2",
    "P3",
    "P4"
  ],
  "defaultValue": "S1",
  "metadata": {
    "description": "The pricing tier for the hosting plan."
  }
}

Il modello definisce i valori consentiti per questo parametro e assegna un valore predefinito (S1) se non viene specificato alcun valore.

workerSize

Le dimensioni delle istanze del piano di hosting (piccole, medie o grandi dimensioni).

"workerSize":{
  "type":"string",
  "allowedValues":[
    "0",
    "1",
    "2"
  ],
  "defaultValue":"0"
}

Il modello definisce i valori consentiti per questo parametro (0, 1 o 2) e assegna un valore predefinito (0) nel caso in cui non viene specificato alcun valore. I valori corrispondono a piccole, medie e grandi dimensioni.

administratorLogin

Il nome dell'account da usare per l'amministratore del server di database.

"administratorLogin": {
  "type": "string"
}

administratorLoginPassword

La password da usare per l'amministratore del server di database.

"administratorLoginPassword": {
  "type": "securestring"
}

databaseName

Il nome del nuovo database da creare.

"databaseName": {
  "type": "string",
  "defaultValue": "sampledb"
}

collation

Le regole di confronto del database da usare per controllare l'uso corretto dei caratteri.

"collation": {
  "type": "string",
  "defaultValue": "SQL_Latin1_General_CP1_CI_AS"
}

edition

Il tipo di database da creare.

"edition": {
  "type": "string",
  "defaultValue": "Basic",
  "allowedValues": [
    "Basic",
    "Standard",
    "Premium"
  ],
  "metadata": {
    "description": "The type of database to create."
  }
}

maxSizeBytes

Dimensione massima, in byte, per il database.

"maxSizeBytes": {
  "type": "string",
  "defaultValue": "1073741824"
}

requestedServiceObjectiveName

Il nome corrispondente al livello di prestazioni per l'edizione.

"requestedServiceObjectiveName": {
  "type": "string",
  "defaultValue": "Basic",
  "allowedValues": [
    "Basic",
    "S0",
    "S1",
    "S2",
    "P1",
    "P2",
    "P3"
  ],
  "metadata": {
    "description": "Describes the performance level for Edition"
  }
}

Variabili per i nomi

Questo modello include le variabili che costituiscono i nomi usati nel modello. Per generare un nome dall'ID gruppo di risorse, i valori delle variabili usano la funzione uniqueString .

"variables": {
    "hostingPlanName": "[concat('hostingplan', uniqueString(resourceGroup().id))]",
    "webSiteName": "[concat('webSite', uniqueString(resourceGroup().id))]",
    "sqlserverName": "[concat('sqlserver', uniqueString(resourceGroup().id))]"
},

Risorse da distribuire

Database e server SQL

Crea un nuovo database e server SQL. Il nome del server viene specificato nel parametro serverName e il percorso nel parametro serverLocation. Quando si crea il nuovo server, è necessario fornire un nome di accesso e una password per l'amministratore del server di database.

{
  "name": "[variables('sqlserverName')]",
  "type": "Microsoft.Sql/servers",
  "location": "[resourceGroup().location]",
  "tags": {
    "displayName": "SqlServer"
  },
  "apiVersion": "2014-04-01-preview",
  "properties": {
    "administratorLogin": "[parameters('administratorLogin')]",
    "administratorLoginPassword": "[parameters('administratorLoginPassword')]"
  },
  "resources": [
    {
      "name": "[parameters('databaseName')]",
      "type": "databases",
      "location": "[resourceGroup().location]",
      "tags": {
        "displayName": "Database"
      },
      "apiVersion": "2014-04-01-preview",
      "dependsOn": [
        "[variables('sqlserverName')]"
      ],
      "properties": {
        "edition": "[parameters('edition')]",
        "collation": "[parameters('collation')]",
        "maxSizeBytes": "[parameters('maxSizeBytes')]",
        "requestedServiceObjectiveName": "[parameters('requestedServiceObjectiveName')]"
      }
    },
    {
      "type": "firewallrules",
      "apiVersion": "2014-04-01-preview",
      "dependsOn": [
        "[variables('sqlserverName')]"
      ],
      "location": "[resourceGroup().location]",
      "name": "AllowAllAzureIps",
      "properties": {
        "endIpAddress": "0.0.0.0",
        "startIpAddress": "0.0.0.0"
      }
    }
  ]
},

Piano di servizio app

Consente di creare il piano di servizio per ospitare l'app Web. Fornire il nome del piano tramite il parametro hostingPlanName . Il percorso del piano è identico a quello usato per il gruppo di risorse. Il piano tariffario e le dimensioni dei processi di lavoro sono specificati nei parametri sku e workerSize.

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

App Web

{
  "apiVersion": "2015-08-01",
  "name": "[variables('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": "[variables('webSiteName')]",
    "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]"
  },
  "resources": [
    {
      "apiVersion": "2015-08-01",
      "type": "config",
      "name": "connectionstrings",
      "dependsOn": [
        "[variables('webSiteName')]"
      ],
      "properties": {
        "DefaultConnection": {
          "value": "[concat('Data Source=tcp:', reference(concat('Microsoft.Sql/servers/', variables('sqlserverName'))).fullyQualifiedDomainName, ',1433;Initial Catalog=', parameters('databaseName'), ';User Id=', parameters('administratorLogin'), '@', variables('sqlserverName'), ';Password=', parameters('administratorLoginPassword'), ';')]",
          "type": "SQLServer"
        }
      }
    }
  ]
},

Scalabilità automatica

{
  "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'))]"
  }
},

Regole di avviso per i codici di stato 403 e 500, Utilizzo CPU elevato e Lunghezza coda HTTP

{
  "apiVersion": "2014-04-01",
  "name": "[concat('ServerErrors ', variables('webSiteName'))]",
  "type": "Microsoft.Insights/alertrules",
  "location": "[resourceGroup().location]",
  "dependsOn": [
    "[variables('webSiteName')]"
  ],
  "tags": {
    "[concat('hidden-link:', resourceId('Microsoft.Web/sites', variables('webSiteName')))]": "Resource",
    "displayName": "ServerErrorsAlertRule"
  },
  "properties": {
    "name": "[concat('ServerErrors ', variables('webSiteName'))]",
    "description": "[concat(variables('webSiteName'), ' has some server errors, status code 5xx.')]",
    "isEnabled": false,
    "condition": {
      "odata.type": "Microsoft.Azure.Management.Insights.Models.ThresholdRuleCondition",
      "dataSource": {
        "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleMetricDataSource",
        "resourceUri": "[resourceId('Microsoft.Web/sites', variables('webSiteName'))]",
        "metricName": "Http5xx"
      },
      "operator": "GreaterThan",
      "threshold": 0.0,
      "windowSize": "PT5M"
    },
    "action": {
      "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleEmailAction",
      "sendToServiceOwners": true,
      "customEmails": [ ]
    }
  }
},
{
  "apiVersion": "2014-04-01",
  "name": "[concat('ForbiddenRequests ', variables('webSiteName'))]",
  "type": "Microsoft.Insights/alertrules",
  "location": "[resourceGroup().location]",
  "dependsOn": [
    "[variables('webSiteName')]"
  ],
  "tags": {
    "[concat('hidden-link:', resourceId('Microsoft.Web/sites', variables('webSiteName')))]": "Resource",
    "displayName": "ForbiddenRequestsAlertRule"
  },
  "properties": {
    "name": "[concat('ForbiddenRequests ', variables('webSiteName'))]",
    "description": "[concat(variables('webSiteName'), ' has some requests that are forbidden, status code 403.')]",
    "isEnabled": false,
    "condition": {
      "odata.type": "Microsoft.Azure.Management.Insights.Models.ThresholdRuleCondition",
      "dataSource": {
        "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleMetricDataSource",
        "resourceUri": "[resourceId('Microsoft.Web/sites', variables('webSiteName'))]",
        "metricName": "Http403"
      },
      "operator": "GreaterThan",
      "threshold": 0,
      "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": [ ]
    }
  }
},

Informazioni sull'app

{
  "apiVersion": "2014-04-01",
  "name": "[concat('AppInsights', variables('webSiteName'))]",
  "type": "Microsoft.Insights/components",
  "location": "Central US",
  "dependsOn": [
    "[variables('webSiteName')]"
  ],
  "tags": {
    "[concat('hidden-link:', resourceId('Microsoft.Web/sites', variables('webSiteName')))]": "Resource",
    "displayName": "AppInsightsComponent"
  },
  "properties": {
    "ApplicationId": "[variables('webSiteName')]"
  }
}

Comandi per eseguire la distribuzione

Per distribuire le risorse in Azure, è necessario aver eseguito l'accesso all'account Azure e usare il modulo Gestione risorse di Azure. Per altre informazioni su come usare Gestione risorse di Azure con Azure PowerShell o l'interfaccia della riga di comando di Azure, vedere:

Gli esempi seguenti presuppongono che nell'account sia già stato creato un gruppo di risorse con il nome specificato.

PowerShell

New-AzureRmResourceGroupDeployment -TemplateUri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/201-web-app-sql-database/azuredeploy.json

Interfaccia della riga di comando di Azure

azure config mode arm
azure group deployment create -g {resource-group-name} --template-uri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/201-web-app-sql-database/azuredeploy.json

Interfaccia della riga di comando di Azure 2.0

az resource deployment create -g {resource-group-name} --template-uri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/201-web-app-sql-database/azuredeploy.json --parameters '@azuredeploy.parameters.json'
Nota

Per il contenuto del file JSON dei parametri, vedere azuredeploy.parameters.json.