{"componentChunkName":"component---src-templates-tags-js","path":"/tags/wildcardcert/","result":{"data":{"allMarkdownRemark":{"totalCount":1,"edges":[{"node":{"id":"2c92a1c3-0bdc-5de1-80e1-aeb3aa6dd28c","html":"<p>This post is one of those posts which is related to my consulting side. I was involved in a project where infrastructure as code was the approach from get go and since we had everything on Azure, we chose a mix of ARM templates and PowerShell. I hit a few issues along the way which I think it’s very valuable to be aware of for many people and especially myself in future on a similar project 😊.</p>\n<!--more-->\n<h2 id=\"background\" style=\"position:relative;\"><a href=\"#background\" aria-label=\"background permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Background</h2>\n<p>I don’t want to go through the whole architecture, suffice to know we have a few <a href=\"https://azure.microsoft.com/en-us/services/app-service/web/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">App Services</a> and <a href=\"https://azure.microsoft.com/en-us/services/functions/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Azure Functions</a> which need SSL binding and custom host name only in <em>production</em>. Since we’re managing the DNS records with <a href=\"https://www.cloudflare.com/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Cloudflare</a>, we got a wildcard cert for our domain and we imported the <a href=\"https://en.wikipedia.org/wiki/PKCS_12\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">PFX file</a> into a <a href=\"https://azure.microsoft.com/en-us/services/key-vault/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Key Vault</a> in a separate resource group to be used in our release.</p>\n<h2 id=\"first-try\" style=\"position:relative;\"><a href=\"#first-try\" aria-label=\"first try permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>First try</h2>\n<p>So the ARM template we had looked like this initially:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"73709749157873790000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`{\r\n  &quot;parameters&quot;: {\r\n    //...\r\n  },\r\n  &quot;variables&quot;: {\r\n    //...\r\n  },\r\n  &quot;resources&quot;: [\r\n    {\r\n      &quot;type&quot;: &quot;microsoft.insights/components&quot;,\r\n      &quot;apiVersion&quot;: &quot;2015-05-01&quot;,\r\n      &quot;name&quot;: &quot;[variables('appInsightsName')]&quot;,\r\n      &quot;location&quot;: &quot;[variables('appInsightsLocation')]&quot;,\r\n      &quot;tags&quot;: {\r\n        &quot;displayName&quot;: &quot;app-insights&quot;,\r\n        &quot;project&quot;: &quot;[variables('projectName')]&quot;,\r\n        &quot;environment&quot;: &quot;[parameters('environment')]&quot;\r\n      },\r\n      &quot;kind&quot;: &quot;web&quot;,\r\n      &quot;properties&quot;: {\r\n        &quot;Application_Type&quot;: &quot;web&quot;,\r\n        &quot;Request_Source&quot;: &quot;IbizaWebAppExtensionCreate&quot;\r\n      }\r\n    },\r\n    {\r\n      &quot;apiVersion&quot;: &quot;2016-09-01&quot;,\r\n      &quot;type&quot;: &quot;Microsoft.Web/serverfarms&quot;,\r\n      &quot;kind&quot;: &quot;app&quot;,\r\n      &quot;name&quot;: &quot;[variables('appServicePlanName')]&quot;,\r\n      &quot;tags&quot;: {\r\n        &quot;displayName&quot;: &quot;app-service-plan&quot;,\r\n        &quot;project&quot;: &quot;[variables('projectName')]&quot;,\r\n        &quot;environment&quot;: &quot;[parameters('environment')]&quot;\r\n      },\r\n      &quot;location&quot;: &quot;[parameters('deploymentLocation')]&quot;,\r\n      &quot;properties&quot;: {\r\n        &quot;name&quot;: &quot;[variables('appServicePlanName')]&quot;,\r\n        &quot;perSiteScaling&quot;: false,\r\n        &quot;reserved&quot;: false,\r\n        &quot;targetWorkerCount&quot;: 0,\r\n        &quot;targetWorkerSizeId&quot;: 0\r\n      },\r\n      &quot;dependsOn&quot;: [],\r\n      &quot;sku&quot;: {\r\n        &quot;name&quot;: &quot;[parameters('appServicePlanSku')]&quot;,\r\n        &quot;tier&quot;: &quot;[parameters('appServicePlanTier')]&quot;,\r\n        &quot;size&quot;: &quot;[parameters('appServicePlanSize')]&quot;,\r\n        &quot;family&quot;: &quot;[parameters('appServicePlanFamily')]&quot;,\r\n        &quot;capacity&quot;: &quot;[parameters('appServicePlanCapacity')]&quot;\r\n      }\r\n    },\r\n    {\r\n      &quot;apiVersion&quot;: &quot;2016-08-01&quot;,\r\n      &quot;type&quot;: &quot;Microsoft.Web/sites&quot;,\r\n      &quot;kind&quot;: &quot;app&quot;,\r\n      &quot;name&quot;: &quot;[variables('appServiceName')]&quot;,\r\n      &quot;tags&quot;: {\r\n        &quot;displayName&quot;: &quot;app-service&quot;,\r\n        &quot;project&quot;: &quot;[variables('projectName')]&quot;,\r\n        &quot;environment&quot;: &quot;[parameters('environment')]&quot;\r\n      },\r\n      &quot;location&quot;: &quot;[parameters('deploymentLocation')]&quot;,\r\n      &quot;properties&quot;: {\r\n        &quot;name&quot;: &quot;[variables('appServiceName')]&quot;,\r\n        &quot;serverFarmId&quot;: &quot;[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]&quot;,\r\n        &quot;siteConfig&quot;: {\r\n          &quot;appSettings&quot;: [\r\n            {\r\n              &quot;name&quot;: &quot;WEBSITE_RUN_FROM_PACKAGE&quot;,\r\n              &quot;value&quot;: &quot;1&quot;\r\n            }\r\n          ]\r\n        },\r\n        &quot;httpsOnly&quot;: &quot;[parameters('appServiceHttpsOnly')]&quot;\r\n      },\r\n      &quot;dependsOn&quot;: [\r\n        &quot;[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]&quot;,\r\n        &quot;[resourceId('microsoft.insights/components', variables('appInsightsName'))]&quot;\r\n      ],\r\n      &quot;resources&quot;: [\r\n        {\r\n          &quot;apiVersion&quot;: &quot;2015-08-01&quot;,\r\n          &quot;name&quot;: &quot;Microsoft.ApplicationInsights.AzureWebSites&quot;,\r\n          &quot;type&quot;: &quot;siteextensions&quot;,\r\n          &quot;dependsOn&quot;: [\r\n            &quot;[resourceId('Microsoft.Web/Sites', variables('appServiceName'))]&quot;\r\n          ],\r\n          &quot;properties&quot;: {}\r\n        },\r\n        {\r\n          &quot;name&quot;: &quot;appsettings&quot;,\r\n          &quot;type&quot;: &quot;config&quot;,\r\n          &quot;apiVersion&quot;: &quot;2015-08-01&quot;,\r\n          &quot;dependsOn&quot;: [\r\n            &quot;[resourceId('Microsoft.Web/sites', variables('appServiceName'))]&quot;,\r\n            &quot;Microsoft.ApplicationInsights.AzureWebSites&quot;\r\n          ],\r\n          &quot;properties&quot;: {\r\n            &quot;APPINSIGHTS_INSTRUMENTATIONKEY&quot;: &quot;[reference(variables('appInsightsName'), '2015-05-01').InstrumentationKey]&quot;\r\n          }\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      &quot;type&quot;: &quot;Microsoft.Web/sites/config&quot;,\r\n      &quot;apiVersion&quot;: &quot;2016-08-01&quot;,\r\n      &quot;name&quot;: &quot;[concat(variables('appServiceName'), '/web')]&quot;,\r\n      &quot;location&quot;: &quot;[parameters('deploymentLocation')]&quot;,\r\n      &quot;dependsOn&quot;: [\r\n        &quot;[resourceId('Microsoft.Web/sites', variables('appServiceName'))]&quot;\r\n      ],\r\n      &quot;tags&quot;: {\r\n        &quot;displayName&quot;: &quot;app-service&quot;,\r\n        &quot;project&quot;: &quot;[variables('projectName')]&quot;,\r\n        &quot;environment&quot;: &quot;[parameters('environment')]&quot;\r\n      },\r\n      &quot;properties&quot;: {\r\n        &quot;alwaysOn&quot;: &quot;[parameters('appServiceAlwaysOn')]&quot;\r\n      }\r\n    },\r\n    {\r\n      &quot;type&quot;: &quot;Microsoft.Web/certificates&quot;,\r\n      &quot;name&quot;: &quot;[variables('certificateName')]&quot;,\r\n      &quot;apiVersion&quot;: &quot;2016-03-01&quot;,\r\n      &quot;location&quot;: &quot;[resourceGroup().location]&quot;,\r\n      &quot;condition&quot;: &quot;[equals(parameters('environment'), 'prod')]&quot;,\r\n      &quot;properties&quot;: {\r\n        &quot;keyVaultId&quot;: &quot;[parameters('prodKeyVaultId')]&quot;,\r\n        &quot;keyVaultSecretName&quot;: &quot;[parameters('prodKeyVaultSecretName')]&quot;,\r\n        &quot;serverFarmId&quot;: &quot;[resourceId('Microsoft.Web/serverFarms', variables('appServicePlanName'))]&quot;\r\n      },\r\n      &quot;dependsOn&quot;: [&quot;[concat('Microsoft.Web/sites/', variables('appServiceName')]&quot;]\r\n    },\r\n    {\r\n      &quot;type&quot;: &quot;Microsoft.Web/sites/hostnameBindings&quot;,\r\n      &quot;name&quot;: &quot;[concat(variables('appServiceName'), '/', parameters('customHostname'))]&quot;,\r\n      &quot;apiVersion&quot;: &quot;2016-03-01&quot;,\r\n      &quot;location&quot;: &quot;[resourceGroup().location]&quot;,\r\n      &quot;condition&quot;: &quot;[equals(parameters('environment'), 'prod')]&quot;,\r\n      &quot;properties&quot;: {\r\n        &quot;sslState&quot;: &quot;SniEnabled&quot;,\r\n        &quot;thumbprint&quot;: &quot;[reference(resourceId('Microsoft.Web/certificates', variables('certificateName'))).Thumbprint]&quot;\r\n      },\r\n      &quot;dependsOn&quot;: [\r\n        &quot;[concat('Microsoft.Web/certificates/', variables('certificateName'))]&quot;\r\n      ]\r\n    }\r\n  ],\r\n  &quot;outputs: {\r\n    //...\r\n  }\r\n\r\n}`, `73709749157873790000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-json line-numbers\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\r\n  <span class=\"token property\">\"parameters\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token comment\">//...</span>\r\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token property\">\"variables\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token comment\">//...</span>\r\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token property\">\"resources\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n    <span class=\"token punctuation\">{</span>\r\n      <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"microsoft.insights/components\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"apiVersion\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2015-05-01\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[variables('appInsightsName')]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"location\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[variables('appInsightsLocation')]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"tags\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n        <span class=\"token property\">\"displayName\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"app-insights\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"project\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[variables('projectName')]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"environment\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('environment')]\"</span>\r\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"kind\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"web\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n        <span class=\"token property\">\"Application_Type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"web\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"Request_Source\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"IbizaWebAppExtensionCreate\"</span>\r\n      <span class=\"token punctuation\">}</span>\r\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token punctuation\">{</span>\r\n      <span class=\"token property\">\"apiVersion\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2016-09-01\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Microsoft.Web/serverfarms\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"kind\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"app\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[variables('appServicePlanName')]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"tags\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n        <span class=\"token property\">\"displayName\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"app-service-plan\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"project\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[variables('projectName')]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"environment\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('environment')]\"</span>\r\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"location\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('deploymentLocation')]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n        <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[variables('appServicePlanName')]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"perSiteScaling\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"reserved\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"targetWorkerCount\"</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"targetWorkerSizeId\"</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span>\r\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"dependsOn\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"sku\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n        <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('appServicePlanSku')]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"tier\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('appServicePlanTier')]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"size\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('appServicePlanSize')]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"family\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('appServicePlanFamily')]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"capacity\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('appServicePlanCapacity')]\"</span>\r\n      <span class=\"token punctuation\">}</span>\r\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token punctuation\">{</span>\r\n      <span class=\"token property\">\"apiVersion\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2016-08-01\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Microsoft.Web/sites\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"kind\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"app\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[variables('appServiceName')]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"tags\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n        <span class=\"token property\">\"displayName\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"app-service\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"project\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[variables('projectName')]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"environment\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('environment')]\"</span>\r\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"location\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('deploymentLocation')]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n        <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[variables('appServiceName')]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"serverFarmId\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"siteConfig\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n          <span class=\"token property\">\"appSettings\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n            <span class=\"token punctuation\">{</span>\r\n              <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"WEBSITE_RUN_FROM_PACKAGE\"</span><span class=\"token punctuation\">,</span>\r\n              <span class=\"token property\">\"value\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"1\"</span>\r\n            <span class=\"token punctuation\">}</span>\r\n          <span class=\"token punctuation\">]</span>\r\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"httpsOnly\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('appServiceHttpsOnly')]\"</span>\r\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"dependsOn\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n        <span class=\"token string\">\"[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token string\">\"[resourceId('microsoft.insights/components', variables('appInsightsName'))]\"</span>\r\n      <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"resources\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n        <span class=\"token punctuation\">{</span>\r\n          <span class=\"token property\">\"apiVersion\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2015-08-01\"</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Microsoft.ApplicationInsights.AzureWebSites\"</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"siteextensions\"</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"dependsOn\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n            <span class=\"token string\">\"[resourceId('Microsoft.Web/Sites', variables('appServiceName'))]\"</span>\r\n          <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\r\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token punctuation\">{</span>\r\n          <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"appsettings\"</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"config\"</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"apiVersion\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2015-08-01\"</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"dependsOn\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n            <span class=\"token string\">\"[resourceId('Microsoft.Web/sites', variables('appServiceName'))]\"</span><span class=\"token punctuation\">,</span>\r\n            <span class=\"token string\">\"Microsoft.ApplicationInsights.AzureWebSites\"</span>\r\n          <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n            <span class=\"token property\">\"APPINSIGHTS_INSTRUMENTATIONKEY\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[reference(variables('appInsightsName'), '2015-05-01').InstrumentationKey]\"</span>\r\n          <span class=\"token punctuation\">}</span>\r\n        <span class=\"token punctuation\">}</span>\r\n      <span class=\"token punctuation\">]</span>\r\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token punctuation\">{</span>\r\n      <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Microsoft.Web/sites/config\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"apiVersion\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2016-08-01\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[concat(variables('appServiceName'), '/web')]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"location\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('deploymentLocation')]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"dependsOn\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n        <span class=\"token string\">\"[resourceId('Microsoft.Web/sites', variables('appServiceName'))]\"</span>\r\n      <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"tags\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n        <span class=\"token property\">\"displayName\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"app-service\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"project\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[variables('projectName')]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"environment\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('environment')]\"</span>\r\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n        <span class=\"token property\">\"alwaysOn\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('appServiceAlwaysOn')]\"</span>\r\n      <span class=\"token punctuation\">}</span>\r\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token punctuation\">{</span>\r\n      <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Microsoft.Web/certificates\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[variables('certificateName')]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"apiVersion\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2016-03-01\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"location\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[resourceGroup().location]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"condition\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[equals(parameters('environment'), 'prod')]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n        <span class=\"token property\">\"keyVaultId\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('prodKeyVaultId')]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"keyVaultSecretName\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('prodKeyVaultSecretName')]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"serverFarmId\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[resourceId('Microsoft.Web/serverFarms', variables('appServicePlanName'))]\"</span>\r\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"dependsOn\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"[concat('Microsoft.Web/sites/', variables('appServiceName')]\"</span><span class=\"token punctuation\">]</span>\r\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token punctuation\">{</span>\r\n      <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Microsoft.Web/sites/hostnameBindings\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[concat(variables('appServiceName'), '/', parameters('customHostname'))]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"apiVersion\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2016-03-01\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"location\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[resourceGroup().location]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"condition\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[equals(parameters('environment'), 'prod')]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n        <span class=\"token property\">\"sslState\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"SniEnabled\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"thumbprint\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[reference(resourceId('Microsoft.Web/certificates', variables('certificateName'))).Thumbprint]\"</span>\r\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"dependsOn\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n        <span class=\"token string\">\"[concat('Microsoft.Web/certificates/', variables('certificateName'))]\"</span>\r\n      <span class=\"token punctuation\">]</span>\r\n    <span class=\"token punctuation\">}</span>\r\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\r\n  \"outputs<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token comment\">//...</span>\r\n  <span class=\"token punctuation\">}</span>\r\n\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>There are a few important things here you need to pay attention to. First, we have the <code class=\"language-text\">Microsoft/certificate</code> conditionally deployed, same as <code class=\"language-text\">sites/hostnameBindings</code> if we’re deploying to production. Second, note how we have a reference to the certificate in Key Vault in the certificate properties. And last, we have a reference to the certificate in the <code class=\"language-text\">hostNameBinding</code> in the same template.</p>\n<h2 id=\"first-try-1\" style=\"position:relative;\"><a href=\"#first-try-1\" aria-label=\"first try 1 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>First try</h2>\n<p>When we first tried this, we hit a permission error on the Key Vault the template was referencing. I had made sure that the Azure DevOps service principal is added into the access policy of the Key Vault and also the tick the <code class=\"language-text\">Azure Resource Manager for template deployment\r\n</code> checkbox to allow referencing the secret from within ARM template.</p>\n<div class=\"custom-block danger\"><div class=\"custom-block-body\"> <strong>Error</strong> Failed to add App Service certificate to the app, Check error for more details. Error Details: The service does not have access to ‘/subscriptions/XXXebXXX-XXX-XXXX-XXX-XXXXX/resourcegroups/XXXXX/providers/microsoft.keyvault/vaults/xxxxxxxxvault’ Key Vault. Please make sure that you have granted necessary permissions to the service to perform the request operation.</div></div>\n<p>This was really strange to me and I had no clue as to what’s missing. However, after a bit of Googling, I found out there are two service principals which belong to Microsoft and you have to add those to your Key Vault’s access policy in order to be able to link a certificate to your App Services.</p>\n<p><a href=\"https://github.com/Azure/azure-quickstart-templates/blob/master/101-app-service-certificate-wildcard/README.md\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Here is the kick starter template repository on GitHub</a> which explains what needs to be done. But in short, you need to run these commands:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"21031501311440093000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`Login-AzureRmAccount\r\n\r\nSet-AzureRmContext -SubscriptionId AZURE_SUBSCRIPTION_ID\r\n\r\nSet-AzureRmKeyVaultAccessPolicy -VaultName KEY_VAULT_NAME -ServicePrincipalName f3c21649-0979-4721-ac85-b0216b2cf413 -PermissionsToSecrets get,set,delete\r\n\r\nSet-AzureRmKeyVaultAccessPolicy -VaultName KEY_VAULT_NAME -ServicePrincipalName abfa0a7c-a6b6-4736-8310-5855508787cd -PermissionsToSecrets get`, `21031501311440093000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"powershell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-powershell line-numbers\"><code class=\"language-powershell\">Login-AzureRmAccount\r\n\r\n<span class=\"token function\">Set-AzureRmContext</span> <span class=\"token operator\">-</span>SubscriptionId AZURE_SUBSCRIPTION_ID\r\n\r\n<span class=\"token function\">Set-AzureRmKeyVaultAccessPolicy</span> <span class=\"token operator\">-</span>VaultName KEY_VAULT_NAME <span class=\"token operator\">-</span>ServicePrincipalName f3c21649-0979-4721-ac85-b0216b2cf413 <span class=\"token operator\">-</span>PermissionsToSecrets get<span class=\"token punctuation\">,</span><span class=\"token function\">set</span><span class=\"token punctuation\">,</span>delete\r\n\r\n<span class=\"token function\">Set-AzureRmKeyVaultAccessPolicy</span> <span class=\"token operator\">-</span>VaultName KEY_VAULT_NAME <span class=\"token operator\">-</span>ServicePrincipalName abfa0a7c-a6b6-4736-8310-5855508787cd <span class=\"token operator\">-</span>PermissionsToSecrets get</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>After running these commands, the error was gone and we could progress further. Note that the application ids are fixed.</p>\n<h2 id=\"second-try\" style=\"position:relative;\"><a href=\"#second-try\" aria-label=\"second try permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Second try</h2>\n<p>Once the necessary permissions was granted, we run the deployment again to be hit with the second issue, this time I was so baffled by this error:</p>\n<div class=\"custom-block danger\"><div class=\"custom-block-body\"> <strong>Error</strong> Another certificate exists with same thumbprint XXXXXXXXXXXXXXXXXXXX at location xxxx in the Resource Group xxxxxx.</div></div>\n<p>I wasn’t sure what’s causing the issue since I thought that since we’re reusing the same certificate, linking them wouldn’t be a problem. But when I looked at the deployments on the resource group, I found out Azure is trying to create multiple <code class=\"language-text\">Microsoft•Web/certificates</code> resources which will have the same thumbprint and so it fails. As Aussies say it, fair dinkum.</p>\n<p>So I extracted the certificate resource to the parent ARM template and passed a reference of it down to linked templates:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"51329422463160120000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`{\r\n  //parent ARM template\r\n  &quot;resources&quot;: [\r\n    {\r\n      &quot;type&quot;: &quot;Microsoft.Web/certificates&quot;,\r\n      &quot;name&quot;: &quot;[parameters('prodKeyVaultSecretName')]&quot;,\r\n      &quot;condition&quot;: &quot;[equals(parameters('environment'), 'prod')]&quot;,\r\n      &quot;apiVersion&quot;: &quot;2016-03-01&quot;,\r\n      &quot;location&quot;: &quot;[parameters('deploymentLocation')]&quot;,\r\n      &quot;properties&quot;: {\r\n        &quot;keyVaultId&quot;: &quot;[parameters('prodKeyVaultId')]&quot;,\r\n        &quot;keyVaultSecretName&quot;: &quot;[parameters('prodKeyVaultSecretName')]&quot;\r\n      }\r\n    },\r\n    //...\r\n    {\r\n      &quot;apiVersion&quot;: &quot;2017-05-10&quot;,\r\n      &quot;name&quot;: &quot;web-client-app-service-linked-template&quot;,\r\n      &quot;type&quot;: &quot;Microsoft.Resources/deployments&quot;,\r\n      &quot;metadata&quot;: {\r\n        &quot;comments&quot;: &quot;Linked ARM template deploys web client app service&quot;\r\n      },\r\n      &quot;properties&quot;: {\r\n        &quot;mode&quot;: &quot;Incremental&quot;,\r\n        &quot;templateLink&quot;: {\r\n          &quot;uri&quot;: &quot;[concat('https://', parameters('artefactsStorageAccountName'),'.blob.core.windows.net/',parameters('artefactsStorageAccountContainerName'),'/client-web-app/azuredeploy.json',parameters('artefactsStorageAccountSasToken'))]&quot;,\r\n          &quot;contentVersion&quot;: &quot;1.0.0.0&quot;\r\n        },\r\n        &quot;parametersLink&quot;: {\r\n          &quot;uri&quot;: &quot;[concat('https://', parameters('artefactsStorageAccountName'), '.blob.core.windows.net/', parameters('artefactsStorageAccountContainerName'),'/client-web-app/azuredeploy.parameters-', parameters('environment'), '.json', parameters('artefactsStorageAccountSasToken'))]&quot;,\r\n          &quot;contentVersion&quot;: &quot;1.0.0.0&quot;\r\n        }\r\n      },\r\n      &quot;dependsOn&quot;: [\r\n        &quot;[resourceId('Microsoft.Web/certificates', parameters('prodKeyVaultSecretName'))]&quot;\r\n      ]\r\n    },\r\n  ]\r\n}`, `51329422463160120000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-json line-numbers\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\r\n  <span class=\"token comment\">//parent ARM template</span>\r\n  <span class=\"token property\">\"resources\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n    <span class=\"token punctuation\">{</span>\r\n      <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Microsoft.Web/certificates\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('prodKeyVaultSecretName')]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"condition\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[equals(parameters('environment'), 'prod')]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"apiVersion\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2016-03-01\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"location\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('deploymentLocation')]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n        <span class=\"token property\">\"keyVaultId\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('prodKeyVaultId')]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"keyVaultSecretName\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('prodKeyVaultSecretName')]\"</span>\r\n      <span class=\"token punctuation\">}</span>\r\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token comment\">//...</span>\r\n    <span class=\"token punctuation\">{</span>\r\n      <span class=\"token property\">\"apiVersion\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2017-05-10\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"web-client-app-service-linked-template\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Microsoft.Resources/deployments\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"metadata\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n        <span class=\"token property\">\"comments\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Linked ARM template deploys web client app service\"</span>\r\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n        <span class=\"token property\">\"mode\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Incremental\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"templateLink\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n          <span class=\"token property\">\"uri\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[concat('https://', parameters('artefactsStorageAccountName'),'.blob.core.windows.net/',parameters('artefactsStorageAccountContainerName'),'/client-web-app/azuredeploy.json',parameters('artefactsStorageAccountSasToken'))]\"</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"contentVersion\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"1.0.0.0\"</span>\r\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"parametersLink\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n          <span class=\"token property\">\"uri\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[concat('https://', parameters('artefactsStorageAccountName'), '.blob.core.windows.net/', parameters('artefactsStorageAccountContainerName'),'/client-web-app/azuredeploy.parameters-', parameters('environment'), '.json', parameters('artefactsStorageAccountSasToken'))]\"</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"contentVersion\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"1.0.0.0\"</span>\r\n        <span class=\"token punctuation\">}</span>\r\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"dependsOn\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n        <span class=\"token string\">\"[resourceId('Microsoft.Web/certificates', parameters('prodKeyVaultSecretName'))]\"</span>\r\n      <span class=\"token punctuation\">]</span>\r\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token punctuation\">]</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>And in the linked template:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"58520580985375605000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`{\r\n  &quot;resources&quot;: [\r\n    {\r\n      &quot;apiVersion&quot;: &quot;2016-08-01&quot;,\r\n      &quot;type&quot;: &quot;Microsoft.Web/sites&quot;,\r\n      &quot;kind&quot;: &quot;app&quot;,\r\n      &quot;name&quot;: &quot;[variables('appServiceName')]&quot;,\r\n      &quot;tags&quot;: {\r\n        &quot;displayName&quot;: &quot;app-service&quot;,\r\n        &quot;project&quot;: &quot;[variables('projectName')]&quot;,\r\n        &quot;environment&quot;: &quot;[parameters('environment')]&quot;\r\n      },\r\n      &quot;location&quot;: &quot;[parameters('deploymentLocation')]&quot;,\r\n      &quot;properties&quot;: {\r\n        &quot;name&quot;: &quot;[variables('appServiceName')]&quot;,\r\n        &quot;serverFarmId&quot;: &quot;[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]&quot;,\r\n        &quot;siteConfig&quot;: {\r\n          &quot;appSettings&quot;: [\r\n            {\r\n              &quot;name&quot;: &quot;WEBSITE_RUN_FROM_PACKAGE&quot;,\r\n              &quot;value&quot;: &quot;1&quot;\r\n            }\r\n          ]\r\n        },\r\n        &quot;httpsOnly&quot;: &quot;[parameters('appServiceHttpsOnly')]&quot;,\r\n        &quot;hostNameSslStates&quot;: [\r\n          {\r\n            &quot;name&quot;: &quot;[parameters('customHostname')]&quot;,\r\n            &quot;sslState&quot;: &quot;SniEnabled&quot;,\r\n            &quot;thumbprint&quot;: &quot;[reference(concat('Microsoft.Web/certificates/', parameters('certificateName')), '2016-03-01').Thumbprint]&quot;,\r\n            &quot;toUpdate&quot;: true\r\n          }\r\n        ]\r\n      },\r\n      &quot;dependsOn&quot;: [\r\n        &quot;[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]&quot;,\r\n        &quot;[resourceId('microsoft.insights/components', variables('appInsightsName'))]&quot;\r\n      ],\r\n      &quot;resources&quot;: [\r\n        {\r\n          &quot;apiVersion&quot;: &quot;2015-08-01&quot;,\r\n          &quot;name&quot;: &quot;Microsoft.ApplicationInsights.AzureWebSites&quot;,\r\n          &quot;type&quot;: &quot;siteextensions&quot;,\r\n          &quot;dependsOn&quot;: [\r\n            &quot;[resourceId('Microsoft.Web/Sites', variables('appServiceName'))]&quot;\r\n          ],\r\n          &quot;properties&quot;: {}\r\n        },\r\n        {\r\n          &quot;name&quot;: &quot;appsettings&quot;,\r\n          &quot;type&quot;: &quot;config&quot;,\r\n          &quot;apiVersion&quot;: &quot;2015-08-01&quot;,\r\n          &quot;dependsOn&quot;: [\r\n            &quot;[resourceId('Microsoft.Web/sites', variables('appServiceName'))]&quot;,\r\n            &quot;Microsoft.ApplicationInsights.AzureWebSites&quot;\r\n          ],\r\n          &quot;properties&quot;: {\r\n            &quot;APPINSIGHTS_INSTRUMENTATIONKEY&quot;: &quot;[reference(variables('appInsightsName'), '2015-05-01').InstrumentationKey]&quot;\r\n          }\r\n        },\r\n        {\r\n          &quot;type&quot;: &quot;hostNameBindings&quot;,\r\n          &quot;name&quot;: &quot;[parameters('customHostname')]&quot;,\r\n          &quot;condition&quot;: &quot;[equals(parameters('environment'), 'prod')]&quot;,\r\n          &quot;apiVersion&quot;: &quot;2016-08-01&quot;,\r\n          &quot;dependsOn&quot;: [\r\n            &quot;[resourceId('Microsoft.Web/sites', variables('appServiceName'))]&quot;\r\n          ],\r\n          &quot;properties&quot;: {\r\n            &quot;siteName&quot;: &quot;[variables('appServiceName')]&quot;,\r\n            &quot;domainId&quot;: null,\r\n            &quot;hostNameType&quot;: &quot;Verified&quot;\r\n          }\r\n        }\r\n      ]\r\n    },\r\n  ]\r\n}`, `58520580985375605000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-json line-numbers\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\r\n  <span class=\"token property\">\"resources\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n    <span class=\"token punctuation\">{</span>\r\n      <span class=\"token property\">\"apiVersion\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2016-08-01\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Microsoft.Web/sites\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"kind\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"app\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[variables('appServiceName')]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"tags\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n        <span class=\"token property\">\"displayName\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"app-service\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"project\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[variables('projectName')]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"environment\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('environment')]\"</span>\r\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"location\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('deploymentLocation')]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n        <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[variables('appServiceName')]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"serverFarmId\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"siteConfig\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n          <span class=\"token property\">\"appSettings\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n            <span class=\"token punctuation\">{</span>\r\n              <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"WEBSITE_RUN_FROM_PACKAGE\"</span><span class=\"token punctuation\">,</span>\r\n              <span class=\"token property\">\"value\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"1\"</span>\r\n            <span class=\"token punctuation\">}</span>\r\n          <span class=\"token punctuation\">]</span>\r\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"httpsOnly\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('appServiceHttpsOnly')]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"hostNameSslStates\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n          <span class=\"token punctuation\">{</span>\r\n            <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('customHostname')]\"</span><span class=\"token punctuation\">,</span>\r\n            <span class=\"token property\">\"sslState\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"SniEnabled\"</span><span class=\"token punctuation\">,</span>\r\n            <span class=\"token property\">\"thumbprint\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[reference(concat('Microsoft.Web/certificates/', parameters('certificateName')), '2016-03-01').Thumbprint]\"</span><span class=\"token punctuation\">,</span>\r\n            <span class=\"token property\">\"toUpdate\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span>\r\n          <span class=\"token punctuation\">}</span>\r\n        <span class=\"token punctuation\">]</span>\r\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"dependsOn\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n        <span class=\"token string\">\"[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token string\">\"[resourceId('microsoft.insights/components', variables('appInsightsName'))]\"</span>\r\n      <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"resources\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n        <span class=\"token punctuation\">{</span>\r\n          <span class=\"token property\">\"apiVersion\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2015-08-01\"</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Microsoft.ApplicationInsights.AzureWebSites\"</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"siteextensions\"</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"dependsOn\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n            <span class=\"token string\">\"[resourceId('Microsoft.Web/Sites', variables('appServiceName'))]\"</span>\r\n          <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\r\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token punctuation\">{</span>\r\n          <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"appsettings\"</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"config\"</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"apiVersion\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2015-08-01\"</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"dependsOn\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n            <span class=\"token string\">\"[resourceId('Microsoft.Web/sites', variables('appServiceName'))]\"</span><span class=\"token punctuation\">,</span>\r\n            <span class=\"token string\">\"Microsoft.ApplicationInsights.AzureWebSites\"</span>\r\n          <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n            <span class=\"token property\">\"APPINSIGHTS_INSTRUMENTATIONKEY\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[reference(variables('appInsightsName'), '2015-05-01').InstrumentationKey]\"</span>\r\n          <span class=\"token punctuation\">}</span>\r\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token punctuation\">{</span>\r\n          <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"hostNameBindings\"</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('customHostname')]\"</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"condition\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[equals(parameters('environment'), 'prod')]\"</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"apiVersion\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2016-08-01\"</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"dependsOn\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n            <span class=\"token string\">\"[resourceId('Microsoft.Web/sites', variables('appServiceName'))]\"</span>\r\n          <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\r\n          <span class=\"token property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n            <span class=\"token property\">\"siteName\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[variables('appServiceName')]\"</span><span class=\"token punctuation\">,</span>\r\n            <span class=\"token property\">\"domainId\"</span><span class=\"token operator\">:</span> <span class=\"token null keyword\">null</span><span class=\"token punctuation\">,</span>\r\n            <span class=\"token property\">\"hostNameType\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Verified\"</span>\r\n          <span class=\"token punctuation\">}</span>\r\n        <span class=\"token punctuation\">}</span>\r\n      <span class=\"token punctuation\">]</span>\r\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token punctuation\">]</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Notice the reference to the certificate resource in the <code class=\"language-text\">hostNameSslStates</code> property. And again we kicked off a new release to be hit with another problem.</p>\n<p>This time it complained about a missing resource for non prod environments which was fair, as I forgot to apply the condition to the thumbprint reference.</p>\n<h2 id=\"third-try\" style=\"position:relative;\"><a href=\"#third-try\" aria-label=\"third try permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Third try</h2>\n<p>So I applied an if condition to the thumbprint thinking it would work:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"92335450409100050000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`{\r\n  &quot;hostNameSslStates&quot;: [\r\n    {\r\n      &quot;name&quot;: &quot;[parameters('customHostname')]&quot;,\r\n      &quot;sslState&quot;: &quot;SniEnabled&quot;,\r\n      &quot;thumbprint&quot;: &quot;[if(equals(parameters('environment'), 'prod'), reference(concat('Microsoft.Web/certificates/', parameters('certificateName')), '2016-03-01').Thumbprint, '')]&quot;,\r\n      &quot;toUpdate&quot;: true\r\n    }\r\n  ]\r\n}`, `92335450409100050000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-json line-numbers\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\r\n  <span class=\"token property\">\"hostNameSslStates\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n    <span class=\"token punctuation\">{</span>\r\n      <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('customHostname')]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"sslState\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"SniEnabled\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"thumbprint\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[if(equals(parameters('environment'), 'prod'), reference(concat('Microsoft.Web/certificates/', parameters('certificateName')), '2016-03-01').Thumbprint, '')]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"toUpdate\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span>\r\n    <span class=\"token punctuation\">}</span>\r\n  <span class=\"token punctuation\">]</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Which failed again. This time I found out that the reference evaluation happens regardless of if statement. So I removed the <code class=\"language-text\">hostNameSslStates</code> altogether and used the full resource:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"27384749039284740000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`{\r\n  &quot;resources&quot;: [\r\n    {\r\n      &quot;type&quot;: &quot;hostNameBindings&quot;,\r\n      &quot;name&quot;: &quot;[parameters('customHostname')]&quot;,\r\n      &quot;condition&quot;: &quot;[variables('isProd')]&quot;,\r\n      &quot;apiVersion&quot;: &quot;2016-08-01&quot;,\r\n      &quot;dependsOn&quot;: [\r\n        &quot;[resourceId('Microsoft.Web/sites', variables('appServiceName'))]&quot;\r\n      ],\r\n      &quot;properties&quot;: {\r\n        &quot;siteName&quot;: &quot;[variables('appServiceName')]&quot;,\r\n        &quot;domainId&quot;: null,\r\n        &quot;hostNameType&quot;: &quot;Verified&quot;,\r\n        &quot;sslState&quot;: &quot;SniEnabled&quot;,\r\n        &quot;thumbprint&quot;: &quot;[reference(concat('Microsoft.Web/certificates/', parameters('certificateName')), '2016-03-01').Thumbprint]&quot;\r\n      }\r\n    }\r\n  ]\r\n}`, `27384749039284740000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-json line-numbers\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\r\n  <span class=\"token property\">\"resources\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n    <span class=\"token punctuation\">{</span>\r\n      <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"hostNameBindings\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('customHostname')]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"condition\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[variables('isProd')]\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"apiVersion\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2016-08-01\"</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"dependsOn\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n        <span class=\"token string\">\"[resourceId('Microsoft.Web/sites', variables('appServiceName'))]\"</span>\r\n      <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n        <span class=\"token property\">\"siteName\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[variables('appServiceName')]\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"domainId\"</span><span class=\"token operator\">:</span> <span class=\"token null keyword\">null</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"hostNameType\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Verified\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"sslState\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"SniEnabled\"</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token property\">\"thumbprint\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[reference(concat('Microsoft.Web/certificates/', parameters('certificateName')), '2016-03-01').Thumbprint]\"</span>\r\n      <span class=\"token punctuation\">}</span>\r\n    <span class=\"token punctuation\">}</span>\r\n  <span class=\"token punctuation\">]</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Which failed again 😭😭😭. For the same reason as before, which was the reference to the missing resource.</p>\n<h2 id=\"forth-try\" style=\"position:relative;\"><a href=\"#forth-try\" aria-label=\"forth try permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Forth try</h2>\n<p>So I tried the if condition trick again this time on the <code class=\"language-text\">thumbprint</code> property of the <code class=\"language-text\">hostNameBindings</code> resource:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"17783195152170815000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`{\r\n  &quot;type&quot;: &quot;hostNameBindings&quot;,\r\n  &quot;name&quot;: &quot;[parameters('customHostname')]&quot;,\r\n  &quot;condition&quot;: &quot;[variables('isProd')]&quot;,\r\n  &quot;apiVersion&quot;: &quot;2016-08-01&quot;,\r\n  &quot;dependsOn&quot;: [\r\n    &quot;[resourceId('Microsoft.Web/sites', variables('appServiceName'))]&quot;\r\n  ],\r\n  &quot;properties&quot;: {\r\n    &quot;siteName&quot;: &quot;[variables('appServiceName')]&quot;,\r\n    &quot;domainId&quot;: null,\r\n    &quot;hostNameType&quot;: &quot;Verified&quot;,\r\n    &quot;sslState&quot;: &quot;SniEnabled&quot;,\r\n    &quot;thumbprint&quot;: &quot;[if(variables('isProd'), reference(concat('Microsoft.Web/certificates/', parameters('certificateName')), '2016-03-01').Thumbprint, '')]&quot;\r\n  }\r\n}`, `17783195152170815000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-json line-numbers\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\r\n  <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"hostNameBindings\"</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[parameters('customHostname')]\"</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token property\">\"condition\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[variables('isProd')]\"</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token property\">\"apiVersion\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2016-08-01\"</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token property\">\"dependsOn\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n    <span class=\"token string\">\"[resourceId('Microsoft.Web/sites', variables('appServiceName'))]\"</span>\r\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token property\">\"siteName\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[variables('appServiceName')]\"</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token property\">\"domainId\"</span><span class=\"token operator\">:</span> <span class=\"token null keyword\">null</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token property\">\"hostNameType\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Verified\"</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token property\">\"sslState\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"SniEnabled\"</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token property\">\"thumbprint\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[if(variables('isProd'), reference(concat('Microsoft.Web/certificates/', parameters('certificateName')), '2016-03-01').Thumbprint, '')]\"</span>\r\n  <span class=\"token punctuation\">}</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>And guess what, it was successful. OMG, I was so happy that this was working.</p>\n<h2 id=\"summary\" style=\"position:relative;\"><a href=\"#summary\" aria-label=\"summary permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Summary</h2>\n<p>So if you have a wildcard certificate and you want to reuse it in multiple App Services, DO NOT create the certificate for one of those, simply create one and share it with all of them.</p>\n<p>Here are some points which might be helpful to know:</p>\n<ul>\n<li>The ARM deployment respects the conditional resource in the <code class=\"language-text\">dependsOn</code> section. Meaning if the resource is conditionally created, it doesn’t have any effect in the order of deployment and it won’t fail it either.</li>\n<li>You can’t use a <code class=\"language-text\">reference</code> function in the variable section. Otherwise my life would’ve been much easier 😁.</li>\n<li>When using a <code class=\"language-text\">reference</code> on a property, the function is evaluated regardless of the fact that you have an if condition or not (happy to be proven wrong with this one).</li>\n<li>And last, you need to be patient when working with ARM templates 😂.</li>\n</ul>\n<p>Hope this article helps someone else and saves their time. I am planning to create a template set and create a PR into kick starter repo. But don’t have any timeline as of now.</p>","timeToRead":8,"frontmatter":{"title":"Infrastructure as code, Azure app service using a wildcard certificate from KeyVault","unformattedDate":"2019-10-31T00:00:00.000Z","date":"Oct 31, 2019","path":"/azure-webapp-wildcardcert-keyvault/","author":"Yaser Adel Mehraban","tags":["showdev","azure","wildcardcert","webapps"],"thumbnail":null}}}]}},"pageContext":{"tag":"wildcardcert"}},"staticQueryHashes":[],"slicesMap":{}}