使用 Terraform AWS Provider 构建同区域 Transit Gateway Peering完整实战指南【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws本指南以仓库中的 transit-gateway-intra-region-peering 示例 为主线演示如何在同一个 AWS 账户、同一个区域内创建两个 EC2 Transit GatewayTGW分别挂载一个 VPC再通过 Peering Attachment 打通两个 TGW使跨 TGW 的 VPC 流量可以相互转发。读完本文你将掌握aws_ec2_transit_gateway_peering_attachment、aws_ec2_transit_gateway_peering_attachment_accepter与配套数据源/资源在真实 Terraform 配置中的组合用法并理解其背后的 AWS API 调用与状态流转机制。一、示例场景与整体架构示例位于 examples/transit-gateway-intra-region-peering核心思路是在同一区域创建两个 Transit Gatewayexample_tgw_1与example_tgw_2为每个 TGW 各创建一个 VPC 与子网并通过 VPC Attachment 挂载以aws_ec2_transit_gateway_peering_attachment在 TGW1 与 TGW2 之间发起 Peering 请求由于同区域内 TGW 对等连接也需要“接收方”确认示例使用数据源按transit-gateway-id过滤出 TGW2 侧的 Peering Attachment再由aws_ec2_transit_gateway_peering_attachment_accepter接受请求最终完成打通。从源码结构看示例注释明确说明创建一个 Peering Attachment 资源实际会生成两条对等关系——一条属于 Gateway 1Creator发起方一条属于 Gateway 2Acceptor接收方后者必须被显式接受后连接才会进入可用状态。二、运行前提与前置条件原文档给出两条硬性前提务必先确认再执行组织与账户要求本示例需要一个 AWS 账户当跨账户对等时参与账户须位于同一个 AWS Organizations 组织内示例本身的变量设计也支持在peer_account_id层面做扩展。启用 Resource Access ManagerRAM确保组织内已启用 RAM 服务否则跨账户的资源共享/对等请求无法正常流转。此外日常运行还依赖本机已配置好 AWS 凭证如aws configure配置的 profile以及已安装 Terraform示例的main.tf声明required_version 0.12。三、两种运行方式方式一通过 tfvars 文件推荐仓库提供了 terraform.template.tfvars 模板内容如下# AWS Profile (type aws configure) aws_profile default # AWS Region aws_region us-east-1将其复制为terraform.tfvars并按需修改cp terraform.template.tfvars terraform.tfvars随后在示例目录下依次执行terraform init、terraform plan与terraform apply。方式二通过 CLI 变量直接传入也可以不创建 tfvars 文件直接以-var参数注入terraform apply \ -varaws_profileaws-account \ -varaws_regionus-east-1两个变量在 variables.tf 中声明均为无默认值的必传变量aws_profile指定 AWS 凭证 Profileaws_region指定目标区域示例默认语义为us-east-1模板值亦如此。Provider 配置见 main.tfprovider aws { region var.aws_region profile var.aws_profile }四、完整配置逐段拆解下面按资源创建顺序逐段讲解 main.tf 的完整内容。4.1 VPC 与子网为两个 TGW 各准备一套网络CIDR 刻意错开10.1.0.0/16与10.2.0.0/16便于观察路由与连通性resource aws_vpc example_vpc_1 { cidr_block 10.1.0.0/16 tags { Name terraform-example-vpc-1 } } resource aws_subnet example_subnet_1 { cidr_block 10.1.0.0/24 vpc_id aws_vpc.example_vpc_1.id tags { Name terraform-example-subnet-1 } } resource aws_vpc example_vpc_2 { cidr_block 10.2.0.0/16 tags { Name terraform-example-vpc-2 } } resource aws_subnet example_subnet_2 { cidr_block 10.2.0.0/24 vpc_id aws_vpc.example_vpc_2.id tags { Name terraform-example-subnet-2 } }4.2 Transit Gateway 与 VPC Attachment创建两个 TGW并通过aws_ec2_transit_gateway_vpc_attachment将各自 VPC 挂载上去。subnet_ids至少需要提供一个可用区内的子网 IDresource aws_ec2_transit_gateway example_tgw_1 { tags { Name terraform-example-tgw-1 } } resource aws_ec2_transit_gateway_vpc_attachment example_vpc_1_attachment { subnet_ids [aws_subnet.example_subnet_1.id] transit_gateway_id aws_ec2_transit_gateway.example_tgw_1.id vpc_id aws_vpc.example_vpc_1.id tags { Name terraform-example-vpc-attach-1 } } resource aws_ec2_transit_gateway example_tgw_2 { tags { Name terraform-example-tgw-2 } } resource aws_ec2_transit_gateway_vpc_attachment example_vpc_2_attachment { subnet_ids [aws_subnet.example_subnet_2.id] transit_gateway_id aws_ec2_transit_gateway.example_tgw_2.id vpc_id aws_vpc.example_vpc_2.id tags { Name terraform-example-vpc-attach-2 } }注意 TGW 的默认路由表不会自动包含对端网络段生产环境中通常还需要配合aws_ec2_transit_gateway_route与 VPC 路由表aws_route才能实现双向互通本示例聚焦 Peering 链路的建立因此未包含路由配置。4.3 发起 Peering AttachmentCreator 侧核心资源aws_ec2_transit_gateway_peering_attachment由 TGW1 发起指向 TGW2resource aws_ec2_transit_gateway_peering_attachment example_source_peering { peer_region var.aws_region transit_gateway_id aws_ec2_transit_gateway.example_tgw_1.id peer_transit_gateway_id aws_ec2_transit_gateway.example_tgw_2.id tags { Name terraform-example-tgw-peering Side Creator } }关键参数说明参数必填说明peer_region是对端 TGW 所在区域同区域场景下与var.aws_region一致ForceNew属性意味着修改会重建资源transit_gateway_id是发起方本端TGW 的 IDpeer_transit_gateway_id是接收方对端TGW 的 IDpeer_account_id否对端账户 ID默认取当前 Provider 账户 ID跨账户场景需显式指定源码中使用verify.ValidAccountID校验options.dynamic_routing否动态路由选项可选值由DynamicRoutingValue枚举约束如enable/disable从 transitgateway_peering_attachment.go 的 Schema 定义约 L41-L93与 Create 实现约 L96-L120可以看到本资源最终调用 EC2 APICreateTransitGatewayPeeringAttachment并携带PeerAccountId、PeerRegion、PeerTransitGatewayId、TransitGatewayId及 TagSpecifications若配置了options还会展开为CreateTransitGatewayPeeringAttachmentRequestOptions。创建后通过 wait 机制轮询至available状态。4.4 获取 Acceptor 侧 Attachment数据源TGW2 侧的 Peering Attachment 在 API 中是一个独立的 Attachment 实体需要被“接受”。示例借助数据源按 TGW ID 过滤定位data aws_ec2_transit_gateway_peering_attachment example_accepter_peering_data { depends_on [aws_ec2_transit_gateway_peering_attachment.example_source_peering] filter { name transit-gateway-id values [aws_ec2_transit_gateway.example_tgw_2.id] } }要点depends_on强制数据源在 Peering Attachment 创建完成之后再执行避免竞态filter支持按 EC2 API 的过滤属性筛选本示例按transit-gateway-id过滤出以 TGW2 为对端的 Attachment该数据源的数据实现位于 transitgateway_peering_attachment_data_source.go仓库中还提供了 transitgateway_peering_attachments_data_source.go 用于批量列举可按需选用。4.5 接受 Peering 请求Acceptor 侧最后用aws_ec2_transit_gateway_peering_attachment_accepter接受 TGW2 侧的对等请求resource aws_ec2_transit_gateway_peering_attachment_accepter example_accepter { transit_gateway_attachment_id data.aws_ec2_transit_gateway_peering_attachment.example_accepter_peering_data.id tags { Name terraform-example-tgw-peering-accepter Side Acceptor } }从 transitgateway_peering_attachment_accepter.go 的实现可见Schema 约 L38-L65、Create 约 L68-L95唯一必填参数是transit_gateway_attachment_idForceNew即待接受的对等 Attachment ID底层调用 EC2 APIAcceptTransitGatewayPeeringAttachment接受后调用waitTransitGatewayPeeringAttachmentAccepted等待状态变为available再写入资源 Tagspeer_account_id、peer_region、peer_transit_gateway_id、transit_gateway_id均为只读Computed属性由 AWS 侧回填。两个资源均支持terraform importStateContext:schema.ImportStatePassthroughContext可用 Attachment ID 直接导入存量对等连接。对应的资源级测试可参考 transitgateway_peering_attachment_test.go 与 transitgateway_peering_attachment_accepter_test.go数据源测试见 transitgateway_peering_attachment_data_source_test.go。五、完整依赖链与执行顺序上述资源之间的隐式依赖形成如下执行链VPC / 子网创建完成两个 TGW 创建完成两个 VPC Attachment 分别挂载aws_ec2_transit_gateway_peering_attachment发起对等Creator数据源按transit-gateway-id找到 TGW2 侧的 AttachmentAccepter 资源接受请求状态流转为available。执行terraform apply后可在 EC2 控制台 Transit Gateway → Transit Gateway Attachments 中看到两个 Attachment一个Side Creator一个Side Acceptor状态均为available即表示同区域 TGW 对等已成功打通。验证连通性时可在两侧 VPC 的实例间发起 ping/测试流量前提是路由表与安全组已按需放行。六、注意事项与最佳实践必须显式接受同区域/跨区域 TGW 对等请求都需要 Acceptor 侧确认仅创建 Peering Attachment 不会完成打通这是示例引入数据源 Accepter 资源的根本原因。标签语义约定示例用Side Creator/Side Acceptor区分两端是便于识别的约定而非 AWS 强制要求可自由调整。CIDR 冲突规避两侧 VPC 的 CIDR 应避免重叠否则后续路由传播会出现歧义。跨账户扩展当对端 TGW 位于其他账户时需补充peer_account_id参数并满足“同一 Organizations 组织 启用 RAM”的前置条件本示例为同账户场景因此默认取当前账户 ID。删除顺序销毁时 Terraform 会先删除 Accepter 资源再删除 Peering Attachmentdestroy期间对等连接会随 Attachment 删除而自动解绑无需手工操作。七、小结本文完整拆解了 transit-gateway-intra-region-peering 示例 的架构、前置条件、两种运行方式与全部配置并结合 AWS Provider 的 EC2 模块源码transitgateway_peering_attachment.go、transitgateway_peering_attachment_accepter.go说明了底层CreateTransitGatewayPeeringAttachment与AcceptTransitGatewayPeeringAttachment的调用路径。读者可将本示例作为同区域多 TGW 互联的起点在此基础上叠加跨区域 Peering、路由表配置与跨账户场景即可构建更复杂的全球网络拓扑。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考