亚马逊 VpcV2 构造库
本单元中较高层次构件的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财务报告和审定财务报表defaultRouteTablePropagationcDK内部的属性.
您可以在默认情况下禁用自动关联/ 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);
协会 ——将"过境网关"附件与特定路由表相链接,该路由表将决定该附件将使用哪些路由来决定路由.
宣传 ——从附件到路由表的路线自动广告,使路由表能够了解现有的网络目的地.