教程:使用 AWS 命令行来创建 AWS Transit Gateway - Amazon VPC

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

教程:使用 AWS 命令行来创建 AWS Transit Gateway

在本教程中,您将学习如何使用 AWS CLI 来创建一个转发网关,并将两个 VPC 连接到该网关。您将创建中转网关,将两个 VPC 附加至该网关,然后配置必要的路由,以实现中转网关与您的 VPC 之间的通信。

先决条件

开始之前,请确保您已具备以下条件:

  • AWS CLI 已安装并配置适当的权限。若您尚未安装 AWS CLI,请参阅 AWS 命令行界面文档

  • 这些 VPC 的 CIDR 既不能完全相同,也不能存在重叠。有关更多信息,请参阅 Amazon VPC 用户指南中的创建 VPC

  • 每个 VPC 中只有一个 EC2 实例。有关在 VPC 中启动 EC2 实例的步骤,请参阅 《Amazon EC2 用户指南》中的启动实例

  • 安全组配置为允许实例之间的 ICMP 流量。有关安全组的更多信息,请参阅《Amazon VPC 用户指南》中的使用安全组来控制指向 AWS 资源的流量

  • 为使用中转网关授予适当的 IAM 权限。要查看中转网关 IAM 权限,请参阅《AWS Transit Gateway 指南》中的AWS Transit Gateway 的身份和访问管理

步骤 1:创建中转网关

当您创建中转网关时,AWS 会创建一个默认的中转网关路由表,并将其用作默认的关联路由表和默认的传播路由表。以下是一个在 us-west-2 区域中的 create-transit-gateway 请求示例。该请求中还传递了其他 options。有关 create-transit-gateway 命令的更多信息(包括请求中可传递的选项的列表),请参阅 create-transit-gateway

aws ec2 create-transit-gateway \ --description "My Transit Gateway" \ --region us-west-2

响应将显示“中转网关已创建”。响应中返回的 Options 均为默认值。

{ "TransitGateway": { "TransitGatewayId": "tgw-1234567890abcdef0", "TransitGatewayArn": "arn:aws:ec2:us-west-2:123456789012:transit-gateway/tgw-1234567890abcdef0", "State": "pending", "OwnerId": "123456789012", "Description": "My Transit Gateway", "CreationTime": "2025-06-23T17:39:33+00:00", "Options": { "AmazonSideAsn": 64512, "AutoAcceptSharedAttachments": "disable", "DefaultRouteTableAssociation": "enable", "AssociationDefaultRouteTableId": "tgw-rtb-abcdef1234567890a", "DefaultRouteTablePropagation": "enable", "PropagationDefaultRouteTableId": "tgw-rtb-abcdef1234567890a", "VpnEcmpSupport": "enable", "DnsSupport": "enable", "SecurityGroupReferencingSupport": "disable", "MulticastSupport": "disable" } } }
注意

此命令将返回有关您新创建的中转网关的信息,包括其 ID。请记下中转网关 ID (tgw-1234567890abcdef0),后续步骤中将需要使用该 ID。

步骤 2:验证中转网关可用性状态

创建中转网关时,该网关将处于 pending 状态。该状态会自动从“待处理”变更为“可用”,但在状态变更前,您无法将其附加到任何 VPC。要验证状态,请使用新创建的中转网关 ID,配合筛选条件选项来运行 describe-transit-gatweways 命令。该 filters 选项采用 Name=stateValues=available 对的形式。该命令将据此检索并验证您的中转网关是否处于“可用”状态。如果是,则响应会显示 "State": "available"。若处于其他状态,则表示该网关尚未可供使用。等待几分钟,然后再运行该命令。

有关 describe-transit-gateways 命令的更多信息,请参阅 describe-transit-gateways

aws ec2 describe-transit-gateways \ --transit-gateway-ids tgw-1234567890abcdef0 \ --filters Name=state,Values=available

请等待中转网关状态从 pending 变为 available 后再继续操作。在以下响应中,State 已变更为 available

{ "TransitGateways": [ { "TransitGatewayId": "tgw-1234567890abcdef0", "TransitGatewayArn": "arn:aws:ec2:us-west-2:123456789012:transit-gateway/tgw-1234567890abcdef0", "State": "available", "OwnerId": "123456789012", "Description": "My Transit Gateway", "CreationTime": "2022-04-20T19:58:25+00:00", "Options": { "AmazonSideAsn": 64512, "AutoAcceptSharedAttachments": "disable", "DefaultRouteTableAssociation": "enable", "AssociationDefaultRouteTableId": "tgw-rtb-abcdef1234567890a", "DefaultRouteTablePropagation": "enable", "PropagationDefaultRouteTableId": "tgw-rtb-abcdef1234567890a", "VpnEcmpSupport": "enable", "DnsSupport": "enable", "SecurityGroupReferencingSupport": "disable", "MulticastSupport": "disable" }, "Tags": [ { "Key": "Name", "Value": "example-transit-gateway" } ] } ] }

步骤 3:将 VPC 连接到中转网关

当中转网关可用时,使用 create-transit-gateway-vpc-attachment 来为每个 VPC 创建连接。您需要包含 transit-gateway-idvpc-idsubnet-ids

