{"id":11421,"date":"2022-11-29T11:59:14","date_gmt":"2022-11-29T06:29:14","guid":{"rendered":"https:\/\/opstree.com\/blog\/\/?p=11421"},"modified":"2025-11-20T18:22:41","modified_gmt":"2025-11-20T12:52:41","slug":"deploying-terraform-iac-using-azure-devops-runtime-parameters","status":"publish","type":"post","link":"https:\/\/opstree.com\/blog\/2022\/11\/29\/deploying-terraform-iac-using-azure-devops-runtime-parameters\/","title":{"rendered":"Deploying Terraform IAC Using Azure DevOps Runtime Parameters"},"content":{"rendered":"\r\n<h2>Introduction<\/h2>\r\n<p>While deploying your same terraform code manually multiple times you must have got through the thoughts:<\/p>\r\n\r\n\r\n\r\n<ul>\r\n<li>If we can automate the whole deployment process\u00a0and replace the whole tedious process with few clicks.<\/li>\r\n\r\n\r\n\r\n<li>If we can dynamically change the values of terraform.tfvars.<\/li>\r\n\r\n\r\n\r\n<li>If we can restrict the regions of deployments.<\/li>\r\n\r\n\r\n\r\n<li>If we can limit our VM types to maintain better cost optimization.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>In this article, we will touch upon these problems and try to resolve them in a way that the same concepts can also be applied to similar requirements.<!--more--><\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\"><strong>Soo&#8230; Let&#8217;s Get Started !!!<\/strong><\/h2>\r\n\r\n\r\n\r\n<p>First of all, we need to know what is Terraform &amp; Azure DevOps.<\/p>\r\n\r\n\r\n\r\n<p><strong>Talking About Terraform<\/strong>: HashiCorp Terraform is an infrastructure as a code tool that lets you define both <a href=\"https:\/\/opstree.com\/blog\/2025\/03\/11\/comparison-of-confluent-kafka-on-prem-vs-confluent-kafka-on-azure-vs-azure-events-hub\/\">cloud and on-prem<\/a> resources in human-readable configuration files that you can version, reuse, and share. You can then use a consistent workflow to provision and manage all of your infrastructures throughout its cycle. Terraform can manage low-level components like compute, storage, and networking resources, as well as high-level components like DNS entries and SaaS features.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-10975\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2022\/06\/image-2.png?w=1024\" alt=\"\" width=\"629\" height=\"552\" \/>\r\n<figcaption class=\"wp-element-caption\">Terraform Workflow<br \/><a href=\"https:\/\/opstree.com\/blog\/2022\/11\/29\/deploying-terraform-iac-using-azure-devops-runtime-parameters\/\" target=\"_blank\" rel=\"noopener\">Also check out our guide on deploying Terraform IaC with runtime inputs in Azure DevOps.<\/a><br \/><br \/><\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n\r\n\r\n<p class=\"has-text-align-justify\"><strong>Talking about Azure DevOps:<\/strong> Azure DevOps provides developer services for allowing teams to plan work, collaborate on code development, and build and deploy applications. Azure DevOps supports a collaborative culture and set of processes that bring together developers, project managers, and contributors to develop software. It allows organizations to create and improve products at a faster pace than they can with traditional software development approaches.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" class=\"wp-image-10978\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2022\/06\/image-3.png?w=1024\" alt=\"\" width=\"800\" \/>\r\n<figcaption class=\"wp-element-caption\">DevOps lifecycle in Azure DevOps<\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<p>If you want to learn more about Azure DevOps <a href=\"https:\/\/azure.microsoft.com\/en-us\/products\/devops\" target=\"_blank\" rel=\"noopener\">click here<\/a>.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\"><strong>Pre-requisites:<\/strong><\/h2>\r\n\r\n\r\n\r\n<p>No matter whether we are deploying our infrastructure into Azure Cloud Services or <a href=\"https:\/\/aws.amazon.com\/\" target=\"_blank\" rel=\"noopener\">Amazon Web Services (AWS)<\/a>. All we need are the following checklist:<\/p>\r\n\r\n\r\n\r\n<ul>\r\n<li>Active Cloud Service (Azure\/AWS)<\/li>\r\n\r\n\r\n\r\n<li>Azure DevOps Account<\/li>\r\n\r\n\r\n\r\n<li>Terraform Code to deploy.<\/li>\r\n\r\n\r\n\r\n<li>A Linux machine (VM or EC2) for agent pool or Azure Microsoft-hosted agent.<\/li>\r\n\r\n\r\n\r\n<li>Storage Account (Azure Blob Container or AWS S3)<\/li>\r\n\r\n\r\n\r\n<li>Terraform code to deploy using terraform.tfvars.<\/li>\r\n<\/ul>\r\n<p><strong>[ Are you looking <a href=\"https:\/\/opstree.com\/aws-partner\/\" target=\"_blank\" rel=\"noopener\">AWS Services<\/a> ]<\/strong><\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\"><strong>Azure DevOps Pipeline<\/strong><\/h2>\r\n\r\n\r\n\r\n<p>Let&#8217;s take a scenario in which we will deploy a simple terraform code of Azure Virtual Machine using Azure DevOps pipelines.<\/p>\r\n\r\n\r\n\r\n<p>Have a look at the main.tf<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-syntaxhighlighter-code\">resource \"azurerm_resource_group\" \"rg\" {\r\n  name     = \"dev-${var.name}-rg\"\r\n  location = var.region\r\n}\r\n\r\nresource \"azurerm_virtual_network\" \"vnet\" {\r\n  name                = \"dev-${var.name}-vnet\"\r\n  address_space       = [\"10.0.0.0\/16\"]\r\n  location            = azurerm_resource_group.rg.location\r\n  resource_group_name = azurerm_resource_group.rg.name\r\n}\r\n\r\nresource \"azurerm_subnet\" \"subnet\" {\r\n  name                 = \"dev-${var.name}-subnet\"\r\n  resource_group_name  = azurerm_resource_group.rg.name\r\n  virtual_network_name = azurerm_virtual_network.vnet.name\r\n  address_prefixes     = [\"10.0.0.0\/24\"]\r\n}\r\n\r\nresource \"azurerm_network_interface\" \"nic\" {\r\n  name                = \"dev-${var.name}-nic\"\r\n  location            = azurerm_resource_group.rg.location\r\n  resource_group_name = azurerm_resource_group.rg.name\r\n\r\n  ip_configuration {\r\n    name                          = \"dev-${var.name}-ip\"\r\n    subnet_id                     = azurerm_subnet.subnet.id\r\n    private_ip_address_allocation = \"Dynamic\"\r\n  }\r\n}\r\n\r\nresource \"azurerm_linux_virtual_machine\" \"vm\" {\r\n  name                  = \"dev-${var.name}-vm\"\r\n  resource_group_name   = azurerm_resource_group.rg.name\r\n  location              = azurerm_resource_group.rg.location\r\n  size                  = var.vm_size\r\n  admin_username        = \"ubuntu\"\r\n  network_interface_ids = [\r\n    azurerm_network_interface.nic.id,\r\n  ]\r\n\r\n  admin_ssh_key {\r\n    username   = \"dev-${var.name}-key\"\r\n    public_key = file(\"~\/.ssh\/id_rsa.pub\")\r\n  }\r\n\r\n  os_disk {\r\n    caching              = \"ReadWrite\"\r\n    storage_account_type = var.vm_storage_account_type\r\n  }\r\n\r\n  source_image_reference {\r\n    publisher = \"Canonical\"\r\n    offer     = \"UbuntuServer\"\r\n    sku       = var.image_sku\r\n    version   = \"latest\"\r\n  }\r\n}<\/pre>\r\n\r\n\r\n\r\n<p>Let&#8217;s have a look at the terraform.tfvars file.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-syntaxhighlighter-code\">name                    = \"{vm}\"\r\n\r\nregion                  = \"{West Europe}\"\r\n\r\nvm_size                 = \"{StandardF2}\"\r\n\r\nvm_storage_account_type = \"{StandardLRS}\"\r\n\r\nimage_sku               = \"{16.04-LTS}\"<\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Pipeline Parameters<\/h3>\r\n\r\n\r\n\r\n<p>Let&#8217;s pass the following values dynamically using pipeline parameters.<\/p>\r\n\r\n\r\n\r\n<ol>\r\n<li>Name of VM and other resources.<\/li>\r\n\r\n\r\n\r\n<li>Regions of deployment.<\/li>\r\n\r\n\r\n\r\n<li>Size of VM.<\/li>\r\n\r\n\r\n\r\n<li>VM storage account type.<\/li>\r\n\r\n\r\n\r\n<li>VM image SKU<\/li>\r\n<\/ol>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>parameters:\r\n  - name: name\r\n    displayName: Name_of_Resource\r\n    type: string\r\n    default: application\r\n  \r\n  - name: region\r\n    displayName: region\r\n    type: string\r\n    default: eastus\r\n    values:\r\n    - eastus\r\n    - eastus2\r\n    - northeurope\r\n    - centralindia\r\n\r\n  - name: vmSize\r\n    displayName: VM_Size\r\n    type: string\r\n    default: D4s_v3\r\n    values:\r\n    - D2as_v4\r\n    - DS2_v2\r\n    - D4s_v3\r\n    - D2as_v4\r\n    - DS3_v2\r\n    - D8s_v3\r\n\r\n         \r\n  - name: vmStorageAccountType\r\n    displayName: VM_Storage_Account_Type\r\n    type: string\r\n    default: Standard_LRS\r\n    values:\r\n    - Standard_LRS\r\n    - StandardSSD_LRS\r\n    - Premium_LRS\r\n    - UltraSSD_LRS\r\n\r\n  - name: imageSKU\r\n    displayName: Image_SKU\r\n    type: string\r\n    default: 20.04-LTS\r\n    values:\r\n    - 16.04-LTS\r\n    - 18.04-LTS\r\n    - 20.04-LTS\r\n    - 22.04-LTS<\/code><\/pre>\r\n\r\n\r\n\r\n<p>In these pipeline parameters, we&#8217;re also restricting\/limiting the range of values by providing a list of values to our parameters. In this way, the user cannot go beyond these pre-defined values while executing the pipeline.<\/p>\r\n<p>If you want to Learn More about Pipeline <a href=\"https:\/\/www.buildpiper.io\/documentation\/\" target=\"_blank\" rel=\"noopener\">click here<\/a>.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\"><strong>Pipeline Steps:<\/strong><\/h2>\r\n\r\n\r\n\r\n<p>In our pipeline, &#8216;we will use the below-mentioned steps<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">1. Replacing Values<\/h3>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>- bash: |\r\n    sed -i \"s\/{vm}\/${{ parameters.name }}\/g\" terraform.tfvars\r\n    sed -i \"s\/{West Europe}\/${{ parameters.region }}\/g\" terraform.tfvars\r\n    sed -i \"s\/{StandardF2}\/${{ parameters.vmSize }}\/g\" terraform.tfvars\r\n    sed -i \"s\/{StandardLRS}\/${{ parameters.vmStorageAccountType }}\/g\" terraform.tfvars\r\n    sed -i \"s\/{16.04-LTS}\/${{ parameters.imageSKU }}\/g\" terraform.tfvars\r\n    cat terraform.tfvars\r\n  displayName: 'Replace Values'<\/code><\/pre>\r\n\r\n\r\n\r\n<p>This is the heart of our pipeline. In this step, we are using the terraform azure pipeline parameters.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">2. Terraform Tool Installer<\/h3>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>- task: TerraformInstaller@0\r\n  inputs:\r\n    terraformVersion: 'latest'\r\n  displayName: 'Install Terraform latest'<\/code><\/pre>\r\n\r\n\r\n\r\n<p>In this step, we will install terraform tool for our pipeline.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">3. Terraform Init<\/h3>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>- task: TerraformTaskV3@3\r\n  inputs:\r\n    provider: 'azurerm'\r\n    command: 'init'\r\n    backendServiceArm: 'Opstree-PoCs (4c93adXXXXXXXXXXXXXXXXXXXXXX8f3c)'\r\n    backendAzureRmResourceGroupName: 'jenkins_server'\r\n    backendAzureRmStorageAccountName: 'asdfghjkasdf'\r\n    backendAzureRmContainerName: 'backend'\r\n    backendAzureRmKey: 'backend.tfstate'<\/code><\/pre>\r\n\r\n\r\n\r\n<p>This step will initialize the terraform code and the terraform backend configuration.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">4. Terraform Validate<\/h3>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>\r\n- task: TerraformTaskV3@3\r\n  displayName: 'Terraform : Validate'\r\n  inputs:\r\n    command: validate<\/code><\/pre>\r\n\r\n\r\n\r\n<p>In this step, we will validate our terraform code configuration<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">5. Terraform Plan<\/h3>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>- task: TerraformTaskV3@3\r\n  displayName: 'Terraform : Plan'\r\n  inputs:\r\n    provider: 'azurerm'\r\n    command: 'plan'\r\n    commandOptions: '-lock=false'\r\n    environmentServiceNameAzureRM: 'Opstree-PoCs (4c9xxxxxxxxxxx3c)'<\/code><\/pre>\r\n\r\n\r\n\r\n<p>This step will caution the instructor for sure.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">6. Terraform Apply<\/h3>\r\n\r\n\r\n\r\n<pre class=\"wp-block-syntaxhighlighter-code\">- task: TerraformTaskV3@3\r\n  inputs:\r\n    provider: 'azurerm'\r\n    command: 'apply'\r\n    commandOptions: '-auto-approve'\r\n    environmentServiceNameAzureRM: 'Opstree-PoCs (4c93xxxxxxxxf3c)'<\/pre>\r\n\r\n\r\n\r\n<p>This step will execute the configuration file and launch a VM instance. When you run apply command, it will ask you, \u201cDo you want to perform these actions?\u201d, you need to type yes and hit enter. To skip that we have provided our configuration with an &#8220;-auto-approve&#8221; argument.<\/p>\r\n<p class=\"entry-title\">[Also Read: <a href=\"https:\/\/opstree.com\/blog\/2022\/12\/20\/deploying-azure-policy-using-terraform-module\/\" target=\"_blank\" rel=\"noopener\">Deploying Azure Policy using Terraform Module<\/a>]<\/p>\r\n\r\n\r\n\r\n<p>Upon saving and running our pipeline we can choose our desired parameters in this way.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"631\" height=\"909\" class=\"wp-image-12488\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2022\/11\/image.png?w=631\" alt=\"\" \/><\/figure>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<p>We will get a drop-down for each parameter whose value we restricted.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\"><strong>Conclusion<\/strong><\/h2>\r\n\r\n\r\n\r\n<p>So far we&#8217;ve learned how to make the pipeline for our terraform code using Azure DevOps Pipelines. Along with that, we&#8217;ve found out how to pass the runtime parameters to dynamically give values to our terraform.tfvars file and also restrict or limit the values as per our requirements.<\/p>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n<ul class=\"wp-block-social-links aligncenter is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-1 wp-block-social-links-is-layout-flex\"><li class=\"wp-social-link wp-social-link-linkedin  wp-block-social-link\"><a href=\"https:\/\/www.linkedin.com\/company\/opstree-solutions\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">LinkedIn<\/span><\/a><\/li>\r\n\r\n<li class=\"wp-social-link wp-social-link-youtube  wp-block-social-link\"><a href=\"https:\/\/www.youtube.com\/channel\/UCeLma6SpNYH7jjYKSBNSexw\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">YouTube<\/span><\/a><\/li>\r\n\r\n<li class=\"wp-social-link wp-social-link-github  wp-block-social-link\"><a href=\"https:\/\/github.com\/OpsTree\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">GitHub<\/span><\/a><\/li>\r\n\r\n<li class=\"wp-social-link wp-social-link-facebook  wp-block-social-link\"><a href=\"https:\/\/www.facebook.com\/opstree\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Facebook<\/span><\/a><\/li>\r\n\r\n<li class=\"wp-social-link wp-social-link-medium  wp-block-social-link\"><a href=\"https:\/\/medium.com\/buildpiper\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M20.962,7.257l-5.457,8.867l-3.923-6.375l3.126-5.08c0.112-0.182,0.319-0.286,0.527-0.286c0.05,0,0.1,0.008,0.149,0.02 c0.039,0.01,0.078,0.023,0.114,0.041l5.43,2.715l0.006,0.003c0.004,0.002,0.007,0.006,0.011,0.008 C20.971,7.191,20.98,7.227,20.962,7.257z M9.86,8.592v5.783l5.14,2.57L9.86,8.592z M15.772,17.331l4.231,2.115 C20.554,19.721,21,19.529,21,19.016V8.835L15.772,17.331z M8.968,7.178L3.665,4.527C3.569,4.479,3.478,4.456,3.395,4.456 C3.163,4.456,3,4.636,3,4.938v11.45c0,0.306,0.224,0.669,0.498,0.806l4.671,2.335c0.12,0.06,0.234,0.088,0.337,0.088 c0.29,0,0.494-0.225,0.494-0.602V7.231C9,7.208,8.988,7.188,8.968,7.178z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Medium<\/span><\/a><\/li><\/ul>\r\n","protected":false},"excerpt":{"rendered":"<p>Introduction While deploying your same terraform code manually multiple times you must have got through the thoughts: In this article, we will touch upon these problems and try to resolve them in a way that the same concepts can also be applied to similar requirements.<\/p>\n","protected":false},"author":222974219,"featured_media":29900,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":true,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[28070474],"tags":[335778,328543109,768739398,34463,4996032,3021235],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2025\/11\/DevSecOps-1.jpg","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfDBOm-2Yd","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/11421"}],"collection":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/users\/222974219"}],"replies":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/comments?post=11421"}],"version-history":[{"count":29,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/11421\/revisions"}],"predecessor-version":[{"id":29957,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/11421\/revisions\/29957"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media\/29900"}],"wp:attachment":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media?parent=11421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/categories?post=11421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/tags?post=11421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}