Golang AWS CDK创建ECS Capacity Provider报名称无效错误
问题描述
通过Golang版本AWS CDK创建ECS Capacity Provider时,执行deploy操作资源创建失败,核心业务代码如下:
cluster := awsecs.NewCluster(stack, jsii.String("ecsCluster"), &awsecs.ClusterProps{ Vpc: vpc, EnableFargateCapacityProviders: newTrue(), }) // 创建挂载到集群的自动伸缩组 autoScalingGroup := autoscaling.NewAutoScalingGroup(stack, jsii.String("ASG"), &autoScalingGroupProps{ Vpc: vpc, InstanceType: ec2.NewInstanceType(jsii.String("t2.micro")), MachineImage: ecs.EcsOptimizedImage_AmazonLinux2(), MinCapacity: jsii.Number(0), MaxCapacity: jsii.Number(100), }) autoScalingGroup.ScaleOnCpuUtilization(jsii.String("CpuScaling"), &cpuUtilizationScalingProps{ TargetUtilizationPercent: jsii.Number(90), }) capacityProvider := ecs.NewAsgCapacityProvider(stack, jsii.String("myCapProvider"), &asgCapacityProviderProps{ AutoScalingGroup: autoScalingGroup, }) cluster.AddAsgCapacityProvider(capacityProvider)
部署时返回的报错信息如下:
3:39:39 PM | CREATE_FAILED | AWS::ECS::CapacityProvider | myCapProvider/myCapProvider Resource handler returned message: "Invalid request provided: CreateCapacityProvider error: The specified capacity provider name is invalid. Up to 255 characters are allowed, including letters (upper and lowercase), numbers, underscores, and hyphens. The name cannot be prefixed with "aws", "ecs", or "fargate". Specify a valid name and try again. (Service: AmazonECS; Status Code: 400; Error Code: ClientException; Request ID: azz1be40-53q6-452c-n080-l9676s851o39; Proxy: null)" (RequestToken: f4z2s97k-9w42-5198-236b-bdbfcf1dac83, HandlerErrorCode: InvalidRequest)
问题原因
报错核心触发点是ECS服务的强制校验规则:自定义Capacity Provider名称不允许以aws/ecs/fargate三个字符串为前缀。
当前代码没有显式指定Capacity Provider的物理名称,CDK会根据构造的路径逻辑ID自动生成物理资源名;由于集群的构造ID设置为ecsCluster(以ecs开头),自动拼接生成的Capacity Provider名称命中了前缀限制,最终触发校验失败。官方示例未出现该问题是因为示例中的构造ID未使用上述三个受限字符串作为开头,自动生成的名称符合规则。
解决方案
选择以下任意一种方式调整即可修复问题:
- 显式指定Capacity Provider名称:在AsgCapacityProvider的属性配置中,手动传入符合规则的名称,避开自动生成名称的逻辑,修改后的代码片段如下:
capacityProvider := ecs.NewAsgCapacityProvider(stack, jsii.String("myCapProvider"), &asgCapacityProviderProps{ AutoScalingGroup: autoScalingGroup, // 手动指定名称,注意不要用aws/ecs/fargate开头 CapacityProviderName: jsii.String("app-asg-cap-provider"), })
- 修改构造ID前缀:如果不需要自定义物理名称,将集群、Capacity Provider相关构造的逻辑ID中开头的
ecs/aws/fargate前缀移除即可,比如把集群ID从ecsCluster修改为appCluster,CDK自动生成的资源名就不会触发前缀校验。
内容的提问来源于stack exchange,提问作者carsona12
相关产品推荐
相关产品推荐

