@aws-cdk/aws-ec2-alpha

中文文档
2.275.0-alpha.0发布于 2026/10/27Apache-2.0TypeScriptCommonJS零依赖近 30 天下载 1.8万

VPC V2 的 CDK 构建库

中文使用文档
文档目录24 节
  1. VpcV2 请检查url=值 (帮助)
  2. 子网络V2
  3. IP 地址管理
  4. 带自己的IPv6地址( BYOIP)
  5. 路线
  6. VPC 对等连接
  7. 路由表配置
  8. 删除对等连接
  9. 在 VPC 中添加 Egress- Only 互联网网关
  10. 在 VPC 中添加 NATGateway
  11. 为 VPC 启用 VPNGateway
  12. 将 InternetGateway 添加到 VPC
  13. 导入已存在的 VPC
  14. 导入 VPC
  15. 导入子网
  16. 标记 VPC 及其组件
  17. 过境网关
  18. 概览
  19. 基本用途
  20. 默认通道路由表
  21. 过境网关路由表管理
  22. 将 VPC 附加到过境网关
  23. 向路由表添加静态路由
  24. 路线表协会和宣传

亚马逊 VpcV2 构造库


cdk-constructs: Developer Preview

本单元中较高层次构件的API 位于 开发者预览 在他们之前 变得稳定。 我们只会做出突破性改变 解决意想不到的API问题 因此, 这些API不受约束 语义版本,并打破更改 将在发布说明中宣布。 这意味着,当你可能使用它们, 你可能需要 更新此软件包更新版本时的源代码.


VpcV2 请检查url=值 (帮助)

VpcV2 是重写 ec2.Vpc 构造。 这个新构造可以提高定制程度 正在创建 VPC. VpcV2 执行现有的 IVpc因此, VpcV2 与接受 IVpc (例如:. ApplicationLoadBalancer) (中文(简体) ).

VpcV2 支持增加主要地址和次要地址。 主地址必须是IPv4地址,可以指定为CIDR字符串或从IPAM池中指定. 次位地址可以是IPv4或IPv6. 默认, VpcV2 指定 10.0.0.0/16 如果未指定其他CIDR,则作为主要CIDR.

以下是一个既支持IPv4又支持IPv6的VPC创建的例子:

const stack = new Stack();
new VpcV2(this, 'Vpc', {
  primaryAddressBlock: IpAddresses.ipv4('10.0.0.0/24'),
  secondaryAddressBlocks: [
    IpAddresses.amazonProvidedIpv6({cidrBlockName: 'AmazonProvidedIpv6'}),
  ],
});

VpcV2 不自动创建子网或分配 IP 地址,这与 Vpc 构造.

子网络V2

SubnetV2 是重写 ec2.Subnet 构造. 此新构造可用于将子网添加到 a VpcV2 实例: 注意: 当定义子网时 SubnetV2,CDK 自动创建新的路由表,除非路由表被明确作为构建的输入. 实现 mapPublicIpOnLaunch 特性( 即 false ),将属性设置为 true 当创建子网时.

const stack = new Stack();
const myVpc = new VpcV2(this, 'Vpc', {
  secondaryAddressBlocks: [
    IpAddresses.amazonProvidedIpv6({ cidrBlockName: 'AmazonProvidedIp'}),
  ],
});

new SubnetV2(this, 'subnetA', {
  vpc: myVpc,
  availabilityZone: 'us-east-1a',
  ipv4CidrBlock: new IpCidr('10.0.0.0/24'),
  ipv6CidrBlock: new IpCidr('2a05:d02c:25:4000::/60'),
  subnetType: SubnetType.PUBLIC,
  mapPublicIpOnLaunch: true,
})

自兹 VpcV2 不自动创建子网,用户完全控制了跨子网的IP地址分配.

IP 地址管理

可通过 secondaryAddressBlocks 属性. 以下示例说明了使用下列方法定义这些二级地址块的备选方案: IPAM数字 :

说明:目前IPAM集合删除有可能会影响 cdk --destroy 命令。 这是因为IPAM在被删除后IP地址池被处理后需要时间来检测. 当前的工作绕道是等IP地址从池中完全处理完毕后再重新尝试删除. 以下命令可用于使用 CLI 检查池的配置

aws ec2 get-ipam-pool-allocations --ipam-pool-id <ipam-pool-id>

参考: https://docs.aws.amazon.com/cli/latest/reference/ec2/get-ipam-pool-分配.html 互联网档案馆的存檔,存档日期2013-12-21

const stack = new Stack();
const ipam = new Ipam(this, 'Ipam', {
  operatingRegions: ['us-west-1']
});
const ipamPublicPool = ipam.publicScope.addPool('PublicPoolA', {
  addressFamily: AddressFamily.IP_V6,
  awsService: AwsServiceName.EC2,
  locale: 'us-west-1',
  publicIpSource: IpamPoolPublicIpSource.AMAZON,
});
ipamPublicPool.provisionCidr('PublicPoolACidrA', { netmaskLength: 52 } );

const ipamPrivatePool = ipam.privateScope.addPool('PrivatePoolA', {
  addressFamily: AddressFamily.IP_V4,
});
ipamPrivatePool.provisionCidr('PrivatePoolACidrA', { netmaskLength: 8 } );

new VpcV2(this, 'Vpc', {
  primaryAddressBlock: IpAddresses.ipv4('10.0.0.0/24'),
  secondaryAddressBlocks: [
    IpAddresses.amazonProvidedIpv6({ cidrBlockName: 'AmazonIpv6' }),
    IpAddresses.ipv6Ipam({
      ipamPool: ipamPublicPool,
      netmaskLength: 52,
      cidrBlockName: 'ipv6Ipam',
    }),
    IpAddresses.ipv4Ipam({
      ipamPool: ipamPrivatePool,
      netmaskLength: 8,
      cidrBlockName: 'ipv4Ipam',
    }),
  ],
});

带自己的IPv6地址( BYOIP)

如果您有您想要与 EC2 一起使用的 IP 地址, 您可以通过 AWS CLI 设置 IPv6 池, 并在您的应用程序中使用该池 ID .

一旦您用 ROA 认证了您的 IP 地址块并获得了 X- 509 证书, 您就可以运行以下命令, 在您的 AWS 账户中提供您的 CIDR 块 :

aws ec2 provision-byoip-cidr --region <region> --cidr <your CIDR block> --cidr-authorization-context Message="1|aws|<account>|<your CIDR block>|<expiration date>|SHA256".Signature="<signature>"

当您的 BYOIP CIDR 被提供时, 您可以运行以下命令以获取您的 IPv6 池 ID, 用于您的 VPC 声明 :

aws ec2 describe-byoip-cidr --region <region>

请查看InfoFinland上 EC2 文档。 。 。 .

一旦您提供了您的地址块, 您可以使用您的 VPC 中的 IPv6 如下 :

const myVpc = new VpcV2(this, 'Vpc', {
  primaryAddressBlock: IpAddresses.ipv4('10.1.0.0/16'),
  secondaryAddressBlocks: [IpAddresses.ipv6ByoipPool({
    cidrBlockName: 'MyByoipCidrBlock',
    ipv6PoolId: 'ipv6pool-ec2-someHashValue',
    ipv6CidrBlock: '2001:db8::/32'
  })],
  enableDnsHostnames: true,
  enableDnsSupport: true,
});

路线

RouteTable 是一种新的构造,它允许以各种方式定制路由表。 使用此构造,可以在定义的子网中添加一个定制路由表 SubnetV2。 。 。 . 例如,以下示例显示自定义路由表可以如何创建并附加到一个 SubnetV2数字 :

const myVpc = new VpcV2(this, 'Vpc');
const routeTable = new RouteTable(this, 'RouteTable', {
  vpc: myVpc,
});
const subnet = new SubnetV2(this, 'Subnet', {
  vpc: myVpc,
  routeTable,
  availabilityZone: 'eu-west-2a',
  ipv4CidrBlock: new IpCidr('10.0.0.0/24'),
  subnetType: SubnetType.PRIVATE_ISOLATED,
});

Routes 可以创建子网,通过网关和端点将子网连接到不同的AWS服务. 每个独特的路由目标都有自己的专用构筑物,可以通过该路由通过给定子网进行路由 Route 构造。 使用 InternetGateway 构造如下:

const stack = new Stack();
const myVpc = new VpcV2(this, 'Vpc');
const routeTable = new RouteTable(this, 'RouteTable', {
  vpc: myVpc,
});
const subnet = new SubnetV2(this, 'Subnet', {
  vpc: myVpc,
  availabilityZone: 'eu-west-2a',
  ipv4CidrBlock: new IpCidr('10.0.0.0/24'),
  subnetType: SubnetType.PRIVATE_ISOLATED });

const igw = new InternetGateway(this, 'IGW', {
  vpc: myVpc,
});
new Route(this, 'IgwRoute', {
  routeTable,
  destination: '0.0.0.0/0',
  target:  { gateway: igw },
});

或者, Routes 也可以通过方法创建 addRoute 输入 RouteTable 课。 使用 EgressOnlyInternetGateway 构造如下: 说明: EgressOnlyInternetGateway 只能用于设置出站IPv6路由.

const stack = new Stack();
const myVpc = new VpcV2(this, 'Vpc',{
      primaryAddressBlock: IpAddresses.ipv4('10.1.0.0/16'),
      secondaryAddressBlocks: [IpAddresses.amazonProvidedIpv6({
      cidrBlockName: 'AmazonProvided',
    })]
    });

const eigw = new EgressOnlyInternetGateway(this, 'EIGW', {
  vpc: myVpc,
});

const routeTable = new RouteTable(this, 'RouteTable', {
  vpc: myVpc,
});

routeTable.addRoute('EIGW', '::/0', { gateway: eigw });

其他路线目标可能需要更深的一组参数才能正确设置. 例如,下面的例子说明如何建立一个 NatGateway数字 :

const myVpc = new VpcV2(this, 'Vpc');
const routeTable = new RouteTable(this, 'RouteTable', {
  vpc: myVpc,
});
const subnet = new SubnetV2(this, 'Subnet', {
  vpc: myVpc,
  availabilityZone: 'eu-west-2a',
  ipv4CidrBlock: new IpCidr('10.0.0.0/24'),
  subnetType: SubnetType.PRIVATE_ISOLATED });

const natgw = new NatGateway(this, 'NatGW', {
  subnet: subnet,
  vpc: myVpc,
  connectivityType: NatConnectivityType.PRIVATE,
  privateIpAddress: '10.0.0.42',
});
new Route(this, 'NatGwRoute', {
  routeTable,
  destination: '0.0.0.0/0',
  target: { gateway: natgw },
});

还有可能设立连接其他AWS服务的终点站. 例如,以下的例子说明通过现有的Dynamo DB端点的连接 ec2.GatewayVpcEndpoint 构造为路径目标 :

const stack = new Stack();
const myVpc = new VpcV2(this, 'Vpc');
const routeTable = new RouteTable(this, 'RouteTable', {
  vpc: myVpc,
});
const subnet = new SubnetV2(this, 'Subnet', {  
  vpc: myVpc,
  availabilityZone: 'eu-west-2a',
  ipv4CidrBlock: new IpCidr('10.0.0.0/24'),
  subnetType: SubnetType.PRIVATE });

const dynamoEndpoint = new ec2.GatewayVpcEndpoint(this, 'DynamoEndpoint', {
  service: ec2.GatewayVpcEndpointAwsService.DYNAMODB,
  vpc: myVpc,
  subnets: [subnet],
});
new Route(this, 'DynamoDBRoute', {
  routeTable,
  destination: '0.0.0.0/0',
  target: { endpoint: dynamoEndpoint },
});

VPC 对等连接

VPC对等连接允许您使用私人IP地址连接两个VPC和它们之间的路由交通. VpcV2 构造支持通过 VPCPeeringConnection 构造 route 模块.

无法在两个具有重叠的CIDR范围的VPC之间建立对等连接. 请确保两个 VPC CIDR 互不相重叠 它会投出一个错误.

更多信息见 VPC对等是什么?。 。 。 .

以下举例说明如何为同一账户或交叉账户的所有可能组合,以及同一区域或跨区域组合,在两个VPC之间建立对等联系.

注意: 您无法在匹配或重叠 CIDR 块的 VPC 对等连接

案例1:相同账户和相同区域对等连接

const stack = new Stack();

const vpcA = new VpcV2(this, 'VpcA', {
  primaryAddressBlock: IpAddresses.ipv4('10.0.0.0/16'),
});

const vpcB = new VpcV2(this, 'VpcB', {
  primaryAddressBlock: IpAddresses.ipv4('10.1.0.0/16'),
});

const peeringConnection = vpcA.createPeeringConnection('sameAccountSameRegionPeering', {
  acceptorVpc: vpcB,
});

案例2:同一账户和跨区域对等连接

呼叫时与案件1没有区别 createPeeringConnection。唯一的变化是其中的一个 VPC 是在另一个堆栈中创建的,其区域不同。 要建立跨区域的 VPC 对等连接, 需要使用 VPC 堆栈导入接受者 Vpc fromVpcV2Attributes 方法.

const app = new App();

const stackA = new Stack(app, 'VpcStackA', { env: { account: '000000000000', region: 'us-east-1' } });
const stackB = new Stack(app, 'VpcStackB', { env: { account: '000000000000', region: 'us-west-2' } });

const vpcA = new VpcV2(stackA, 'VpcA', {
  primaryAddressBlock: IpAddresses.ipv4('10.0.0.0/16'),
});

new VpcV2(stackB, 'VpcB', {
  primaryAddressBlock: IpAddresses.ipv4('10.1.0.0/16'),
});

const vpcB = VpcV2.fromVpcV2Attributes(stackA, 'ImportedVpcB', {
      vpcId: 'MockVpcBid',
      vpcCidrBlock: '10.1.0.0/16',
      region: 'us-west-2',
      ownerAccountId: '000000000000',
    });


const peeringConnection = vpcA.createPeeringConnection('sameAccountCrossRegionPeering', {
  acceptorVpc: vpcB,
});

案例3:交叉账户对接连接

对于跨账户连接,接受者账户需要一个IAM角色,赋予请求者账户启动连接的权限. 使用方法在接受者账户中创建一个新的 IAM 角色 createAcceptorVpcRole 以提供必要的许可.

一旦角色在账户中创建, 提供角色 arn for field peerRoleArn 方法下 createPeeringConnection

const stack = new Stack();

const acceptorVpc = new VpcV2(this, 'VpcA', {
  primaryAddressBlock: IpAddresses.ipv4('10.0.0.0/16'),
});

const acceptorRoleArn = acceptorVpc.createAcceptorVpcRole('000000000000'); // Requestor account ID

