跨 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:
我创建了一个简单的 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: