Terraform多Region的格式

#Terraform #IaC

Table of Contents

Terraform 在基础设施的管理是是非常方便的。但是面对一个中型项目,管理文件的复杂度也会大幅提升。

特别是针对一个多regoin的项目,需要按regoin来进行拆分和管理,来获得更直观的资源展示。

这篇文章记录一下现在使用的项目结构,以便后续的复用

项目结构

  my-server tree .
.
├── eu-central-1
   ├── ec2.tf
   ├── lbs.tf
   ├── main.tf
   ├── security.tf
   └── vars.tf
├── main.tf
├── set_env.sh
├── terraform.tfstate.d
   ├── terraform.tfstate
   └── terraform.tfstate.backup
└── us-east-1
    ├── ec2.tf
    ├── main.tf
    └── security.tf

项目结构如上面的目录树,每一个区域都拆分到了单独的文件夹中,对于多region的中小型项目,可以清晰的拆分各个区域的资源。

配置文件

在maintf 中,来设置 provider。通过 module 来引入,对应的模块的文件夹。

# Main.tf

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "5.63.1"
    }
  }
  backend "local" {
    path = "./terraform.tfstate.d/terraform.tfstate"
  }
}

module "us_east" {
  source = "./us-east-1"
}

module "eu_central" {
  source = "./eu-central-1"
}

在子文件夹中,就可以直接在main 里面设置provider 配置,这里设置的是region区域。

# us-east-1 main.tf
provider "aws" {
  region = "us-east-1"
}
# eu-central-1 main.tf
provider "aws" {
  region = "eu-central-1"
}

通过上面的模块引入之后,就可以使用,标准的方式来预定义一些变量了 。

variable "aws_vpc_id" {
    type = string
    description = "AWS VPC ID"
    default = "vpc-xxxx"
}

locals {
  vpc_info = {
    id = "vpc-0936ab715c6cee712"
    sub_private_a = "subnet-xxxx111"
    sub_private_b = "subnet-xxxx222"
  }
}


variable "public_subnets" {
  description = "List of Availability Zones"
  type        = list(string)
  default     = ["subnet-xxxxcccc", "subnet-xxxxdddd"]
}

以上记录一下,对于多region 的场景下如何来设计项目的目录结构来进行合理的划分和隔离。

这样避免了单个层级,堆叠了多区域/多文件 带来的管理混乱的问题。