在接受者账户中创建了IAM角色后,我们可以启动请求者VPC的对等连接请求. 将接受者Vpc导入到堆栈 fromVpcV2Attributes 方法,建议在交叉账户对等连接时,指定接受者VPC的所有者身份,如果接受者VPC托管在不同区域,也提供区域进口价值. 以下代码片段演示了如何使用 CDK 在不同的 AWS 账户中设置两个 VPC 对等 :

const stack = new Stack();

const acceptorVpc = VpcV2.fromVpcV2Attributes(this, 'acceptorVpc', {
      vpcId: 'vpc-XXXX',
      vpcCidrBlock: '10.0.0.0/16',
      region: 'us-east-2',
      ownerAccountId: '111111111111',
    });

const acceptorRoleArn = 'arn:aws:iam::111111111111:role/VpcPeeringRole';

const requestorVpc = new VpcV2(this, 'VpcB', {
  primaryAddressBlock: IpAddresses.ipv4('10.1.0.0/16'),
});

const peeringConnection = requestorVpc.createPeeringConnection('crossAccountCrossRegionPeering', {
  acceptorVpc: acceptorVpc,
  peerRoleArn: acceptorRoleArn,
});

路由表配置

在建立VPC对等连接后,必须在VPC中各自的路由表中添加线路来使流量能通. 如果向请求者堆栈中添加一个路由,信息将能够从请求者VPC流到接受者VPC,但不能逆向. 对于双向通信,需要在两个VPC中从各自的堆栈中加入线路.

更多信息见 为 VPC 对等连接更新您的路由表。 。 。 .

const stack = new Stack();

const acceptorVpc = new VpcV2(this, 'VpcA', {
  primaryAddressBlock: IpAddresses.ipv4('10.0.0.0/16'),
});

const requestorVpc = new VpcV2(this, 'VpcB', {
  primaryAddressBlock: IpAddresses.ipv4('10.1.0.0/16'),
});

const peeringConnection = requestorVpc.createPeeringConnection('peeringConnection', {
  acceptorVpc: acceptorVpc,
});

const routeTable = new RouteTable(this, 'RouteTable', {
  vpc: requestorVpc,
});

routeTable.addRoute('vpcPeeringRoute', '10.0.0.0/16', { gateway: peeringConnection });

这也可以使用AWS CLI进行. 更多信息见 创建路由。 。 。 .

# Add a route to the requestor VPC route table
aws ec2 create-route --route-table-id rtb-requestor --destination-cidr-block 10.0.0.0/16 --vpc-peering-connection-id pcx-xxxxxxxx

# For bi-directional add a route in the acceptor vpc account as well
aws ec2 create-route --route-table-id rtb-acceptor --destination-cidr-block 10.1.0.0/16 --vpc-peering-connection-id pcx-xxxxxxxx

删除对等连接

要删除 VPC 对等连接, 请使用以下命令 :

aws ec2 delete-vpc-peering-connection --vpc-peering-connection-id pcx-xxxxxxxx

更多信息见 删除 VPC 对等连接。 。 。 .

在 VPC 中添加 Egress- Only 互联网网关

一个仅Egress的互联网网关是一个横向规模的,冗余的,而且非常可用的VPC组件,它允许从您VPC中的实例到互联网的IPv6的外出通信,并阻止互联网启动与您实例的IPv6连接.

更多信息见 启用仅使用 Egress- 互联网网关的 IPv6 流量。 。 。 .

VpcV2 支持使用 addEgressOnlyInternetGateway 方法.

默认情况下,这种方法会为所有出局的IPv6地址范围设置一条路由,除非用户提供特定的目的地. 它只能被配置为IPv6启用的VPC. 这个 Subnets 参数接受a SubnetFilter,可以基于 SubnetType 在 VpcV2 中输入。 在所有匹配此过滤器的子网的路由表会添加一个新的路由 .

const stack = new Stack();
const myVpc = new VpcV2(this, 'Vpc',{
      primaryAddressBlock: IpAddresses.ipv4('10.1.0.0/16'),
      secondaryAddressBlocks: [IpAddresses.amazonProvidedIpv6({
      cidrBlockName: 'AmazonProvided',
    })]
    });
const routeTable = new RouteTable(this, 'RouteTable', {
  vpc: myVpc,
});
const subnet = new SubnetV2(this, 'Subnet', {  
  vpc: myVpc,
  availabilityZone: 'eu-west-2a',
  ipv4CidrBlock: new IpCidr('10.0.0.0/24'),
  ipv6CidrBlock: new IpCidr('2001:db8:1::/64'),
  subnetType: SubnetType.PRIVATE });

myVpc.addEgressOnlyInternetGateway({
  subnets: [{subnetType: SubnetType.PRIVATE}],
  destination: '::/60',
})

在 VPC 中添加 NATGateway

一个NAT网关是一个网络地址翻译(NAT)服务. 您可以使用NAT网关, 以便私有子网中的实例可以连接到您 VPC 以外的服务, 但外部服务不能启动与这些事件的连接 .

更多信息见 NAT 网关基础。 。 。 .

当创建NAT网关时,指定以下连接类型之一:

公共 - (过失): 私人子网中的实例可以通过公共的NAT网关连接到互联网,但无法从互联网上接收未经请求的入境连接

私营: 私有子网中的实例可以通过私有的NAT网关连接到其他 VPC 或您的上前提网络.

定义 NAT 网关连接类型为 ConnectivityType.Public,您需要确保子网的VPC上有一个IGW(互联网网关). 由于NATGW与某一特定子网有关,提供 subnet 字段在输入道具中是强制性的.

此外,您可以在任何路由表中设置一条路由,并设定目标为NAT Gateway. 职能 addNatGateway 返回 a NATGateway 对象,以后可以参考.

下面的代码示例为您子网添加NAT网关提供了定义:

const stack = new Stack();
const myVpc = new VpcV2(this, 'Vpc');
const routeTable = new RouteTable(this, 'RouteTable', {
  vpc: myVpc,
});
const subnet = new SubnetV2(this, 'Subnet', {  
  vpc: myVpc,
  availabilityZone: 'eu-west-2a',
  ipv4CidrBlock: new IpCidr('10.0.0.0/24'),
  subnetType: SubnetType.PUBLIC });

myVpc.addInternetGateway();
myVpc.addNatGateway({
  subnet: subnet,
  connectivityType: NatConnectivityType.PUBLIC,
});

为 VPC 启用 VPNGateway

一个虚拟的私人网关是您VPN连接的VPC一侧的终点.

更多信息见 AWS站点对站点VPN是什么??。 。 。 .

VPN路由传播是亚马逊网络服务(AWS)中的一个功能,它自动更新您虚拟私人云(VPC)中的路由表,其路由是从VPN连接中吸取的.

为了实现 VPN 路由传播,请使用 vpnRoutePropagation 属性以指定子网作为函数的输入。 然后将启用每个子网的 VPN 路由传播,并附带相应的路由表ID .

此外,您可以在任何路由表中设置一条路由,并设定目标为VPN Gateway. 职能 enableVpnGatewayV2 返回 a VPNGatewayV2 对象,以后可以参考.

下面的代码示例提供了设置 VPN 网关的定义 vpnRoutePropagation 启用 :

const stack = new Stack();
const myVpc = new VpcV2(this, 'Vpc');
const vpnGateway = myVpc.enableVpnGatewayV2({
  vpnRoutePropagation: [{ subnetType: SubnetType.PUBLIC }],
  type: VpnConnectionType.IPSEC_1,
});

const routeTable = new RouteTable(stack, 'routeTable', { 
  vpc: myVpc 
  } );

new Route(stack, 'route', {
  destination: '172.31.0.0/24',
  target: { gateway: vpnGateway },
  routeTable: routeTable,
});

将 InternetGateway 添加到 VPC

互联网网关是一个横向的、冗余的、可大量使用的VPC组件,它允许您VPC和互联网之间的通信。 它同时支持IPv4和IPv6流量.

更多信息见 启用 VPC 互联网网关。 。 。 .

您可以使用 addInternetGateway 方法。 默认情况下,这种方法在所有公共子网中创建一条路由,并设定为 0.0.0.0 用于IPv4和 ::0 为 IPv6 启用 VPC . 而不是使用默认设置, 您可以通过提供可选输入来配置自定义的目的地范围 destination 对方法. 除了自定义的IP范围外,您还可以选择过滤应该创建默认路径的子网.

下面的代码示例显示如何添加一个带有自定义外出目标IP范围的互联网网关:

const stack = new Stack();
const myVpc = new VpcV2(this, 'Vpc');

const subnet = new SubnetV2(this, 'Subnet', {  
  vpc: myVpc,
  availabilityZone: 'eu-west-2a',
  ipv4CidrBlock: new IpCidr('10.0.0.0/24'),
  subnetType: SubnetType.PUBLIC });

myVpc.addInternetGateway({
  ipv4Destination: '192.168.0.0/16',
});

以下代码示例说明如何为特定子网添加一个自定义的出入境目的IP范围:

const stack = new Stack();
const myVpc = new VpcV2(this, 'Vpc');

const mySubnet = new SubnetV2(this, 'Subnet', {  
  vpc: myVpc,
  availabilityZone: 'eu-west-2a',
  ipv4CidrBlock: new IpCidr('10.0.0.0/24'),
  subnetType: SubnetType.PUBLIC });

myVpc.addInternetGateway({
  ipv4Destination: '192.168.0.0/16',
  subnets: [mySubnet],
});
const stack = new Stack();
const myVpc = new VpcV2(this, 'Vpc');

myVpc.addInternetGateway({
  ipv4Destination: '192.168.0.0/16',
  subnets: [{subnetType: SubnetType.PRIVATE_WITH_EGRESS}],
});

导入已存在的 VPC

您可以使用 VpcV2.fromVpcV2Attributes() 方法或使用 SubnetV2.fromSubnetV2Attributes() 方法.

导入 VPC

要导入现有的 VPC,请使用 VpcV2.fromVpcV2Attributes() 方法。 你需要提供 VPC ID,主 CIDR 块, 和关于子网的信息。 也可以通过IPAM,BYOIP(IPv4)导入次级地址,也可以通过Amazon提供IPv6启用. 您必须提供 VPC Id 及其主要 CIDR 块来导入它 .

如果您想在所导入的 VPC 中添加一个新的子网,新子网的IP范围(IPv4)将对照所提供的二级和主地址块进行验证,以确认它属于 VPC 的范围.

以下是一个只输入所需参数的 VPC 的例子

const stack = new Stack();

const importedVpc = VpcV2.fromVpcV2Attributes(stack, 'ImportedVpc', {
      vpcId: 'mockVpcID',
      vpcCidrBlock: '10.0.0.0/16',
});

在交叉账户或跨区域VPC的情况下,它建议提供区域和所有者AccountId,以便使用这些VPC的值来填入VPC的正确arn值. 如果不提供 VPC 区域和账户ID,则将使用堆栈中配置的区域和账户 。 此外,在建立VPC对等连接时,这些字段稍后会被引用,因此有必要使这些字段具有正确的价值.

以下是一个输入跨区域和跨账户VPC的例子,VPC arn为这个案例的"arn:aws:ec2:us-west-2:123456789012:vpc/mockVpcID"

const stack = new Stack();

//Importing a cross account or cross region VPC
const importedVpc = VpcV2.fromVpcV2Attributes(stack, 'ImportedVpc', {
      vpcId: 'mockVpcID',
      vpcCidrBlock: '10.0.0.0/16',
      ownerAccountId: '123456789012',
      region: 'us-west-2',
});

以下是如何导入带有多个 CIDR 块, IPv6 支持和不同子网类型的 VPC 的例子 :

在这个例子中,我们正在导入一个 VPC :

  • 主要CIDR区块(10.1.0.0/16)
  • 一个二级IPv4 CIDR区块(10.2.0.0/16)
  • 两个使用IPAM池的二级地址(IPv4和IPv6)
  • VPC 已启用 Amazon 提供的 IPv6 CIDR
  • 我们西部2a的一个孤立的子网
  • 我们西区的一个公共子网 -2b
const stack = new Stack();

const importedVpc = VpcV2.fromVpcV2Attributes(this, 'ImportedVPC', {
  vpcId: 'vpc-XXX',
  vpcCidrBlock: '10.1.0.0/16',
  secondaryCidrBlocks: [
    {
      cidrBlock: '10.2.0.0/16',
      cidrBlockName: 'ImportedBlock1',
    },
    {
      ipv6IpamPoolId: 'ipam-pool-XXX',
      ipv6NetmaskLength: 52,
      cidrBlockName: 'ImportedIpamIpv6',
    },
    {
      ipv4IpamPoolId: 'ipam-pool-XXX',
      ipv4IpamProvisionedCidrs: ['10.2.0.0/16'],
      cidrBlockName: 'ImportedIpamIpv4',
    },
    {
      amazonProvidedIpv6CidrBlock: true,
    }
  ],
  subnets: [{
    subnetName: 'IsolatedSubnet2',
    subnetId: 'subnet-03cd773c0fe08ed26',
    subnetType: SubnetType.PRIVATE_ISOLATED,
    availabilityZone: 'us-west-2a',
    ipv4CidrBlock: '10.2.0.0/24',
    routeTableId: 'rtb-0871c310f98da2cbb',
  },
  {
    subnetId: 'subnet-0fa477e01db27d820',
    subnetType: SubnetType.PUBLIC,
    availabilityZone: 'us-west-2b',
    ipv4CidrBlock: '10.3.0.0/24',
    routeTableId: 'rtb-014f3043098fe4b96',
  }],
});

// You can now use the imported VPC in your stack

// Adding a new subnet to the imported VPC
const importedSubnet = new SubnetV2(this, 'NewSubnet', {
  availabilityZone: 'us-west-2a',
  ipv4CidrBlock: new IpCidr('10.2.2.0/24'),
  vpc: importedVpc,
  subnetType: SubnetType.PUBLIC,
});

// Adding gateways to the imported VPC
importedVpc.addInternetGateway();
importedVpc.addNatGateway({ subnet: importedSubnet });
importedVpc.addEgressOnlyInternetGateway();

您可以根据需要添加更多子网, 在 isolatedSubnets, (中文(简体) ), publicSubnets,或者其他子网类型数组(例如, privateSubnets) (中文(简体) ).

导入子网

您也可以使用 SubnetV2.fromSubnetV2Attributes() 方法。 这在您需要独立于 VPC 的特定子网工作时是有用的.

以下是如何导入子网的例子:

SubnetV2.fromSubnetV2Attributes(this, 'ImportedSubnet', {
  subnetId: 'subnet-0123456789abcdef0',
  availabilityZone: 'us-west-2a',
  ipv4CidrBlock: '10.2.0.0/24',
  routeTableId: 'rtb-0871c310f98da2cbb',
  subnetType: SubnetType.PRIVATE_ISOLATED,
});

通过导入现有的VPC和子网,您可以轻松地将您现有的AWS基础设施与通过CDK创建的新资源相整合. 这特别有用,当你需要与原有的网络配置合作,或者当你将已有的基础设施迁移到CDK时.

