{"id":42496,"date":"2026-02-03T10:00:48","date_gmt":"2026-02-03T09:00:48","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=42496"},"modified":"2026-02-03T10:00:51","modified_gmt":"2026-02-03T09:00:51","slug":"deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/","title":{"rendered":"Deploying Azure Terraform code with Azure DevOps and a storage account as remote backend"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"h-why-this-blog\">Why this blog? <\/h2>\n\n\n\n<p>While I was working for a customer, I was tasked to create an Azure infrastructure, using Terraform and Azure DevOps (ADO). I thought about doing it like I usually do with GitLab but it wasn&#8217;t possible with ADO as it doesn&#8217;t store the state file itself. Instead I have to use an Azure Storage Account. I configured it, blocked public network, and realized that my pipeline couldn&#8217;t push the state in the Storage Account<\/p>\n\n\n\n<p>In fact, ADO isn&#8217;t supported as a &#8220;Trusted Microsoft Service&#8221; and so it can&#8217;t bypass firewall rules using that option in Storage Accounts. For this to work, I had to create a self-hosted agent that run on Azure VM Scale Set and that will be the topic of this blog. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-azure-resources-creation\">Azure resources creation<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-agent-creation\">Agent Creation <\/h3>\n\n\n\n<p>First thing, we create a Azure VM Scale Set. I kept most parameters to their default values but it can be customized. I chose Linux as operating system as it was what I needed. One important thing is to set the &#8220;Orchestration mode&#8221; to &#8220;Uniform&#8221;, else ADO pipelines won&#8217;t work.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"467\" height=\"221\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-13.png\" alt=\"\" class=\"wp-image-42519\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-13.png 467w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-13-300x142.png 300w\" sizes=\"auto, (max-width: 467px) 100vw, 467px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-storage-account\">Storage account <\/h3>\n\n\n\n<p>For the storage account that will store our state, any storage account should work. Just note that you also need to create a <strong>container <\/strong>inside of it to fill your terraform provider. Also, for network preferences we will go with &#8220;Public access&#8221; and &#8220;Enable from selected networks&#8221;. This is will allow public access only from restricted networks. I do this to avoid creating a private endpoint to connect to a fully private storage account.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"487\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-15-1024x487.png\" alt=\"\" class=\"wp-image-42521\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-15-1024x487.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-15-300x143.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-15-768x365.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-15.png 1352w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-entra-id-identity-for-the-pipeline\">Entra ID identity for the pipeline<\/h3>\n\n\n\n<p>We also need to create an Entra ID Enterprise Application that we will provide to the pipeline. This identity must have <strong>Contributor<\/strong> (or any look alike) role over the scope you target. Also, it must have at least <strong>Storage Blob Data Contributor<\/strong> on the Storage Account to be able to write in it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-azure-devops-setup\">Azure DevOps setup<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-terraform-code\">Terraform code<\/h3>\n\n\n\n<p>You can use any Terraform code you want, for my example I only use one which creates a Resource Group and a Virtual Network. Just note that your provider should look like this<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"483\" height=\"322\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-16.png\" alt=\"\" class=\"wp-image-42522\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-16.png 483w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-16-300x200.png 300w\" sizes=\"auto, (max-width: 483px) 100vw, 483px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-pipeline-code\">Pipeline code<\/h3>\n\n\n\n<p>I&#8217;m used to split my pipeline in two files, the plan.yml will be given to the ADO pipeline and it will call the template to run its code. The things done in the pipeline are pretty simple. It installs Terraform on the VM Scale Set instance, then run the Terraform commands. The block of code can be reused for the &#8220;apply&#8221;.<\/p>\n\n\n\n<p>Few things to note, in my plan.yml I set a Variable Group &#8220;Terraform_SPN&#8221; that I will show you just after. That&#8217;s where we will find the information about our previously created Entra Id Enterprise Application<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"697\" height=\"441\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-19.png\" alt=\"\" class=\"wp-image-42525\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-19.png 697w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-19-300x190.png 300w\" sizes=\"auto, (max-width: 697px) 100vw, 697px\" \/><\/figure>\n\n\n\n<p>In the template.yml, what is important to note is the pool definition. Here I point just a name, which correspond to ADO Agent Pool that I created. I&#8217;ll also show this step a bit further. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"711\" height=\"557\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-20.png\" alt=\"\" class=\"wp-image-42526\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-20.png 711w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-20-300x235.png 300w\" sizes=\"auto, (max-width: 711px) 100vw, 711px\" \/><\/figure>\n\n\n\n<p id=\"h-\">For the pipeline creation itself, we will go to <strong>Pipeline<\/strong> -&gt; Create a new pipeline -&gt; Azure Repos Git<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1020\" height=\"1024\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-21-1020x1024.png\" alt=\"\" class=\"wp-image-42527\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-21-1020x1024.png 1020w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-21-300x300.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-21-150x150.png 150w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-21-768x771.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-21.png 1042w\" sizes=\"auto, (max-width: 1020px) 100vw, 1020px\" \/><\/figure>\n\n\n\n<p>Then Existing Azure Pipelines YAML file, and pick our file from our repo.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"509\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-22-1024x509.png\" alt=\"\" class=\"wp-image-42528\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-22-1024x509.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-22-300x149.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-22-768x382.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-22-1536x763.png 1536w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-22-2048x1018.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>We will also create a <strong>Variable Group<\/strong>, the name doesn&#8217;t matter, just remember to put the same in your YAML code. Here you create 4 variables which are information coming from your tenant and your enterprise application. That&#8217;s gonna be used during the pipeline run to deploy your resources.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"724\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-25-1024x724.png\" alt=\"\" class=\"wp-image-42531\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-25-1024x724.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-25-300x212.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-25-768x543.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-25.png 1375w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-ado-agent-pool\">ADO Agent Pool<\/h3>\n\n\n\n<p>In the <strong>Project Settings<\/strong>, look for <strong>Agent Pools<\/strong>. Then create a new one and fill it as follow:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"505\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-23-1024x505.png\" alt=\"\" class=\"wp-image-42529\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-23-1024x505.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-23-300x148.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-23-768x378.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-23-1536x757.png 1536w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-23-2048x1009.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>The <strong>Authorize<\/strong> button will appear after you select the subscription you want, and to accept this your user must have the Owner role, as it adds rights. This will allow ADO to communicate with Azure by creating a Service Principal. Then you can fill the rest as follow:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"475\" height=\"797\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-24.png\" alt=\"\" class=\"wp-image-42530\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-24.png 475w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-24-179x300.png 179w\" sizes=\"auto, (max-width: 475px) 100vw, 475px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-ado-pipeline-run\">ADO pipeline run<\/h3>\n\n\n\n<p>When you first run your pipeline you must authorize it to use the <strong>Variable Group<\/strong> and the <strong>Agent pool<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"189\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-27-1024x189.png\" alt=\"\" class=\"wp-image-42533\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-27-1024x189.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-27-300x55.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-27-768x141.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-27-1536x283.png 1536w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-27.png 1917w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"445\" height=\"307\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-26.png\" alt=\"\" class=\"wp-image-42532\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-26.png 445w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-26-300x207.png 300w\" sizes=\"auto, (max-width: 445px) 100vw, 445px\" \/><\/figure>\n\n\n\n<p>One this is done, everything should go smoothly and end like this.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"42\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-28-1024x42.png\" alt=\"\" class=\"wp-image-42534\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-28-1024x42.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-28-300x12.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-28-768x31.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-28-1536x63.png 1536w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-28.png 1592w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>I hope that this blog was useful and could help you troubleshoot that king of problem between Azure and Azure DevOps.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Why this blog? While I was working for a customer, I was tasked to create an Azure infrastructure, using Terraform and Azure DevOps (ADO). I thought about doing it like I usually do with GitLab but it wasn&#8217;t possible with ADO as it doesn&#8217;t store the state file itself. Instead I have to use an [&hellip;]<\/p>\n","protected":false},"author":90,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[3271,955,1320],"tags":[1338,135,2667],"type_dbi":[],"class_list":["post-42496","post","type-post","status-publish","format-standard","hentry","category-azure","category-cloud","category-devops","tag-azure","tag-cloud","tag-devops-2"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Deploying Azure Terraform code with Azure DevOps and a storage account as remote backend - dbi Blog<\/title>\n<meta name=\"description\" content=\"This blog presents how to manage the Terraform state file when using Azure Devops and Azure Storage account to store it\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Deploying Azure Terraform code with Azure DevOps and a storage account as remote backend\" \/>\n<meta property=\"og:description\" content=\"This blog presents how to manage the Terraform state file when using Azure Devops and Azure Storage account to store it\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-03T09:00:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-03T09:00:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-13.png\" \/>\n\t<meta property=\"og:image:width\" content=\"467\" \/>\n\t<meta property=\"og:image:height\" content=\"221\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Adrien Devaux\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Adrien Devaux\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/\"},\"author\":{\"name\":\"Adrien Devaux\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/80889303f4b56d4e0d3637582fa1f705\"},\"headline\":\"Deploying Azure Terraform code with Azure DevOps and a storage account as remote backend\",\"datePublished\":\"2026-02-03T09:00:48+00:00\",\"dateModified\":\"2026-02-03T09:00:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/\"},\"wordCount\":723,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-13.png\",\"keywords\":[\"Azure\",\"Cloud\",\"devops\"],\"articleSection\":[\"Azure\",\"Cloud\",\"DevOps\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/\",\"name\":\"Deploying Azure Terraform code with Azure DevOps and a storage account as remote backend - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-13.png\",\"datePublished\":\"2026-02-03T09:00:48+00:00\",\"dateModified\":\"2026-02-03T09:00:51+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/80889303f4b56d4e0d3637582fa1f705\"},\"description\":\"This blog presents how to manage the Terraform state file when using Azure Devops and Azure Storage account to store it\",\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/#primaryimage\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-13.png\",\"contentUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-13.png\",\"width\":467,\"height\":221},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Deploying Azure Terraform code with Azure DevOps and a storage account as remote backend\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/80889303f4b56d4e0d3637582fa1f705\",\"name\":\"Adrien Devaux\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/bc472273cc9807635382578d8967f63a3602eb717ab361bcf2c8ee9a59b682b0?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bc472273cc9807635382578d8967f63a3602eb717ab361bcf2c8ee9a59b682b0?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bc472273cc9807635382578d8967f63a3602eb717ab361bcf2c8ee9a59b682b0?s=96&d=mm&r=g\",\"caption\":\"Adrien Devaux\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/adriendevaux\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Deploying Azure Terraform code with Azure DevOps and a storage account as remote backend - dbi Blog","description":"This blog presents how to manage the Terraform state file when using Azure Devops and Azure Storage account to store it","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:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/","og_locale":"en_US","og_type":"article","og_title":"Deploying Azure Terraform code with Azure DevOps and a storage account as remote backend","og_description":"This blog presents how to manage the Terraform state file when using Azure Devops and Azure Storage account to store it","og_url":"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/","og_site_name":"dbi Blog","article_published_time":"2026-02-03T09:00:48+00:00","article_modified_time":"2026-02-03T09:00:51+00:00","og_image":[{"width":467,"height":221,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-13.png","type":"image\/png"}],"author":"Adrien Devaux","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Adrien Devaux","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/"},"author":{"name":"Adrien Devaux","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/80889303f4b56d4e0d3637582fa1f705"},"headline":"Deploying Azure Terraform code with Azure DevOps and a storage account as remote backend","datePublished":"2026-02-03T09:00:48+00:00","dateModified":"2026-02-03T09:00:51+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/"},"wordCount":723,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-13.png","keywords":["Azure","Cloud","devops"],"articleSection":["Azure","Cloud","DevOps"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/","url":"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/","name":"Deploying Azure Terraform code with Azure DevOps and a storage account as remote backend - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-13.png","datePublished":"2026-02-03T09:00:48+00:00","dateModified":"2026-02-03T09:00:51+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/80889303f4b56d4e0d3637582fa1f705"},"description":"This blog presents how to manage the Terraform state file when using Azure Devops and Azure Storage account to store it","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-13.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/01\/image-13.png","width":467,"height":221},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Deploying Azure Terraform code with Azure DevOps and a storage account as remote backend"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/80889303f4b56d4e0d3637582fa1f705","name":"Adrien Devaux","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/bc472273cc9807635382578d8967f63a3602eb717ab361bcf2c8ee9a59b682b0?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/bc472273cc9807635382578d8967f63a3602eb717ab361bcf2c8ee9a59b682b0?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bc472273cc9807635382578d8967f63a3602eb717ab361bcf2c8ee9a59b682b0?s=96&d=mm&r=g","caption":"Adrien Devaux"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/adriendevaux\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/42496","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/90"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=42496"}],"version-history":[{"count":5,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/42496\/revisions"}],"predecessor-version":[{"id":42785,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/42496\/revisions\/42785"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=42496"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=42496"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=42496"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=42496"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}