跨 terraform 环境共享资源

Posted

技术标签:

【中文标题】跨 terraform 环境共享资源【英文标题】:Sharing resources across terraform environments 【发布时间】:2022-01-23 19:48:33 【问题描述】:

我创建了一个简单的 terraform 基础架构,它将在 aws 上创建一些资源。我将每个环境变量放在一个单独的 tfvars 中。但是,我确实有共享资源,例如可以跨环境使用的安全组。

如何构建代码,以便在不破坏共享资源的情况下创建/破坏环境? 我可以创建单独的工作区,但由于所有资源都在同一个 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_***_gateway = true

  tags = 
    Terraform = "true"
    Environment = "dev"
  
 

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

【问题讨论】:

你已经根据我对使用共享资源的回答改变了你的问题,所以我的回答已经过时了 理想情况下,您可以按工作空间拆分环境,并将共享资源分离到它们自己的模块中。但是,由于共享资源和环境资源在您的环境和配置中是如此紧密耦合,那么您可能会遇到困难。另请注意,不使用terraform destroy 而是使用terraform plan/apply 和正常的配置更新将解决您关于选择性资源删除的问题。 换句话说:您要么需要重新构建基础架构以将共享资源和环境资源解耦,要么重新构建配置以将共享资源与同一模块中的环境资源解耦. 【参考方案1】:

根据您的需要,您可以创建另一个仅包含共享资源的 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 状态

【讨论】:

检查我的编辑。我添加了有关模块的另一个详细信息 是的,您已根据我对使用共享资源的回答更改了您的问题,因此我的回答已过时 –【参考方案2】:

另一种解决方案是使用 terraform workspaces 来定义每个环境。在这里查看答案:Sharing resources between Terraform workspaces

【讨论】:

以上是关于跨 terraform 环境共享资源的主要内容,如果未能解决你的问题,请参考以下文章

基于条件阶段变量字符串的 Terraform 资源

在 Terraform 工作空间之间共享资源

AWS on Terraform - 如何避免“强制使用新资源”

Terraform入门教程,示例展示管理Docker和Kubernetes资源

使用IBM Cloud Schematics部署云资源

使用IBM Cloud Schematics部署云资源