标记 VPC 及其组件

默认情况下, 当给构造一个资源名时, 它会自动添加带有密钥的标签 Name 和所提供的资源名称的值。 要添加自定义标签, 请使用 Tag 管理器, 像这样 : Tags.of(myConstruct).add('key', 'value');。 。 。 .

例如,如果 vpcName 设置为 TestVpc,以下代码将在 VPC 中添加标签 key: Name 财务报告和审定财务报表 value: TestVpc。 。 。 .

const vpc = new VpcV2(this, 'VPC-integ-test-tag', {
  primaryAddressBlock: IpAddresses.ipv4('10.1.0.0/16'),
  enableDnsHostnames: true,
  enableDnsSupport: true,
  vpcName: 'CDKintegTestVPC',
});

// Add custom tags if needed
Tags.of(vpc).add('Environment', 'Production');

过境网关

AWS Transit Gateway 构建库允许您使用 AWS CDK 创建和配置 Transit Gateway 资源.

见 AWS 中转网关文档 需要更多信息.

概览

过境网关建筑TransitGateway)是创建和管理您过境网关基础设施的主要切入点。 它提供了创建路由表,附加VPC,并配置交叉账户访问的方法.

Transit Gateway 构建库提供四大构建:

  • TransitGateway: 您网络连接的中央中枢
  • TransitGatewayRouteTable: 管理附件网络之间的路由
  • TransitGatewayVpcAttachment: 连接 VPC 到中转网关
  • TransitGatewayRoute: 定义您过境网关内的路由规则

基本用途

创建一个最小的可部署 TransitGateway数字 :

const transitGateway = new TransitGateway(this, 'MyTransitGateway');

默认通道路由表

默认, TransitGateway 默认创建 TransitGatewayRouteTable,用于自动协会和自动宣传.

注意:当您在 AWS Console 中创建默认 Transit Gateway 时, AWS 自动创建默认的 Transit Gateway Route Table 。 然而,当使用 CDK Transit Gateway L2 构造时,基本的 L1 构造配置为 defaultRouteTableAssociation 财务报告和审定财务报表 defaultRouteTablePropagation 明确残疾。 这确保了AWS不创建默认路由表,使得CDK可以定义自定义的默认路由表取而代之.

因此,在AWS控制台 默认关联路由表 财务报告和审定财务报表 默认传播路由表 设置将显示为已禁用。 尽管如此,CDK仍然通过内部实施提供自动关联和传播功能,这种功能可以使用 defaultRouteTableAssociation 财务报告和审定财务报表 defaultRouteTablePropagation cDK内部的属性.

您可以在默认情况下禁用自动关联/ Propagation TransitGatewayRouteTable 通过 TransitGateway 属性。 这将仍然为您创建一个默认的路由表 :

const transitGateway = new TransitGateway(this, 'MyTransitGateway', {
  defaultRouteTableAssociation: false,
  defaultRouteTablePropagation: false,
});

过境网关路由表管理

使用 addRouteTable() 方法 :

const transitGateway = new TransitGateway(this, 'MyTransitGateway');

const routeTable = transitGateway.addRouteTable('CustomRouteTable');

将 VPC 附加到过境网关

目前只支持VPC到 Transit Gateway附件.

使用 attachVpc() 方法 :

const myVpc = new VpcV2(this, 'Vpc');
const subnet1 = new SubnetV2(this, 'Subnet', {  
  vpc: myVpc,
  availabilityZone: 'eu-west-2a',
  ipv4CidrBlock: new IpCidr('10.0.0.0/24'),
  subnetType: SubnetType.PUBLIC 
});

const subnet2 = new SubnetV2(this, 'Subnet', {  
  vpc: myVpc,
  availabilityZone: 'eu-west-2a',
  ipv4CidrBlock: new IpCidr('10.0.1.0/24'),
  subnetType: SubnetType.PUBLIC 
});

const transitGateway = new TransitGateway(this, 'MyTransitGateway');

// Create a basic attachment
const attachment = transitGateway.attachVpc('VpcAttachment', {
  vpc: myVpc, 
  subnets: [subnet1, subnet2]
});

// Create an attachment with optional parameters
const attachmentWithOptions = transitGateway.attachVpc('VpcAttachmentWithOptions', {
  vpc: myVpc, 
  subnets: [subnet1], 
  vpcAttachmentOptions: {
    dnsSupport: true,
    applianceModeSupport: true,
    ipv6Support: true,
    securityGroupReferencingSupport: true,
  }
});

如果您想要自动将路由与中转网关路由表连接和推广, 您可以通过 associationRouteTable 财务报告和审定财务报表 propagationRouteTables 参数。 这将自动根据所提供的路由表建立必要的协会和传播.

const myVpc = new VpcV2(this, 'Vpc');
const subnet1 = new SubnetV2(this, 'Subnet', {  
  vpc: myVpc,
  availabilityZone: 'eu-west-2a',
  ipv4CidrBlock: new IpCidr('10.0.0.0/24'),
  subnetType: SubnetType.PUBLIC 
});

const subnet2 = new SubnetV2(this, 'Subnet', {  
  vpc: myVpc,
  availabilityZone: 'eu-west-2a',
  ipv4CidrBlock: new IpCidr('10.0.1.0/24'),
  subnetType: SubnetType.PUBLIC 
});

const transitGateway = new TransitGateway(this, 'MyTransitGateway');
const associationRouteTable = transitGateway.addRouteTable('AssociationRouteTable');
const propagationRouteTable1 = transitGateway.addRouteTable('PropagationRouteTable1');
const propagationRouteTable2 = transitGateway.addRouteTable('PropagationRouteTable2');

// Create an attachment with automatically created association + propagations
const attachmentWithRoutes = transitGateway.attachVpc('VpcAttachment', {
  vpc: myVpc, 
  subnets: [subnet1, subnet2],
  associationRouteTable: associationRouteTable,
  propagationRouteTables: [propagationRouteTable1, propagationRouteTable2],
});

在这个例子中 associationRouteTable 设置为 associationRouteTable,以及 propagationRouteTables 设置为包含 propagationRouteTable1 财务报告和审定财务报表 propagationRouteTable2。这触发了路由表关联的自动创建,以及路由表与指定路由表之间的路由传播.

向路由表添加静态路由

使用任意一种方式添加静态路由 addRoute() 添加活动路由的方法或 addBlackholeRoute() 添加黑洞路径 :

const transitGateway = new TransitGateway(this, 'MyTransitGateway');
const routeTable = transitGateway.addRouteTable('CustomRouteTable');

const myVpc = new VpcV2(this, 'Vpc');
const subnet = new SubnetV2(this, 'Subnet', {  
  vpc: myVpc,
  availabilityZone: 'eu-west-2a',
  ipv4CidrBlock: new IpCidr('10.0.0.0/24'),
  subnetType: SubnetType.PUBLIC 
});

const attachment = transitGateway.attachVpc('VpcAttachment', {
  vpc: myVpc, 
  subnets: [subnet]
});

// Add a static route to direct traffic
routeTable.addRoute('StaticRoute', attachment, '10.0.0.0/16');

// Block unwanted traffic with a blackhole route
routeTable.addBlackholeRoute('BlackholeRoute', '172.16.0.0/16');

路线表协会和宣传

配置路由表关联并启用路由传播 :

const transitGateway = new TransitGateway(this, 'MyTransitGateway');
const routeTable = transitGateway.addRouteTable('CustomRouteTable');
const myVpc = new VpcV2(this, 'Vpc');
const subnet = new SubnetV2(this, 'Subnet', {  
  vpc: myVpc,
  availabilityZone: 'eu-west-2a',
  ipv4CidrBlock: new IpCidr('10.0.0.0/24'),
  subnetType: SubnetType.PUBLIC 
});
const attachment = transitGateway.attachVpc('VpcAttachment', {
  vpc: myVpc, 
  subnets: [subnet]
});

// Associate an attachment with a route table
routeTable.addAssociation('Association', attachment);

// Enable route propagation for an attachment
routeTable.enablePropagation('Propagation', attachment);

协会 ——将"过境网关"附件与特定路由表相链接,该路由表将决定该附件将使用哪些路由来决定路由.

宣传 ——从附件到路由表的路线自动广告,使路由表能够了解现有的网络目的地.

版本与发布记录

@aws-cdk/aws-ec2-alpha 共发布 157 个版本,首次发布于 2024/09/06;过去 12 个月发布了 64 个版本。

版本发布日期距今
2.275.0-alpha.0latest2026/10/2712 天前
2.274.0-alpha.02026/10/2018 天前
2.273.0-alpha.02026/10/0929 天前
2.272.0-alpha.02026/09/301 个月前
2.271.0-alpha.02026/09/261 个月前
2.270.0-alpha.02026/09/181 个月前

关于 @aws-cdk/aws-ec2-alpha 的常见问题

@aws-cdk/aws-ec2-alpha 是什么?

VPC V2 的 CDK 构建库

如何安装 @aws-cdk/aws-ec2-alpha?

在项目目录运行 npm install @aws-cdk/aws-ec2-alpha,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:constructs(^10.5.0)、aws-cdk-lib(^2.275.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@aws-cdk/aws-ec2-alpha 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@aws-cdk/aws-ec2-alpha 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@aws-cdk/aws-ec2-alpha 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >= 20.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@aws-cdk/aws-ec2-alpha 可以商用吗?

@aws-cdk/aws-ec2-alpha 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@aws-cdk/aws-ec2-alpha 的下载量有多少?

根据 npm 官方下载统计,@aws-cdk/aws-ec2-alpha 在 2026/10/07 – 2026/11/05 这 30 天内被下载 17,722 次,日均约 591 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@aws-cdk/aws-ec2-alpha 还在维护吗?

最新版本 2.275.0-alpha.0 发布于 2026/10/27(12 天前);至今共发布 157 个版本,其中过去 12 个月发布了 64 个;首次发布于 2024/09/06。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。