有关 create-transit-vpc attachment 命令的更多信息,请参阅 create-transit-gateway-vpc-attachment

在以下示例中,该命令运行两次,每次针对一个 VPC。

对于第一个 VPC,请使用第一个 vpc_idsubnet-ids 来运行以下命令:

aws ec2 create-transit-gateway-vpc-attachment \ --transit-gateway-id tgw-1234567890abcdef0 \ --vpc-id vpc-1234567890abcdef0 \ --subnet-ids subnet-1234567890abcdef0

响应显示“连接成功创建”。所创建的连接处于 pending 状态。无需更改此状态,因为它会自动变为 available 状态。这可能需要花几分钟的时间。

{ "TransitGatewayVpcAttachment": { "TransitGatewayAttachmentId": "tgw-attach-1234567890abcdef0", "TransitGatewayId": "tgw-1234567890abcdef0", "VpcId": "vpc-1234567890abcdef0", "VpcOwnerId": "123456789012", "State": "pending", "SubnetIds": [ "subnet-1234567890abcdef0", "subnet-abcdef1234567890" ], "CreationTime": "2025-06-23T18:35:11+00:00", "Options": { "DnsSupport": "enable", "SecurityGroupReferencingSupport": "enable", "Ipv6Support": "disable", "ApplianceModeSupport": "disable" } } }

对于第二个 VPC,请使用第二个 vpc_idsubnet-ids 来运行与上述相同的命令:

aws ec2 create-transit-gateway-vpc-attachment \ --transit-gateway-id tgw-1234567890abcdef0 \ --vpc-id vpc-abcdef1234567890 \ --subnet-ids subnet-abcdef01234567890

此命令的响应也显示“连接成功创建”,且该连接当前处于 pending 状态。

