如何在Terraform中实现对现有资源的部分管理?
解决方案
核心思路是只让Terraform管理自己新增的资源和路由条目,不接管vpc-1的整体控制权,具体操作如下:
不要导入vpc-1或它的路由表作为Terraform管理的资源,改用
data数据源读取它们的信息:data "aws_vpc" "vpc_1" { filter { name = "tag:Name" values = ["vpc-1"] } } data "aws_route_table" "vpc_1_rt" { vpc_id = data.aws_vpc.vpc_1.id filter { name = "tag:Name" values = ["route-tables-1"] } }这样Terraform只会读取这些资源的状态,不会尝试修改或重置它们的整体配置。
创建VPC-z和对等连接,然后仅添加属于你的路由条目:
# 创建VPC-z resource "aws_vpc" "vpc_z" { cidr_block = "10.0.0.0/16" tags = { Name = "vpc-z" } } # 创建VPC对等连接 resource "aws_vpc_peering_connection" "vpc1_vpcz" { peer_vpc_id = data.aws_vpc.vpc_1.id vpc_id = aws_vpc.vpc_z.id auto_accept = true # 根据实际权限调整 } # 仅添加你需要的路由到vpc-1的路由表 resource "aws_route" "vpcz_to_vpc1" { route_table_id = data.aws_route_table.vpc_1_rt.id destination_cidr_block = aws_vpc.vpc_z.cidr_block vpc_peering_connection_id = aws_vpc_peering_connection.vpc1_vpcz.id }这个
aws_route资源只会管理你新增的这条指向VPC-z的路由,其他开发者添加的路由Terraform完全不会碰。销毁Terraform栈时,只会删除VPC-z、对等连接和你添加的那条路由,vpc-1和其他路由条目不受影响。
额外提醒
如果之前不小心导入了vpc-1的路由表资源,可以通过添加生命周期参数忽略其他变更:
resource "aws_route_table" "vpc_1_rt" { # ... 已导入的配置 ... lifecycle { ignore_changes = [routes] # 忽略整个routes列表的变更,但只保留自己添加的路由 # 或者更精准:只忽略除了自己那条之外的路由,但实现起来复杂,不如用数据源方式 } }
但这种方式不如用数据源安全,因为一旦配置有误,还是可能影响其他路由,优先推荐前面的数据源方案。
内容的提问来源于stack exchange,提问作者ustulation
相关产品推荐
相关产品推荐

