# @aws-cdk/aws-ec2-alpha 中文文档

规范地址：https://npmcn.com/package/%40aws-cdk/aws-ec2-alpha/

版本：2\.275\.0-alpha\.0
npm 元数据更新时间：2026-10-26T19:17:06.745Z
中文译文更新时间：2026-11-07T14:34:30.291Z
软件包许可：Apache-2\.0

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40aws-cdk/aws-ec2-alpha
原文对照：https://npmcn.com/package/%40aws-cdk/aws-ec2-alpha/?lang=original
项目主页：https://github.com/aws/aws-cdk
源码仓库：https://github.com/aws/aws-cdk

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：1.4 MB，41 个文件
- 模块格式：CommonJS
- TypeScript 类型：包内自带
- Node.js 要求：\>= 20\.0\.0
- 运行依赖：0 个
- peer 依赖：constructs ^10\.5\.0，aws-cdk-lib ^2\.275\.0
- 首次发布：2024-09-06T05:32:54.901Z
- 最新版本发布：2026-10-26T19:17:06.418Z
- 近 30 天下载量：17722（2026-10-07 至 2026-11-05，npm 官方下载统计）
- 已发布版本数：157（近 12 个月 64 个）

## 中文简介

VPC V2 的 CDK 构建库

## 安装

```sh
npm install @aws-cdk/aws-ec2-alpha
```

也可以使用：`pnpm add @aws-cdk/aws-ec2-alpha`、`yarn add @aws-cdk/aws-ec2-alpha`、`bun add @aws-cdk/aws-ec2-alpha`

## README

# 亚马逊 VpcV2 构造库

* * *

![cdk-constructs: Developer Preview](https://img.shields.io/badge/cdk--constructs-developer--preview-informational.svg?style=for-the-badge)

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

* * *

## VpcV2 请检查url=值 (帮助)

`VpcV2` 是重写 [`ec2.Vpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html) 构造。 这个新构造可以提高定制程度 正在创建 VPC. `VpcV2` 执行现有的 [`IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html)因此, `VpcV2` 与接受 `IVpc` (例如:. [`ApplicationLoadBalancer`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationLoadBalancer.html#construct-props)) (中文(简体) ).

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

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

```ts
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`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Subnet.html) 构造. 此新构造可用于将子网添加到 a `VpcV2` 实例: 注意: 当定义子网时 `SubnetV2`,CDK 自动创建新的路由表,除非路由表被明确作为构建的输入. 实现 `mapPublicIpOnLaunch` 特性( 即 `false` ),将属性设置为 `true` 当创建子网时.

```ts
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 检查池的配置

```shell
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](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-ipam-pool-allocations.html)

```ts
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 块 :

```shell
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 声明 :

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

请查看InfoFinland上 [EC2 文档](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html)。 。 。 .

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

```ts
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`数字 :

```ts
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` 构造如下:

```ts
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路由.

```ts
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`数字 :

```ts
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` 构造为路径目标 :

```ts
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对等是什么?](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html)。 。 。 .

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

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

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

```ts
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` 方法.

```ts
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`

```ts
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 对等 :

```ts
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 对等连接更新您的路由表](https://docs.aws.amazon.com/vpc/latest/peering/vpc-peering-routing.html)。 。 。 .

```ts
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进行. 更多信息见 [创建路由](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-route.html)。 。 。 .

```bash
# 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 对等连接, 请使用以下命令 :

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

更多信息见 [删除 VPC 对等连接](https://docs.aws.amazon.com/vpc/latest/peering/create-vpc-peering-connection.html#delete-vpc-peering-connection)。 。 。 .

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

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

更多信息见 [启用仅使用 Egress- 互联网网关的 IPv6 流量](https://docs.aws.amazon.com/vpc/latest/userguide/egress-only-internet-gateway.html)。 。 。 .

VpcV2 支持使用 `addEgressOnlyInternetGateway` 方法.

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

```ts
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 网关基础](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)。 。 。 .

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

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

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

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

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

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

```ts
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是什么??](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)。 。 。 .

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

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

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

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

```ts
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 互联网网关](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-igw-internet-access.html)。 。 。 .

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

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

```ts
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范围:

```ts
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],
});
```

```ts
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 的例子

```ts
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"

```ts
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

```ts
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 的特定子网工作时是有用的.

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

```ts
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`。 。 。 .

```ts
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 中转网关文档](https://npmcn.com/package/%40aws-cdk/aws-ec2-alpha/docs.aws.amazon.com/vpc/latest/tgw/what-is-transit-gateway.html) 需要更多信息.

### 概览

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

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

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

### 基本用途

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

```ts
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` 属性。 这将仍然为您创建一个默认的路由表 :

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

### 过境网关路由表管理

使用 `addRouteTable()` 方法 :

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

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

### 将 VPC 附加到过境网关

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

使用 `attachVpc()` 方法 :

```ts
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` 参数。 这将自动根据所提供的路由表建立必要的协会和传播.

```ts
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()` 添加黑洞路径 :

```ts
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');
```

### 路线表协会和宣传

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

```ts
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 是什么？

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 和提交记录判断。

