使用CDK配置NLB+Fargate服务UDP端口映射时构建报错,是否支持该配置?
问题:为带NLB的ECS Fargate服务配置UDP端口映射时CDK构建失败
尝试为搭载Network Load Balancer(NLB)的ECS Fargate服务添加UDP端口映射,执行CDK构建时失败,报错信息如下:
Error: Container '**-ECS-Task-Container' has no mapping for port undefined and protocol tcp. Did you call "container.addPortMappings()"?
at FargateTaskDefinition._validateTarget (/../node_modules/aws-cdk-lib/aws-ecs/lib/base/task-definition.js:1:7371)
at FargateService.loadBalancerTarget (/../node_modules/aws-cdk-lib/aws-ecs/lib/base/base-service.js:1:9940)
at FargateService.get defaultLoadBalancerTarget [as defaultLoadBalancerTarget]
相关代码示例:
const container = taskDefinition.addContainer(props.stackName + '-ECS-Task-Container', { containerName: props.stackName + '-ECS-Container', image: serviceImage, memoryLimitMiB: 512, cpu: 256, portMappings: [ { containerPort: 7950, hostPort: 7950, protocol: EcsProtocol.UDP }, ] });
或者:
container.addPortMappings({ containerPort: 7950, hostPort: 7950, protocol: EcsProtocol.UDP } );
请问是否可以通过CDK为带NLB的Fargate服务配置UDP端口?
解答
- 可以通过CDK配置,但报错的核心原因是:CDK默认的
defaultLoadBalancerTarget逻辑会自动查找容器的TCP端口映射进行校验,而你的容器仅配置了UDP端口,导致校验失败。 - 解决方法是绕过默认的负载均衡绑定逻辑,手动创建UDP目标组、NLB监听器,并将Fargate服务注册到目标组:
关键代码示例
// 1. 创建UDP协议的目标组 const udpTargetGroup = new elbv2.NetworkTargetGroup(this, 'UdpTargetGroup', { port: 7950, protocol: elbv2.Protocol.UDP, targetType: elbv2.TargetType.IP, vpc: props.vpc, }); // 2. 为NLB添加UDP监听器并关联目标组 nlb.addListener('UdpListener', { port: 7950, protocol: elbv2.Protocol.UDP, defaultTargetGroups: [udpTargetGroup], }); // 3. 创建Fargate服务后,手动注册到UDP目标组 const fargateService = new ecs.FargateService(this, 'FargateService', { cluster: cluster, taskDefinition: taskDefinition, // 不要使用默认的loadBalancers配置项 }); udpTargetGroup.addTarget(fargateService);
- 额外注意:任务定义中需保留你原本的UDP端口映射配置,确保容器端口与协议匹配。
内容的提问来源于stack exchange,提问作者Ajay
相关产品推荐
相关产品推荐

