{"id":1170,"date":"2022-01-13T23:38:00","date_gmt":"2022-01-13T10:38:00","guid":{"rendered":"https:\/\/blog.wiseowls.co.nz\/?p=1170"},"modified":"2026-03-08T00:48:06","modified_gmt":"2026-03-07T11:48:06","slug":"terraform-quick-start-repo-part-1-azure-remote-state","status":"publish","type":"post","link":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/01\/13\/terraform-quick-start-repo-part-1-azure-remote-state\/","title":{"rendered":"Building Terraform Quick Start repo part 1 &#8211; Bootstrapping Azure remote state"},"content":{"rendered":"<p>We often get to come in, deploy cloud services for customers and get out. Some customers have established teams and processes, others have green fields and rely on us to do the right thing. Regardless of the level of investment, customers expect us to stick to the best practice and not only create bits of cloud infrastructure for them but also do the right thing and codify the infrastructure as much as possible. By default, we&#8217;d stick to Terraform for that. <\/p>\n<h2 class=\"wp-block-heading\" id=\"storing-state\">Storing state <\/h2>\n<p>To be able to manage infrastructure and detect changes, Terraform needs a place to store current <a href=\"https:\/\/www.terraform.io\/language\/state\">state<\/a> of affairs. The easiest solution would be to store the state file <a href=\"https:\/\/www.terraform.io\/language\/settings\/backends\/local\">locally<\/a> but that&#8217;s not really an option for CI\/CD pipelines. Luckily, we&#8217;ve got a <a href=\"https:\/\/www.terraform.io\/language\/settings\/backends\/configuration\">bunch of backends<\/a> to pick from. <\/p>\n<p>This, however, leads to a chicken and egg situation where we can&#8217;t use Terraform to deploy storage backend without having access to storage backend where it can keep state file. <\/p>\n<h2 class=\"wp-block-heading\" id=\"bicep\">Bicep<\/h2>\n<p>So far, we&#8217;ve been mostly dealing with Azure so it made sense to prep a quick <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/azure-resource-manager\/bicep\/overview?tabs=bicep\">Bicep<\/a> snippet to create required resources for us. One thing to keep in mind is the fact that Bicep by default deploys resources into <code>resourceGroup<\/code> scope. This implies we&#8217;ve already created a resource group, which is not exactly what we want to do. To switch it up we need to start at <code>subscription<\/code> level (this is what we are usually given, anyway) and create a resource group followed by whatever else we wanted. The recommended way to do that would be to declare main template for RG and reference a module with all other good stuff:<\/p>\n<pre title=\"main.bicep\" class=\"wp-block-code\"><code lang=\"javascript\" class=\"language-javascript\">targetScope = 'subscription' \/\/ switching scopes here\n\n\n\/\/ declaring some parameters so we can easier manage the pipeline later\n@maxLength(13)\n@minLength(2)\nparam prefix string\nparam tfstate_rg_name string = '${prefix}-terraformstate-rg'\n@allowed([\n  'australiaeast'\n])\nparam location string\n\n\/\/ creating resource group\nresource rg 'Microsoft.Resources\/resourceGroups@2021-01-01' = {\n  name: tfstate_rg_name\n  location: location\n}\n\n\/\/ Deploying storage account via module reference\nmodule stg '.\/tfstate-storage.bicep' = {\n  name: 'storageDeployment'\n  scope: resourceGroup(rg.name)\n  params: {\n    storageAccountName: '${prefix}statetf${take(uniqueString(prefix),4)}'\n    location: location\n  }\n}\n\n\n<\/code><\/pre>\n<p>the module code would be important here:<\/p>\n<pre title=\"tfstate-storage.bicep\" class=\"wp-block-code\"><code lang=\"javascript\" class=\"language-javascript\">param storageAccountName string\nparam location string\nparam containerName string = 'tfstate' \n\noutput storageAccountName string = storageAccountName\noutput containerName string = containerName\n\nresource storageAccount_resource 'Microsoft.Storage\/storageAccounts@2021-06-01' = {\n  name: storageAccountName\n  location: location\n  sku: {\n    name: 'Standard_LRS'\n  }\n  kind: 'StorageV2'\n  properties: {\n    allowBlobPublicAccess: true\n    networkAcls: {\n      bypass: 'AzureServices'\n      virtualNetworkRules: []\n      ipRules: []\n      defaultAction: 'Allow'\n    }\n    supportsHttpsTrafficOnly: true\n    encryption: {\n      services: {\n        blob: {\n          keyType: 'Account'\n          enabled: true\n        }\n      }\n      keySource: 'Microsoft.Storage'\n    }\n    accessTier: 'Hot'\n  }\n}\n\nresource blobService_resource 'Microsoft.Storage\/storageAccounts\/blobServices@2021-06-01' = {\n  parent: storageAccount_resource\n  name: 'default'\n  properties: {\n    cors: {\n      corsRules: []\n    }\n    deleteRetentionPolicy: {\n      enabled: false\n    }\n  }\n}\n\nresource storageContainer_resource 'Microsoft.Storage\/storageAccounts\/blobServices\/containers@2021-06-01' = {\n  parent: blobService_resource\n  name: containerName\n  properties: {\n    immutableStorageWithVersioning: {\n      enabled: false\n    }\n    defaultEncryptionScope: '$account-encryption-key'\n    denyEncryptionScopeOverride: false\n    publicAccess: 'None'\n  }\n}\n<\/code><\/pre>\n<p>Assuming we just want to chuck all our assets into a repository and drive from there, it&#8217;d make sense to also write a simple ADO deployment pipeline. Previously <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/azure-resource-manager\/bicep\/add-template-to-azure-pipelines?tabs=CLI#azure-cli-task\">we&#8217;d have to opt for<\/a> <code>AzureCLI<\/code> task and do something like this:<\/p>\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">- task: AzureCLI@2\n  inputs:\n    azureSubscription: $(azureServiceConnection)\n    scriptType: bash\n    scriptLocation: inlineScript\n    inlineScript: |\n      # steps to create RG\n      az deployment group create --resource-group $(resourceGroupName) --template-file bicep\/main.bicep<\/code><\/pre>\n<p>Luckily, the work has been done and starting with <a href=\"https:\/\/github.com\/microsoft\/azure-pipelines-tasks\/commit\/4d8419f5e90882c316af3e73aea9521f8f2726ee#diff-b47246402341ad1589124e968bcb319f05b57d2dd911e7821a4c8855af064199R17\">agent version 3.199<\/a>, <code>AzureResourceManagerTemplateDeployment<\/code> does support Bicep deployments natively! Unfortunately, at the time of testing our ADO-hosted agent was still at version 3.198 so we had to cheat and compile Bicep down to ARM manually. The final pipeline, however, would look something like this:<\/p>\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">trigger: none # intended to run manually\n\nname: Deploy TF state backend via Bicep\n\npool:\n  vmImage: 'ubuntu-latest'\n\nvariables:\n  - group: \"bootstrap-state-variable-grp\" # define variable groups to point to correct subscription\n\nsteps:\n- task: AzureResourceManagerTemplateDeployment@3\n  inputs:\n    deploymentScope: 'Subscription'\n    azureResourceManagerConnection: $(azureServiceConnection)\n    subscriptionId: $(targetSubscriptionId)\n    location: $(location)\n    templateLocation: 'Linked Artifact'\n    csmFile: '$(System.DefaultWorkingDirectory)\/bicep\/main.bicep' # on dev machine, compile into ARM (az bicep build --file .\\bicep\\main.bicep) and use that instead until agent gets update to 3.199.x\n    deploymentMode: 'Incremental'\n    deploymentOutputs: 'storageAccountParameters'\n    overrideParameters: '-prefix $(prefix) -location $(location)'\n<\/code><\/pre>\n<p>Running through ADO should yield us a usable storage account within a brand-new resource group:<\/p>\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"395\" src=\"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/image-1-1024x395.png\" alt=\"Terraform remote state storage architecture in Azure\" class=\"wp-image-1184\" srcset=\"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/image-1-1024x395.png 1024w, https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/image-1-300x116.png 300w, https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/image-1-768x297.png 768w, https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/image-1-1200x463.png 1200w, https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/image-1.png 1528w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/figure>\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"774\" height=\"556\" src=\"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/image.png\" alt=\"Terraform remote state storage architecture in Azure\" class=\"wp-image-1181\" srcset=\"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/image.png 774w, https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/image-300x216.png 300w, https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/image-768x552.png 768w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" \/><\/figure>\n<h2 class=\"wp-block-heading\" id=\"where-to-from-here\">Where to from here<\/h2>\n<p>Having dealt with foundations, we should be able to capture output of this step (we mostly care about storage account name as it&#8217;s got some randomness in it) and feed it to Terraform backend provider. We&#8217;ll cover it in the next part of this series. <\/p>\n<h2 class=\"wp-block-heading\" id=\"conclusion\">Conclusion<\/h2>\n<p>Existing solutions in this space have so far relied on either PowerShell or  <code>az cli<\/code> to do the job. That&#8217;s still doable but can get a bit bulky, especially if we want to query outputs. Now that Bicep support is landing in <code>AzureResourceManagerTemplateDeploymentV3<\/code> directly, we will likely see this <a href=\"https:\/\/github.com\/microsoft\/azure-pipelines-tasks\/issues\/15337#issuecomment-1028105846\">as a recommended approach<\/a>. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>We often get to come in, deploy cloud services for customers and get out. Some customers have established teams and processes, others have green fields and rely on us to do the right thing. Regardless of the level of investment, customers expect us to stick to the best practice and not only create bits of &hellip; <a href=\"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/01\/13\/terraform-quick-start-repo-part-1-azure-remote-state\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Building Terraform Quick Start repo part 1 &#8211; Bootstrapping Azure remote state&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":1186,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[50,7],"tags":[48,57],"class_list":["post-1170","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cloud","category-infrastructure","tag-azure","tag-terraform"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Building Terraform Quick Start repo part 1 - Bootstrapping Azure remote state - Timur and associates<\/title>\n<meta name=\"description\" content=\"This article is the first part capturing our journey to automating infrastructure as code with Azure DevOps\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/01\/13\/terraform-quick-start-repo-part-1-azure-remote-state\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building Terraform Quick Start repo part 1 - Bootstrapping Azure remote state - Timur and associates\" \/>\n<meta property=\"og:description\" content=\"This article is the first part capturing our journey to automating infrastructure as code with Azure DevOps\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/01\/13\/terraform-quick-start-repo-part-1-azure-remote-state\/\" \/>\n<meta property=\"og:site_name\" content=\"Timur and associates\" \/>\n<meta property=\"article:published_time\" content=\"2022-01-13T10:38:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-07T11:48:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/rocket-launch-g30a0082b3_1920.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"563\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"timur\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@TimurKh\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/01\\\/13\\\/terraform-quick-start-repo-part-1-azure-remote-state\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/01\\\/13\\\/terraform-quick-start-repo-part-1-azure-remote-state\\\/\"},\"author\":{\"name\":\"timur\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#\\\/schema\\\/person\\\/34d0ed30d573b5bc317ea990bd2e0c59\"},\"headline\":\"Building Terraform Quick Start repo part 1 &#8211; Bootstrapping Azure remote state\",\"datePublished\":\"2022-01-13T10:38:00+00:00\",\"dateModified\":\"2026-03-07T11:48:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/01\\\/13\\\/terraform-quick-start-repo-part-1-azure-remote-state\\\/\"},\"wordCount\":507,\"image\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/01\\\/13\\\/terraform-quick-start-repo-part-1-azure-remote-state\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/wp-content\\\/uploads\\\/2022\\\/02\\\/rocket-launch-g30a0082b3_1920.jpg\",\"keywords\":[\"azure\",\"terraform\"],\"articleSection\":[\"Cloud\",\"Infrastructure\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/01\\\/13\\\/terraform-quick-start-repo-part-1-azure-remote-state\\\/\",\"url\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/01\\\/13\\\/terraform-quick-start-repo-part-1-azure-remote-state\\\/\",\"name\":\"Building Terraform Quick Start repo part 1 - Bootstrapping Azure remote state - Timur and associates\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/01\\\/13\\\/terraform-quick-start-repo-part-1-azure-remote-state\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/01\\\/13\\\/terraform-quick-start-repo-part-1-azure-remote-state\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/wp-content\\\/uploads\\\/2022\\\/02\\\/rocket-launch-g30a0082b3_1920.jpg\",\"datePublished\":\"2022-01-13T10:38:00+00:00\",\"dateModified\":\"2026-03-07T11:48:06+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#\\\/schema\\\/person\\\/34d0ed30d573b5bc317ea990bd2e0c59\"},\"description\":\"This article is the first part capturing our journey to automating infrastructure as code with Azure DevOps\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/01\\\/13\\\/terraform-quick-start-repo-part-1-azure-remote-state\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/01\\\/13\\\/terraform-quick-start-repo-part-1-azure-remote-state\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/01\\\/13\\\/terraform-quick-start-repo-part-1-azure-remote-state\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/wp-content\\\/uploads\\\/2022\\\/02\\\/rocket-launch-g30a0082b3_1920.jpg\",\"contentUrl\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/wp-content\\\/uploads\\\/2022\\\/02\\\/rocket-launch-g30a0082b3_1920.jpg\",\"width\":1920,\"height\":563},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/01\\\/13\\\/terraform-quick-start-repo-part-1-azure-remote-state\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building Terraform Quick Start repo part 1 &#8211; Bootstrapping Azure remote state\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#website\",\"url\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/\",\"name\":\"Timur and associates\",\"description\":\"Notes of an IT contractor\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#\\\/schema\\\/person\\\/34d0ed30d573b5bc317ea990bd2e0c59\",\"name\":\"timur\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg\",\"caption\":\"timur\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/TimurKh\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Building Terraform Quick Start repo part 1 - Bootstrapping Azure remote state - Timur and associates","description":"This article is the first part capturing our journey to automating infrastructure as code with Azure DevOps","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/01\/13\/terraform-quick-start-repo-part-1-azure-remote-state\/","og_locale":"en_US","og_type":"article","og_title":"Building Terraform Quick Start repo part 1 - Bootstrapping Azure remote state - Timur and associates","og_description":"This article is the first part capturing our journey to automating infrastructure as code with Azure DevOps","og_url":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/01\/13\/terraform-quick-start-repo-part-1-azure-remote-state\/","og_site_name":"Timur and associates","article_published_time":"2022-01-13T10:38:00+00:00","article_modified_time":"2026-03-07T11:48:06+00:00","og_image":[{"width":1920,"height":563,"url":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/rocket-launch-g30a0082b3_1920.jpg","type":"image\/jpeg"}],"author":"timur","twitter_card":"summary_large_image","twitter_creator":"@TimurKh","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/01\/13\/terraform-quick-start-repo-part-1-azure-remote-state\/#article","isPartOf":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/01\/13\/terraform-quick-start-repo-part-1-azure-remote-state\/"},"author":{"name":"timur","@id":"https:\/\/blog.wiseowls.co.nz\/#\/schema\/person\/34d0ed30d573b5bc317ea990bd2e0c59"},"headline":"Building Terraform Quick Start repo part 1 &#8211; Bootstrapping Azure remote state","datePublished":"2022-01-13T10:38:00+00:00","dateModified":"2026-03-07T11:48:06+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/01\/13\/terraform-quick-start-repo-part-1-azure-remote-state\/"},"wordCount":507,"image":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/01\/13\/terraform-quick-start-repo-part-1-azure-remote-state\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/rocket-launch-g30a0082b3_1920.jpg","keywords":["azure","terraform"],"articleSection":["Cloud","Infrastructure"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/01\/13\/terraform-quick-start-repo-part-1-azure-remote-state\/","url":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/01\/13\/terraform-quick-start-repo-part-1-azure-remote-state\/","name":"Building Terraform Quick Start repo part 1 - Bootstrapping Azure remote state - Timur and associates","isPartOf":{"@id":"https:\/\/blog.wiseowls.co.nz\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/01\/13\/terraform-quick-start-repo-part-1-azure-remote-state\/#primaryimage"},"image":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/01\/13\/terraform-quick-start-repo-part-1-azure-remote-state\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/rocket-launch-g30a0082b3_1920.jpg","datePublished":"2022-01-13T10:38:00+00:00","dateModified":"2026-03-07T11:48:06+00:00","author":{"@id":"https:\/\/blog.wiseowls.co.nz\/#\/schema\/person\/34d0ed30d573b5bc317ea990bd2e0c59"},"description":"This article is the first part capturing our journey to automating infrastructure as code with Azure DevOps","breadcrumb":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/01\/13\/terraform-quick-start-repo-part-1-azure-remote-state\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/01\/13\/terraform-quick-start-repo-part-1-azure-remote-state\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/01\/13\/terraform-quick-start-repo-part-1-azure-remote-state\/#primaryimage","url":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/rocket-launch-g30a0082b3_1920.jpg","contentUrl":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/rocket-launch-g30a0082b3_1920.jpg","width":1920,"height":563},{"@type":"BreadcrumbList","@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/01\/13\/terraform-quick-start-repo-part-1-azure-remote-state\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.wiseowls.co.nz\/"},{"@type":"ListItem","position":2,"name":"Building Terraform Quick Start repo part 1 &#8211; Bootstrapping Azure remote state"}]},{"@type":"WebSite","@id":"https:\/\/blog.wiseowls.co.nz\/#website","url":"https:\/\/blog.wiseowls.co.nz\/","name":"Timur and associates","description":"Notes of an IT contractor","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.wiseowls.co.nz\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blog.wiseowls.co.nz\/#\/schema\/person\/34d0ed30d573b5bc317ea990bd2e0c59","name":"timur","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg","url":"https:\/\/secure.gravatar.com\/avatar\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg","caption":"timur"},"sameAs":["https:\/\/x.com\/TimurKh"]}]}},"_links":{"self":[{"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/posts\/1170","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/comments?post=1170"}],"version-history":[{"count":12,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/posts\/1170\/revisions"}],"predecessor-version":[{"id":1352,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/posts\/1170\/revisions\/1352"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/media\/1186"}],"wp:attachment":[{"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/media?parent=1170"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/categories?post=1170"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/tags?post=1170"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}