跨 Terraform 环境共享资源

Sharing resources across terraform environments

我创建了一个简单的 Terraform 基础设施,它将在 aws.I 上创建一些资源,每个环境变量都在单独的 tfvars 中。但是我确实有共享资源,比如可以跨环境使用的安全组。

如何构建代码,使 create/destroy 环境不破坏共享资源?。 我可以创建单独的工作区,但由于所有资源都在同一个 repo 中定义,如果我破坏一个环境,我将破坏进程中的共享资源。

我的目录结构简化版如下:

/
/main.tf
/vars/dev.tfvars
/vars/qa.tfvars
/vars/prod.tfvars

此外,在使用模块时,我如何指定在 terraform destroy

期间仅删除其中的一部分
module "vpc" {
  source = "terraform-aws-modules/vpc/aws"

  name = "my-vpc"
  cidr = "10.0.0.0/16"

  azs             = ["eu-west-1a", "eu-west-1b", "eu-west-1c"]
  private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
  public_subnets  = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]

  enable_nat_gateway = true
  enable_vpn_gateway = true

  tags = {
    Terraform = "true"
    Environment = "dev"
  }
} 

例如,如果我删除开发环境,我只想删除子网而不是 vpc,因为我在所有环境之间共享一个 vpc。

根据您的需要,您可以创建另一个仅包含您的共享资源的 TF 状态,然后将其作为变量或数据导入您当前的状态。 您可以按照以下步骤

/Shared-resources   <== shared stack to export SG
   /main.tf
   /export.tf
/Stack   <== Import SG here 
  /main.tf
  /vars/dev.tfvars
  /vars/qa.tfvars
  /vars/prod.tfvars

并且您创建了 2 个不同的管道 CICD 以在他的 TF 状态下部署“共享资源”,并在不同的 TF 状态下部署其他管道。

根据问题修改进行编辑:

首先,在许多环境中拥有一个唯一的 VPC 并不是一个好的做法,在您的情况下,您可以为每个环境拥有一个 VPC,这从一开始就解决了问题:)。

您可以做的是提取在另一个状态下创建的资源并保持 VPC 不变,这意味着提取共享服务状态下的子网和所有网络内容。然后将其作为数据或来自其他共享资源状态的变量导入您的 VPC 状态

另一种解决方案可能是使用 terraform workspaces to define each environment. See answer here: