跨 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 环境共享资源的主要内容,如果未能解决你的问题,请参考以下文章
AWS on Terraform - 如何避免“强制使用新资源”