如何使用AWS CDK在应用负载均衡器前部署带弹性IP的网络负载均衡器
在AWS CDK中为Application Load Balancer配置带固定Elastic IP的前置Network Load Balancer
要给Application Load Balancer(ALB)提供固定公网IP,可通过在其前端部署绑定Elastic IP(EIP)的Network Load Balancer(NLB)实现,这是AWS官方推荐的方案。以下是TypeScript CDK实现代码,解决CDK API文档未明确覆盖的SubnetMappings配置问题:
实现步骤与代码示例
import * as cdk from 'aws-cdk-lib'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; import * as elbv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2'; const app = new cdk.App(); const stack = new cdk.Stack(app, 'AlbWithStaticIpStack'); // 1. 创建或导入现有VPC const vpc = ec2.Vpc.fromLookup(stack, 'ExistingVpc', { isDefault: false, vpcId: 'vpc-xxxxxxxxx' // 替换为你的VPC ID }); // 2. 为每个要使用的AZ创建Elastic IP(需与子网同AZ) const eips = vpc.publicSubnets.map((subnet, index) => { return new ec2.CfnEIP(stack, `Eip-${index}`, { domain: 'vpc' }); }); // 3. 创建绑定EIP的Network Load Balancer const nlb = new elbv2.NetworkLoadBalancer(stack, 'StaticIpNlb', { vpc: vpc, internetFacing: true, crossZoneEnabled: true }); // 为NLB的每个公网子网映射对应的EIP vpc.publicSubnets.forEach((subnet, index) => { nlb.addSubnetMapping({ subnetId: subnet.subnetId, allocationId: eips[index].attrAllocationId }); }); // 4. 创建后端Application Load Balancer const alb = new elbv2.ApplicationLoadBalancer(stack, 'BackendAlb', { vpc: vpc, internetFacing: false // 仅允许NLB访问,无需直接公网暴露 }); // 5. 创建NLB的目标组,指向ALB的IP const albTargetGroup = new elbv2.NetworkTargetGroup(stack, 'AlbTargetGroup', { vpc: vpc, port: 80, // 匹配ALB的监听端口 targetType: elbv2.TargetType.IP, targets: [ elbv2.IpTarget.fromIpAddresses(alb.loadBalancerDnsName) // 通过ALB的DNS解析获取IP ] }); // 6. 配置NLB监听器,转发流量到ALB目标组 nlb.addListener('HttpListener', { port: 80, defaultTargetGroups: [albTargetGroup] }); app.synth();
关键说明
- EIP与子网的AZ匹配:每个EIP必须和对应的子网处于同一可用区,否则NLB无法正常绑定。
- ALB的网络可见性:示例中ALB设为
internetFacing: false,仅允许VPC内或NLB访问,增强安全性;若需同时保留ALB公网访问,可设为true。 - 目标组类型:NLB的目标组需使用
IP类型,因为ALB的DNS会解析为其私有IP(VPC内)或公网IP,作为NLB的目标。 - CDK版本兼容:代码基于AWS CDK v2编写,确保你的项目使用v2版本依赖。
内容的提问来源于stack exchange,提问作者Anwar Javed
相关产品推荐
相关产品推荐

