Повторное развертывание шаблона ARM функций Azure удаляет мои опубликованные функции - PullRequest
0 голосов
/ 03 октября 2018

У меня есть экземпляр Azure Functions (2.0), развернутый шаблоном ARM с использованием конвейеров Azure DevOps.У меня есть другой конвейер, который развертывает приложение функций на экземпляр с помощью zip deploy.Это почти идеально работает, однако, если я разверну инфраструктуру функций как код, затем разверну приложение и затем повторно разверну инфраструктуру как код, мое приложение функций будет удалено и все функции исчезнут.Я использую пошаговое развертывание, поэтому я понимаю, почему это происходит.Любые мысли о том, почему это ведет себя так или как устранить неполадки?

Я скопировал ниже сценарий развертывания группы ресурсов и шаблон ARM.

New-AzureRmResourceGroupDeployment -Name ((Get-ChildItem $TemplateFile).BaseName + '-' + ((Get-Date).ToUniversalTime()).ToString('MMdd-HHmm')) `
                                   -ResourceGroupName $ResourceGroupName `
                                   -TemplateFile $TemplateFile `
                                   -TemplateParameterFile $TemplateParametersFile `
                                   -Mode Incremental `
                                   @OptionalParameters `
                                   -Force -Verbose `
                                   -AdminsGroup $AdminsGroup `
                                   -AdminsGroupObjectId $AdminsGroupObjectId `
                                   -ErrorVariable ErrorMessages

ARM шаблон

  {
  "type": "Microsoft.Web/serverfarms",
  "sku": {
    "name": "Y1",
    "tier": "Dynamic",
    "size": "Y1",
    "family": "Y",
    "capacity": 0
  },
  "kind": "app",
  "apiVersion": "2016-09-01",
  "name": "[variables('FunctionPlanNameMyStuff')]",
  "location": "[resourceGroup().location]",

  "properties": {
    "name": "[variables('FunctionPlanNameMyStuff')]",
    "perSiteScaling": false,
    "reserved": false,
    "targetWorkerCount": 0,
    "targetWorkerSizeId": 0
  }
},
{
  "comments": "MyStuff Functions Site",
  "type": "Microsoft.Web/sites",
  "kind": "functionapp",
  "name": "[variables('FunctionSiteNameMyStuff')]",
  "apiVersion": "2016-08-01",
  "location": "[resourceGroup().location]",
  "identity": {
    "type": "SystemAssigned"
  },
  "scale": null,
  "properties": {
    "enabled": true,
    "hostNameSslStates": [
      {
        "name": "[concat(variables('FunctionSiteNameMyStuff'),'.azurewebsites.net')]",
        "sslState": "Disabled",
        "virtualIP": null,
        "thumbprint": null,
        "toUpdate": null,
        "hostType": "Standard"
      },
      {
        "name": "[concat(variables('FunctionSiteNameMyStuff'),'.scm.azurewebsites.net')]",
        "sslState": "Disabled",
        "virtualIP": null,
        "thumbprint": null,
        "toUpdate": null,
        "hostType": "Repository"
      }
    ],
    "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('FunctionPlanNameMyStuff'))]",
    "reserved": false,
    "siteConfig": null,
    "scmSiteAlsoStopped": false,
    "hostingEnvironmentProfile": null,
    "clientAffinityEnabled": false,
    "clientCertEnabled": false,
    "hostNamesDisabled": false,
    "containerSize": 1536,
    "dailyMemoryTimeQuota": 0,
    "cloningInfo": null
  },
  "resources": [
    {
      "apiVersion": "2015-08-01",
      "name": "appsettings",
      "type": "config",
      "dependsOn": [
        "[resourceId('Microsoft.Web/Sites', variables('FunctionSiteNameMyStuff'))]",
        "[resourceId('Microsoft.Storage/storageAccounts', variables('FunctionStorageAccountMyStuff'))]"
      ],
      "properties": {
        "AzureWebJobsStorage": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('FunctionStorageAccountMyStuff'), ';AccountKey=', listKeys(variables('FunctionStorageResourceIdMyStuff'), '2017-10-01').keys[0].value)]",
        "AzureWebJobsDashboard": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('FunctionStorageAccountMyStuff'), ';AccountKey=', listKeys(variables('FunctionStorageResourceIdMyStuff'), '2017-10-01').keys[0].value)]",
        "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('FunctionStorageAccountMyStuff'), ';AccountKey=', listKeys(variables('FunctionStorageResourceIdMyStuff'),'2015-05-01-preview').key1)]",
        "WEBSITE_CONTENTSHARE": "[toLower(variables('FunctionSiteNameMyStuff'))]",
        "FUNCTIONS_EXTENSION_VERSION": "~2",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet",
        "FUNCTION_APP_EDIT_MODE": "readwrite",
        "KeyVaultUrl": "[concat('https://', variables('KeyVaultName'), '.vault.azure.net/')]",
        "DeveloperMode": false
      }
    }
  ],
  "dependsOn": [
    "[resourceId('Microsoft.Web/serverfarms', variables('FunctionPlanNameMyStuff'))]",
    "[resourceId('Microsoft.Storage/storageAccounts', variables('FunctionStorageAccountMyStuff'))]"
  ]
},
{
  "comments": "Functions web site config",
  "type": "Microsoft.Web/sites/config",
  "name": "[concat(variables('FunctionSiteNameMyStuff'), '/', 'web')]",
  "apiVersion": "2016-08-01",
  "location": "[resourceGroup().location]",
  "tags": {
  },
  "scale": null,
  "properties": {
    "numberOfWorkers": 1,
    "defaultDocuments": [
      "Default.htm",
      "Default.html",
      "Default.asp",
      "index.htm",
      "index.html",
      "iisstart.htm",
      "default.aspx",
      "index.php",
      "hostingstart.html"
    ],
    "netFrameworkVersion": "v4.0",
    "phpVersion": "5.6",
    "pythonVersion": "",
    "nodeVersion": "",
    "linuxFxVersion": "",
    "requestTracingEnabled": false,
    "remoteDebuggingEnabled": false,
    "remoteDebuggingVersion": null,
    "httpLoggingEnabled": false,
    "logsDirectorySizeLimit": 35,
    "detailedErrorLoggingEnabled": false,
    "publishingUsername": "[concat('$', variables('FunctionSiteNameMyStuff'), 'pubuser')]",
    "publishingPassword": "[concat(variables('FnAppPublishingPasswordMyStuff'), uniqueString(resourceGroup().id))]",
    "appSettings": null,
    "metadata": null,
    "connectionStrings": null,
    "machineKey": null,
    "handlerMappings": null,
    "documentRoot": null,
    "scmType": "None",
    "use32BitWorkerProcess": true,
    "webSocketsEnabled": false,
    "alwaysOn": false,
    "javaVersion": null,
    "javaContainer": null,
    "javaContainerVersion": null,
    "appCommandLine": "",
    "managedPipelineMode": "Integrated",
    "virtualApplications": [
      {
        "virtualPath": "/",
        "physicalPath": "site\\wwwroot",
        "preloadEnabled": false,
        "virtualDirectories": null
      }
    ],
    "winAuthAdminState": 0,
    "winAuthTenantState": 0,
    "customAppPoolIdentityAdminState": false,
    "customAppPoolIdentityTenantState": false,
    "runtimeADUser": null,
    "runtimeADUserPassword": null,
    "loadBalancing": "LeastRequests",
    "routingRules": [],
    "experiments": {
      "rampUpRules": []
    },
    "limits": null,
    "autoHealEnabled": false,
    "autoHealRules": null,
    "tracingOptions": null,
    "vnetName": "",
    "siteAuthEnabled": false,
    "siteAuthSettings": {
      "enabled": null,
      "unauthenticatedClientAction": null,
      "tokenStoreEnabled": null,
      "allowedExternalRedirectUrls": null,
      "defaultProvider": null,
      "clientId": null,
      "clientSecret": null,
      "issuer": null,
      "allowedAudiences": null,
      "additionalLoginParams": null,
      "isAadAutoProvisioned": false,
      "googleClientId": null,
      "googleClientSecret": null,
      "googleOAuthScopes": null,
      "facebookAppId": null,
      "facebookAppSecret": null,
      "facebookOAuthScopes": null,
      "twitterConsumerKey": null,
      "twitterConsumerSecret": null,
      "microsoftAccountClientId": null,
      "microsoftAccountClientSecret": null,
      "microsoftAccountOAuthScopes": null
    },
    "cors": null,
    "push": null,
    "apiDefinition": {
      "url": "[concat('https://', variables('FunctionPlanNameMyStuff'), '.azurewebsites.net/swagger/docs/v1')]"
    },
    "autoSwapSlotName": null,
    "localMySqlEnabled": false,
    "managedServiceIdentityId": null,
    "ipSecurityRestrictions": null,
    "http20Enabled": false,
    "minTlsVersion": "1.0"
  },
  "dependsOn": [
    "[resourceId('Microsoft.Web/sites', variables('FunctionSiteNameMyStuff'))]"
  ]
},

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Добавьте этот параметр приложения в свой шаблон:

{ "name": "WEBSITE_RUN_FROM_PACKAGE", "value": "1" }

Функции можно запускать только из zip-файла, если этот параметр присутствует, и повторное развертывание шаблона без него приведет к удалению существующего значения для этого параметра (если естьбыло любое).

0 голосов
/ 19 мая 2019

Таким образом, ответ @ curiouscoder работает, но на самом деле он требует больше, чем один вкладыш, поэтому я остановлюсь на этом здесь.

Я столкнулся с этой проблемой после добавления некоторых источников CORS в мой шаблон ARM, когда я запустилВ шаблоне, в котором удалены функции, для его исправления необходимо выполнить следующее (предполагается, что приложение-функция на основе Windows принадлежит вам и поэтому мое и развертывается из DevOps Azure):

  1. Добавьте параметр WEBSITE_RUN_FROM_PACKAGE в настройки службы приложения вашей функции и установите его равным 1 (также можно задать URL-адрес, на котором находится пакет, но это негативно влияет на холодный запуск для приложений-функций)
  2. Теперь запутанно в вашем AzureКонвейер релиза DevOps установил для вашего метода развертывания «развертывание zip», а не «запуск из пакета»!
  3. Повторное выполнение шаблона ARM с изменениями теперь не приведет к удалению сайта

Приложение-функция теперь будет запускаться из zip-файла, а не из развертывания непосредственно в папку wwwroot, это означает, что wwwrootне папка сделана только для чтения.Вы получите ошибки, если попытаетесь отредактировать что-либо там:

enter image description here

Преимущество этого подхода состоит в том, что вы не можете наполовину развернуть свое приложение иналичие только для чтения означает, что вы не можете случайно связываться с ним после его развертывания.

Вышеприведенное не работает так же гладко, как смена слота, и требует перезапуска приложения, поэтому его необходимо использовать вместе спромежуточное приложение или слоты, хотя на момент написания последние все еще находятся в предварительном просмотре для функциональных приложений.

Оригинальное объявление на github стоит прочитать здесь , поскольку они более подробны, чем документы .

0 голосов
/ 03 октября 2018

Ваш шаблон ARM проблематичен, поскольку он устанавливает параметры приложения отдельно от действия приложения, которое не поддерживается при использовании файлов Azure.

См. этот пример для получения рекомендаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...