{"id":13012,"date":"2025-08-29T16:26:23","date_gmt":"2025-08-29T16:26:23","guid":{"rendered":"https:\/\/cheesecakelabs.com\/blog\/"},"modified":"2025-08-29T16:31:51","modified_gmt":"2025-08-29T16:31:51","slug":"terraform-multi-cloud-project-structure-multi-region-setups","status":"publish","type":"post","link":"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/","title":{"rendered":"Terraform Multi-Cloud Project Structure: Best Practices for Multi-Region Setups"},"content":{"rendered":"\n<p>In the age of automation and scalability, <a href=\"https:\/\/learn.microsoft.com\/en-us\/devops\/deliver\/what-is-infrastructure-as-code\" target=\"_blank\" rel=\"noreferrer noopener\">Infrastructure as Code (IaC)<\/a> has transformed the way IT teams manage and provision resources. What used to be done with time-consuming manual processes or improvised scripts can now be described in clear, versionable, and reusable configuration files.<\/p>\n\n\n\n<p>Among IaC tools, <a href=\"https:\/\/www.terraform.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Terraform<\/a> stands out as one of the most powerful and popular, allowing engineers to define complex infrastructures in code, promoting consistency, collaboration, and efficiency.<\/p>\n\n\n\n<p>Here at <a href=\"https:\/\/cheesecakelabs.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Cheesecake Labs<\/a>, we use Terraform to automate processes and create scalable solutions, especially in projects involving multi-clouds and multi-regions. <\/p>\n\n\n\n<p><strong>But how do you structure a Terraform project so it\u2019s organized, easy to maintain, and ready to grow?<\/strong><\/p>\n\n\n\n<p>In this blog post, we&#8217;ll share our approach to creating a <a href=\"https:\/\/cheesecakelabs.com\/blog\/infrastructure-code-best-practices-terraform\/\" target=\"_blank\" rel=\"noreferrer noopener\">clear and scalable Terraform<\/a> multi-cloud project structure, including best practices, a suggested folder structure, and explanations of the files that make up each part of the project.&nbsp;<\/p>\n\n\n\n<p>If you&#8217;ve ever wondered, &#8220;How do I organize my Terraform directories?&#8221;, this guide is for you!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Why Terraform?<\/strong><\/h2>\n\n\n\n<p>When working with complex infrastructures that span multiple cloud providers and regions, you need tools that offer flexibility, consistency, and strong ecosystem support.<\/p>\n\n\n\n<p>Terraform meets those requirements for several reasons, including:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Cloud-agnostic by design:<\/strong> Terraform supports all major cloud providers \u2014 like <a href=\"https:\/\/aws.amazon.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">AWS<\/a>, <a href=\"https:\/\/azure.microsoft.com\/en-gb\/resources\/cloud-computing-dictionary\/what-is-azure\" target=\"_blank\" rel=\"noreferrer noopener\">Azure<\/a>, and <a href=\"https:\/\/cloud.google.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Google Cloud<\/a> \u2014 through a unified configuration language (HCL). This makes it ideal for managing multi-cloud environments from a single codebase.<\/li>\n\n\n\n<li><strong>Declarative and predictable:<\/strong> Terraform lets you describe the desired state of your infrastructure. It then takes care of provisioning, updating, or deleting resources to match that state. This helps reduce human error and makes changes more predictable.<\/li>\n\n\n\n<li><strong>Strong support for modularity:<\/strong> Using modules, you can break your infrastructure into reusable components. This is especially useful when you want to replicate infrastructure across regions or clouds while maintaining consistency.<\/li>\n\n\n\n<li><strong>Remote state and change tracking:<\/strong> Terraform maintains a state file that tracks what resources it manages. This enables features like plan previews (terraform plan), targeted applies, and rollback strategies when using remote state backends.<\/li>\n\n\n\n<li><strong>Tooling and ecosystem:<\/strong> From integrations with CI\/CD tools to community-backed modules in the <a href=\"https:\/\/registry.terraform.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Terraform Registry<\/a>, there\u2019s a mature ecosystem around Terraform that supports automation, testing, and scaling best practices.<\/li>\n<\/ul>\n\n\n\n<p>Terraform gives us the building blocks we need to structure scalable, modular, and maintainable infrastructure across clouds and regions, without locking ourselves into any single provider.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Challenges in structuring a multi-cloud and multi-region Terraform project<\/strong><\/h2>\n\n\n\n<p>Implementing a Terraform project that spans multiple clouds and regions comes with plenty of challenges. Here are a few that you\u2019ll likely encounter:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Managing the Terraform state<\/strong><\/h3>\n\n\n\n<p>One of the main challenges is managing the Terraform state, which stores the mapping between the resources defined in the configuration files and the actual resources provisioned.<\/p>\n\n\n\n<p>In a multi-cloud and multi-region environment, this state can become fragmented and difficult to manage, especially when different teams or processes need to access different parts of the state simultaneously. Plus, the risk of state conflicts or corruption is real if the project is not well structured.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Ensuring modularity and code reuse<\/strong><\/h3>\n\n\n\n<p>Ensuring modularity and code reuse is crucial to avoiding redundancies and maintaining development efficiency.<\/p>\n\n\n\n<p>Creating modules that can be easily reused in different clouds and regions is fundamental to keeping the project scalable and manageable in the long term.<\/p>\n\n\n\n<p>It also helps to propagate good practices between environments when adopted. However, this requires careful organization of files and folders and a clear understanding of the particularities of each cloud provider.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Configuring cloud providers<\/strong><\/h3>\n\n\n\n<p>Finally, configuring cloud providers in Terraform can be complex. Each provider has its own APIs and configuration requirements, which means you need to create specific configurations for each one, while ensuring that the code is consistent and easy to maintain.<\/p>\n\n\n\n<p>In addition, each region may have its own peculiarities, like service availability or compliance requirements, which add another layer of complexity to the project.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Folder structure your Terraform multi-cloud\/multi-region project<\/strong><\/h2>\n\n\n\n<p>To efficiently manage a project that spans several clouds and regions, it is essential to have a well-organized folder structure. Here\u2019s a structure that can be adapted to your project&#8217;s needs:<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\"><pre class=\"wp-block-code\"><span><code class=\"hljs\">\/terraform\/\n\u251c\u2500\u2500 docs\/\n\u251c\u2500\u2500 live\/\n\u2502 \u251c\u2500\u2500 development\/\n\u2502   \t  \u251c\u2500\u2500 aws\/\n\u2502   \t  \t\u251c\u2500\u2500 us-east-1\/\n\u2502   \t  \t    \u251c\u2500\u2500 _setup\/\n\u2502\t  \u251c\u2500\u2500 azure\/\n\u2502   \t  \t\u251c\u2500\u2500 eastus\/\n\u2502   \t  \t    \u251c\u2500\u2500 _setup\/\n\u2502 \u251c\u2500\u2500 staging\/\n\u2502   \t  \u251c\u2500\u2500 aws\/\n\u2502\t  \u251c\u2500\u2500 ...\n\u2502 \u2514\u2500\u2500 production\/\n\u2502   \t  \u251c\u2500\u2500 aws\/\n\u2502\t  \u251c\u2500\u2500 ...\n\u251c\u2500\u2500 modules\/\n\u2502 \u251c\u2500\u2500 aws\/\n\u2502   \t  \u251c\u2500\u2500 network\/\n\u2502   \t  \t\u251c\u2500\u2500 1.0.0\/\n\u2502   \t  \t\u251c\u2500\u2500 1.3.1\/\n\u2502   \t  \t\u251c\u2500\u2500 ...\n\u2502\t  \u251c\u2500\u2500 database\/\n\u2502\t  \u251c\u2500\u2500 ...\n\u2502 \u251c\u2500\u2500 azure\/\n\u2502   \t  \u251c\u2500\u2500 network\/\n\u2502\t  \u251c\u2500\u2500 ...<\/code><\/span><\/pre><\/div>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Why this structure?<\/strong><\/h3>\n\n\n\n<p>Why does this structure work so well? Here\u2019s how it works:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Separation by environment<\/strong>: Directories such as development, staging, and production isolate environments, making it easier to manage differences such as instance sizes, security policies, or specific variables. This prevents changes in one environment from accidentally impacting another.<\/li>\n\n\n\n<li><strong>Organization by provider<\/strong>: Folders such as AWS and Azure within each environment reflect the cloud providers, allowing specific configurations without mixing different logics.<\/li>\n\n\n\n<li><strong>Separation by region<\/strong>: Folders such as us-east-1 (AWS) or eastus (Azure) separate regions, reflecting particularities such as latency, service availability, or compliance requirements. This makes it easier to manage regional resources and apply specific configurations, such as availability zones or local firewall rules.<\/li>\n\n\n\n<li><strong>Terraform state segregation<\/strong>: By dividing the project into environments, providers, and regions, the Terraform state (terraform.tfstate) is naturally segregated. In large structures, this significantly decreases the chance of state corruption, because each live folder (and its regional subfolders) maintains its own independent state file. Instead of a single monolithic state, which can become a point of failure in complex projects, this approach distributes the risk, making the infrastructure more resilient and easier to debug.<\/li>\n\n\n\n<li><strong>Reusable modules<\/strong>: The modules folder contains specific code blocks for each provider (e.g.,aws\/network, azure\/database), promoting reuse and consistency across all environments and regions.<\/li>\n\n\n\n<li><strong>Module versioning<\/strong>: Versioned modules allow the code to evolve in a controlled manner. Changes can be tested in development, promoted to staging, and finally applied in production. We chose this versioning approach in folders (1.0.0, 1.3.1, etc.) in a monorepo for its simplicity, but you can also use separate repositories for each module, depending on your needs.<\/li>\n\n\n\n<li><strong>Documentation: <\/strong>This topic is often overlooked, but having infrastructure documentation can be very helpful. For example, it can help facilitate understanding and onboard new people, or help reduce complexity by explaining the entire project in simpler terms.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>File Structure<\/strong><\/h3>\n\n\n\n<p>Now that we have the folder structure, let&#8217;s detail the files that make up the live (the actual environments where resources are provisioned) and modules (where we define reusable blocks) folders.&nbsp;<\/p>\n\n\n\n<p>Here&#8217;s our file structure suggestion:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Live folders (e.g., \/live\/development\/aws\/)<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>main.tf<\/strong>: Terraform&#8217;s entry point. It defines the resources to be provisioned by calling modules and configuring dependencies. We keep it simple, delegating the heavy logic to the modules.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\"><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">module<\/span> <span class=\"hljs-string\">\"network\"<\/span> {\n source = <span class=\"hljs-string\">\".\/modules\/network\"<\/span>\n name_prefix = <span class=\"hljs-keyword\">var<\/span>.name_prefix\n cidr_prefix = <span class=\"hljs-keyword\">var<\/span>.cidr_prefix\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n<\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>variables.tf<\/strong>: Declares the project&#8217;s variables, such as region, instance type, or environment name. This allows customization without changing the main code.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\"><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">variable <span class=\"hljs-string\">\"region\"<\/span> {\n description = <span class=\"hljs-string\">\"AWS region to deploy resources\"<\/span>\n type        = string\n <span class=\"hljs-keyword\">default<\/span>     = <span class=\"hljs-string\">\"us-east-1\"<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li><strong>outputs.tf<\/strong>: Defines Terraform outputs, such as instance IPs or service URLs. This information is helpful for CI\/CD pipelines or automation scripts.<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">output <span class=\"hljs-string\">\"vpc_id\"<\/span> {\n description = <span class=\"hljs-string\">\"VPC ID\"<\/span>\n value       = aws_vpc.vpc.id\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n<\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>locals.tf<\/strong>: Stores <strong>local <\/strong>variables, such as combinations of values or environment-specific constants. It helps maintain DRY (<a href=\"https:\/\/www.geeksforgeeks.org\/software-engineering\/dont-repeat-yourselfdry-in-software-development\/\" target=\"_blank\" rel=\"noreferrer noopener\">Don&#8217;t Repeat Yourself<\/a>) code.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\"><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">locals {\n name_prefix         = <span class=\"hljs-keyword\">var<\/span>.name_prefix\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n<\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>provider.tf<\/strong>: Configures cloud providers (e.g., AWS, Azure) with credentials and parameters such as region. We parameterize with variables for flexibility.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\"><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">terraform {\n backend <span class=\"hljs-string\">\"s3\"<\/span> {\n   bucket         = <span class=\"hljs-string\">\"project-terraform-state\"<\/span>\n   dynamodb_table = <span class=\"hljs-string\">\"project-terraform-locks\"<\/span>\n   key            = <span class=\"hljs-string\">\"terraform.tfstate\"<\/span>\n   region         = <span class=\"hljs-string\">\"us-east-1\"<\/span>\n   encrypt        = <span class=\"hljs-literal\">true<\/span>\n }\n}\n\n\nprovider <span class=\"hljs-string\">\"aws\"<\/span> {\n region              = <span class=\"hljs-keyword\">var<\/span>.region\n allowed_account_ids = <span class=\"hljs-keyword\">var<\/span>.allowed_account_ids\n default_tags {\n   tags = <span class=\"hljs-keyword\">var<\/span>.default_tags\n }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li><strong>terraform.auto.tfvars<\/strong>: Contains default values for the variables, loaded automatically by Terraform. Ideal for environment-specific configurations.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\"><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">region              = <span class=\"hljs-string\">\"us-east-2\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n<\/div>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Modules folders (e.g., \/modules\/aws\/network\/)<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>main.tf<\/strong>: Defines the module&#8217;s resources, such as a VPC or subnet. It\u2019s the heart of the module, but focused on a single responsibility.<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">resource <span class=\"hljs-string\">\"aws_vpc\"<\/span> <span class=\"hljs-string\">\"vpc\"<\/span> {\n cidr_block           = <span class=\"hljs-string\">\"${var.cidr_prefix}.0.0\/16\"<\/span>\n enable_dns_hostnames = <span class=\"hljs-literal\">true<\/span>\n enable_dns_support   = <span class=\"hljs-literal\">true<\/span>\n\n\n tags = merge(local.tags, {\n   Name = <span class=\"hljs-string\">\"${local.name_prefix}-vpc\"<\/span>\n })\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li><strong>variables.tf<\/strong>: Lists the variables that the module accepts, such as CIDR blocks or tags. This allows the module to be configurable when called.<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">variable <span class=\"hljs-string\">\"name_prefix\"<\/span> {\n description = <span class=\"hljs-string\">\"Name prefix\"<\/span>\n type        = string\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li><strong>outputs.tf<\/strong>: Returns values generated by the module, such as resource IDs, for use in other modules or in live.<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">output <span class=\"hljs-string\">\"vpc_id\"<\/span> {\n description = <span class=\"hljs-string\">\"VPC ID\"<\/span>\n value       = aws_vpc.vpc.id\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li><strong>locals.tf<\/strong>: Stores calculations or derived values within the module, keeping the logic encapsulated.<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">locals {\n Name_prefix = <span class=\"hljs-keyword\">var<\/span>.name_prefix\n azs  \t\t= &#91;<span class=\"hljs-keyword\">for<\/span> i, az <span class=\"hljs-keyword\">in<\/span> <span class=\"hljs-keyword\">var<\/span>.azs : <span class=\"hljs-string\">\"${data.aws_region.current.name}${az}\"<\/span>]\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li><strong>version.tf<\/strong>: Specifies the minimum versions of Terraform and the provider (e.g., terraform { required_providers { aws = &#8220;&gt;= 4.0&#8221; } }). Ensures compatibility and consistency.<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">terraform {\n required_version = <span class=\"hljs-string\">\"&gt;= 1.0\"<\/span>\n required_providers {\n   aws = {\n     source  = <span class=\"hljs-string\">\"hashicorp\/aws\"<\/span>\n     version = <span class=\"hljs-string\">\"&gt;= 5.0\"<\/span>\n   }\n }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This separation keeps the modules generic and the live folders specific, balancing reuse and customization.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>The _setup folder: Managing Terraform state<\/strong><\/h2>\n\n\n\n<p>A critical aspect of Terraform projects is <a href=\"https:\/\/developer.hashicorp.com\/terraform\/language\/state\" target=\"_blank\" rel=\"noreferrer noopener\">state management<\/a> (terraform.tfstate). In multi-cloud and multi-region environments, storing state centrally and securely is essential. To do this, we introduce the _setup folder inside each region folder (e.g., \/live\/development\/aws\/_setup\/).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>_setup Folder Structure<\/strong><\/h3>\n\n\n\n<p>The _setup folder follows the same file structure as the live folder:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>main.tf, variables.tf, outputs.tf, locals.tf, provider.tf, terraform.auto.tfvars.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Objective<\/strong><\/h4>\n\n\n\n<p>The purpose of <strong>_setup<\/strong> is to provision the resources needed to manage the state of Terraform remotely and robustly, configuring the <strong>Terraform backend <\/strong>that the <strong>live<\/strong> folders will use. This includes, for example:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>An S3 bucket (on AWS) or Storage Account (on Azure) to store the remote status file.<\/li>\n\n\n\n<li>A DynamoDB table (on AWS) for lock control, avoiding conflicts in simultaneous executions.<\/li>\n<\/ul>\n\n\n\n<p>By running terraform apply on each region&#8217;s _setup folder, these resources are created, and each region&#8217;s backend can be configured to use them, so that each region&#8217;s state can be stored remotely separately.<\/p>\n\n\n\n<p>The backend provides centralization, versioning, security, and concurrency control, making state management more reliable in complex projects.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Particularity of the state<\/strong><\/h3>\n\n\n\n<p>The terraform.tfstate file generated by the _setup folder is versioned directly inside it in the Git repository.<\/p>\n\n\n\n<p>Why? Because it only contains information about the state management resources (e.g., the S3 bucket), which are not sensitive. The state of the live folders (which describes the actual infrastructure) is stored remotely in the provisioned bucket, with encryption and access control.<\/p>\n\n\n\n<p>This approach simplifies the start-up of new projects or regions, ensuring that the remote backend is ready before provisioning the main resources.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclusion<\/strong><\/h2>\n\n\n\n<p>Structuring a multi-cloud and multi-region Terraform project can be challenging, but with an organized and modular approach, you can create a scalable and easy-to-manage solution.<\/p>\n\n\n\n<p>The key is to adopt best practices such as segregating environments and regions, reusing modules, and parameterizing variables.<\/p>\n\n\n\n<p>With this approach, you and your team will be prepared to face the challenges of a multi-cloud environment with confidence and efficiency.<\/p>\n\n\n\n<p>Do you need help provisioning and managing highly available and scalable infrastructures? At Cheesecake Labs, our team of DevOps and Cloud Computing professionals prioritizes creating environments tailored to each project and client&#8217;s needs, in an agile and documented manner, always focusing on the cost-benefit ratio.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/cheesecakelabs.com\/contact\/\" target=\"_blank\" rel=\" noreferrer noopener\"><img decoding=\"async\" width=\"1200\" height=\"687\" src=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2024\/02\/CTA-2025-1200x687.png\" alt=\"\" class=\"wp-image-12624\" srcset=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2024\/02\/CTA-2025-1200x687.png 1200w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2024\/02\/CTA-2025-600x343.png 600w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2024\/02\/CTA-2025-768x439.png 768w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2024\/02\/CTA-2025-760x435.png 760w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2024\/02\/CTA-2025.png 1358w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" \/><\/a><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the age of automation and scalability, Infrastructure as Code (IaC) has transformed the way IT teams manage and provision resources. What used to be done with time-consuming manual processes or improvised scripts can now be described in clear, versionable, and reusable configuration files. Among IaC tools, Terraform stands out as one of the most [&hellip;]<\/p>\n","protected":false},"author":81,"featured_media":13015,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[432],"tags":[1329,1199,1299],"class_list":["post-13012","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-engineering","tag-devops-services","tag-software-development","tag-terraform"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Terraform Multi-Cloud Project Structure: Multi Region Setups<\/title>\n<meta name=\"description\" content=\"How to build a scalable Terraform multi-cloud project structure for multi-region projects with clear folder organization and reusable modules\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Terraform Multi-Cloud Project Structure: Multi Region Setups\" \/>\n<meta property=\"og:description\" content=\"How to build a scalable Terraform multi-cloud project structure for multi-region projects with clear folder organization and reusable modules\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/\" \/>\n<meta property=\"og:site_name\" content=\"Cheesecake Labs\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/cheesecakelabs\" \/>\n<meta property=\"article:published_time\" content=\"2025-08-29T16:26:23+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-29T16:31:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2025\/08\/terraform-multi-cloud-project-structure-multi-region-setups.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"861\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Cheesecake Labs\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@cheesecakelabs\" \/>\n<meta name=\"twitter:site\" content=\"@cheesecakelabs\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/\"},\"author\":{\"name\":\"\u00c1lan Monteiro\"},\"headline\":\"Terraform Multi-Cloud Project Structure: Best Practices for Multi-Region Setups\",\"datePublished\":\"2025-08-29T16:26:23+00:00\",\"dateModified\":\"2025-08-29T16:31:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/\"},\"wordCount\":1710,\"image\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2025\/08\/terraform-multi-cloud-project-structure-multi-region-setups.png\",\"keywords\":[\"devops services\",\"software development\",\"terraform\"],\"articleSection\":[\"Engineering\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/\",\"url\":\"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/\",\"name\":\"Terraform Multi-Cloud Project Structure: Multi Region Setups\",\"isPartOf\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2025\/08\/terraform-multi-cloud-project-structure-multi-region-setups.png\",\"datePublished\":\"2025-08-29T16:26:23+00:00\",\"dateModified\":\"2025-08-29T16:31:51+00:00\",\"author\":{\"@type\":\"person\",\"name\":\"\u00c1lan Monteiro\"},\"description\":\"How to build a scalable Terraform multi-cloud project structure for multi-region projects with clear folder organization and reusable modules\",\"breadcrumb\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/#primaryimage\",\"url\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2025\/08\/terraform-multi-cloud-project-structure-multi-region-setups.png\",\"contentUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2025\/08\/terraform-multi-cloud-project-structure-multi-region-setups.png\",\"width\":1920,\"height\":861},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cheesecakelabs.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Terraform Multi-Cloud Project Structure: Best Practices for Multi-Region Setups\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/#website\",\"url\":\"https:\/\/cheesecakelabs.com\/blog\/\",\"name\":\"Cheesecake Labs\",\"description\":\"Nearshore outsourcing company for Web and Mobile design and engineering services, and staff augmentation for startups and enterprises..\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cheesecakelabs.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"name\":\"\u00c1lan Monteiro\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2024\/06\/alan-monteiro.jpeg\",\"contentUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2024\/06\/alan-monteiro.jpeg\",\"caption\":\"\u00c1lan Monteiro\"},\"url\":\"https:\/\/cheesecakelabs.com\/blog\/autor\/alan-monteiro\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Terraform Multi-Cloud Project Structure: Multi Region Setups","description":"How to build a scalable Terraform multi-cloud project structure for multi-region projects with clear folder organization and reusable modules","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:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/","og_locale":"en_US","og_type":"article","og_title":"Terraform Multi-Cloud Project Structure: Multi Region Setups","og_description":"How to build a scalable Terraform multi-cloud project structure for multi-region projects with clear folder organization and reusable modules","og_url":"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/","og_site_name":"Cheesecake Labs","article_publisher":"https:\/\/www.facebook.com\/cheesecakelabs","article_published_time":"2025-08-29T16:26:23+00:00","article_modified_time":"2025-08-29T16:31:51+00:00","og_image":[{"width":1920,"height":861,"url":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2025\/08\/terraform-multi-cloud-project-structure-multi-region-setups.png","type":"image\/png"}],"author":"Cheesecake Labs","twitter_card":"summary_large_image","twitter_creator":"@cheesecakelabs","twitter_site":"@cheesecakelabs","twitter_misc":{"Written by":null,"Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/#article","isPartOf":{"@id":"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/"},"author":{"name":"\u00c1lan Monteiro"},"headline":"Terraform Multi-Cloud Project Structure: Best Practices for Multi-Region Setups","datePublished":"2025-08-29T16:26:23+00:00","dateModified":"2025-08-29T16:31:51+00:00","mainEntityOfPage":{"@id":"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/"},"wordCount":1710,"image":{"@id":"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/#primaryimage"},"thumbnailUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2025\/08\/terraform-multi-cloud-project-structure-multi-region-setups.png","keywords":["devops services","software development","terraform"],"articleSection":["Engineering"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/","url":"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/","name":"Terraform Multi-Cloud Project Structure: Multi Region Setups","isPartOf":{"@id":"https:\/\/cheesecakelabs.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/#primaryimage"},"image":{"@id":"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/#primaryimage"},"thumbnailUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2025\/08\/terraform-multi-cloud-project-structure-multi-region-setups.png","datePublished":"2025-08-29T16:26:23+00:00","dateModified":"2025-08-29T16:31:51+00:00","author":{"@type":"person","name":"\u00c1lan Monteiro"},"description":"How to build a scalable Terraform multi-cloud project structure for multi-region projects with clear folder organization and reusable modules","breadcrumb":{"@id":"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/#primaryimage","url":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2025\/08\/terraform-multi-cloud-project-structure-multi-region-setups.png","contentUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2025\/08\/terraform-multi-cloud-project-structure-multi-region-setups.png","width":1920,"height":861},{"@type":"BreadcrumbList","@id":"https:\/\/cheesecakelabs.com\/blog\/terraform-multi-cloud-project-structure-multi-region-setups\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cheesecakelabs.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Terraform Multi-Cloud Project Structure: Best Practices for Multi-Region Setups"}]},{"@type":"WebSite","@id":"https:\/\/cheesecakelabs.com\/blog\/#website","url":"https:\/\/cheesecakelabs.com\/blog\/","name":"Cheesecake Labs","description":"Nearshore outsourcing company for Web and Mobile design and engineering services, and staff augmentation for startups and enterprises..","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cheesecakelabs.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","name":"\u00c1lan Monteiro","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cheesecakelabs.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2024\/06\/alan-monteiro.jpeg","contentUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2024\/06\/alan-monteiro.jpeg","caption":"\u00c1lan Monteiro"},"url":"https:\/\/cheesecakelabs.com\/blog\/autor\/alan-monteiro\/"}]}},"_links":{"self":[{"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/posts\/13012","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/users\/81"}],"replies":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/comments?post=13012"}],"version-history":[{"count":2,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/posts\/13012\/revisions"}],"predecessor-version":[{"id":13017,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/posts\/13012\/revisions\/13017"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/media\/13015"}],"wp:attachment":[{"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/media?parent=13012"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/categories?post=13012"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/tags?post=13012"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}