{ { "TransitGatewayVpcAttachment": { "TransitGatewayAttachmentId": "tgw-attach-abcdef1234567890", "TransitGatewayId": "tgw-1234567890abcdef0", "VpcId": "vpc-abcdef1234567890", "VpcOwnerId": "123456789012", "State": "pending", "SubnetIds": [ "subnet-fedcba0987654321", "subnet-0987654321fedcba" ], "CreationTime": "2025-06-23T18:42:56+00:00", "Options": { "DnsSupport": "enable", "SecurityGroupReferencingSupport": "enable", "Ipv6Support": "disable", "ApplianceModeSupport": "disable" } } }

步骤 4:验证中转网关连接是否可用

中转网关连接在创建时处于 pending 状态。在状态变更为 available 之前,您无法在路由中使用这些连接。此操作将自动进行。使用 describe-transit-gateways 命令,配合 transit-gateway-id 来检查 State。有关 describe-transit-gateways 命令的更多信息,请参阅 describe-transit-gateways

运行以下命令以检查状态。在此示例中,请求中传递了可选的 NameValues 筛选条件字段:

aws ec2 describe-transit-gateway-vpc-attachments \ --filters Name=transit-gateway-id,Values=tgw-1234567890abcdef0

以下响应显示两个连接均处于 available 状态:

{ "TransitGatewayVpcAttachments": [ { "TransitGatewayAttachmentId": "tgw-attach-1234567890abcdef0", "TransitGatewayId": "tgw-1234567890abcdef0", "VpcId": "vpc-1234567890abcdef0", "VpcOwnerId": "123456789012", "State": "available", "SubnetIds": [ "subnet-1234567890abcdef0", "subnet-abcdef1234567890" ], "CreationTime": "2025-06-23T18:35:11+00:00", "Options": { "DnsSupport": "enable", "SecurityGroupReferencingSupport": "enable", "Ipv6Support": "disable", "ApplianceModeSupport": "disable" }, "Tags": [] }, { "TransitGatewayAttachmentId": "tgw-attach-abcdef1234567890", "TransitGatewayId": "tgw-1234567890abcdef0", "VpcId": "vpc-abcdef1234567890", "VpcOwnerId": "123456789012", "State": "available", "SubnetIds": [ "subnet-fedcba0987654321", "subnet-0987654321fedcba" ], "CreationTime": "2025-06-23T18:42:56+00:00", "Options": { "DnsSupport": "enable", "SecurityGroupReferencingSupport": "enable", "Ipv6Support": "disable", "ApplianceModeSupport": "disable" }, "Tags": [] } ] }

步骤 5:在中转网关与 VPC 之间添加路由

在每个 VPC 的路由表中配置路由,使用 create-route 命令配合每个 VPC 路由表的 transit-gateway-id,将流量通过中转网关导向其他 VPC。在以下示例中,该命令运行两次,每次针对一个路由表。该请求包含您正在创建的每个 VPC 路由的 route-table-iddestination-cidr-blocktransit-gateway-id

有关 create-route 命令的更多信息,请参阅 create-route

对于第一个 VPC 的路由表,运行以下命令:

aws ec2 create-route \ --route-table-id rtb-1234567890abcdef0 \ --destination-cidr-block 10.2.0.0/16 \ --transit-gateway-id tgw-1234567890abcdef0

对于第二个 VPC 的路由表,运行以下命令。此路由使用的 route-table-iddestination-cidr-block 与第一个 VPC 不同。但由于您仅使用单个中转网关,因此使用相同的 transit-gateway-id

aws ec2 create-route \ --route-table-id rtb-abcdef1234567890 \ --destination-cidr-block 10.1.0.0/16 \ --transit-gateway-id tgw-1234567890abcdef0

响应返回每个路由的 true 值,表明路由已创建。

{ "Return": true }
注意

将目标 CIDR 数据块替换为您 VPC 的实际 CIDR 数据块。

步骤 6:测试中转网关

您可以通过以下方式确认中转网关已成功创建:连接到一个 VPC 中的 EC2 实例,Ping 另一个 VPC 中的实例,然后运行 ping 命令。

  1. 使用 SSH 或 EC2 Instance Connect 连接到第一个 VPC 中的 EC2 实例。

  2. Ping 第二个 VPC 中 EC2 实例的私有 IP 地址:

    ping 10.2.0.50
    注意

    请将 10.2.0.50 替换为第二个 VPC 中您 EC2 实例的实际私有 IP 地址。

如果 Ping 操作成功,则表明您的中转网关配置正确,并已在 VPC 之间路由流量。

步骤 7:删除中转网关连接和中转网关。

当您不再需要中转网关时,可以将其删除。首先,您必须删除所有连接。运行 delete-transit-gateway-vpc-attachment 命令,对每个连接使用 transit-gateway-attachment-id。运行命令后,使用 delete-transit-gateway 来删除中转网关。接下来,删除在先前步骤中创建的两个 VPC 连接和单个中转网关。

重要

删除所有中转网关连接后,您将不会再产生费用。

  1. 使用 delete-transit-gateway-vpc-attachment 命令来删除 VPC 连接。有关 delete-transit-gateway-vpc-attachment 命令的更多信息,请参阅 delete-transit-gateway-vpc-attachment

    对于第一个连接,运行以下命令:

    aws ec2 delete-transit-gateway-vpc-attachment \ --transit-gateway-attachment-id tgw-attach-1234567890abcdef0

    第一个 VPC 连接的删除响应将返回以下内容:

    { "TransitGatewayVpcAttachment": { "TransitGatewayAttachmentId": "tgw-attach-1234567890abcdef0", "TransitGatewayId": "tgw-1234567890abcdef0", "VpcId": "vpc-abcdef1234567890", "VpcOwnerId": "123456789012", "State": "deleting", "CreationTime": "2025-06-23T18:42:56+00:00" } }

    对于第二个连接,运行 delete-transit-gateway-vpc-attachment 命令:

    aws ec2 delete-transit-gateway-vpc-attachment \ --transit-gateway-attachment-id tgw-attach-abcdef1234567890

    第二个 VPC 连接的删除响应将返回以下内容:

    The response returns: { "TransitGatewayVpcAttachment": { "TransitGatewayAttachmentId": "tgw-attach-abcdef1234567890", "TransitGatewayId": "tgw-1234567890abcdef0", "VpcId": "vpc-abcdef1234567890", "VpcOwnerId": "123456789012", "State": "deleting", "CreationTime": "2025-06-23T18:42:56+00:00" } }
  2. 连接在被删除前一直处于 deleting 状态。删除后,您便可以删除中转网关。使用 delete-transit-gateway 命令并结合 transit-gateway-id。有关 delete-transit-gateway 命令的更多信息,请参阅 delete-transit-gateway

    以下示例将删除您在上一步骤中创建的 My Transit Gateway

    aws ec2 delete-transit-gateway \ --transit-gateway-id tgw-1234567890abcdef0

    以下是请求的响应,其中包含被删除的中转网关 ID 和名称,以及创建该网关时设置的原始选项。

    { "TransitGateway": { "TransitGatewayId": "tgw-1234567890abcdef0", "TransitGatewayArn": "arn:aws:ec2:us-west-2:123456789012:transit-gateway/tgw-1234567890abcdef0", "State": "deleting", "OwnerId": "123456789012", "Description": "My Transit Gateway", "CreationTime": "2025-06-23T17:39:33+00:00", "Options": { "AmazonSideAsn": 64512, "AutoAcceptSharedAttachments": "disable", "DefaultRouteTableAssociation": "enable", "AssociationDefaultRouteTableId": "tgw-rtb-abcdef1234567890a", "DefaultRouteTablePropagation": "enable", "PropagationDefaultRouteTableId": "tgw-rtb-abcdef1234567890a", "VpnEcmpSupport": "enable", "DnsSupport": "enable", "SecurityGroupReferencingSupport": "disable", "MulticastSupport": "disable" }, "Tags": [ { "Key": "Name", "Value": "example-transit-gateway" } ] } }

结论

您已成功创建中转网关,将其连接至两个 VPC,配置了这两个 VPC 之间的路由,并验证了连接性。此示例简要展示了 AWS Transit Gateway 的基本功能。对于更复杂的场景,例如连接到本地网络或实施更高级的路由配置,请参阅《AWS Transit Gateway 指南》