Golang版AWS CDK部署报autoscaling等类型未定义错误
Golang版AWS CDK部署ECS AutoScaling资源编译报错修复
需补充导入的依赖
你当前缺少Auto Scaling相关的核心包,在import块中加入以下包即可解决autoscaling相关标识符未定义的问题:
github.com/aws/aws-cdk-go/awscdk/v2/awsautoscaling:提供Auto Scaling Group、扩缩容策略相关的核心构造能力- 注意:ASG Capacity Provider、Task Definition相关结构体本身属于
awsecs包,不需要额外导入新包,未定义是命名写法错误导致的。
逐个报错对应修正方案
- 标识符未定义类报错(
autoscaling/autoScalingGroupProps/cpuUtilizationScalingProps/asgCapacityProviderProps/ecs/this)autoscaling、autoScalingGroupProps、cpuUtilizationScalingProps未定义:导入上述awsautoscaling包后,通过awsautoscaling.AutoScalingGroupProps、awsautoscaling.CpuUtilizationScalingProps引用对应配置结构体,通过awsautoscaling.NewAutoScalingGroup()创建ASG实例。asgCapacityProviderProps未定义:Go语言仅允许跨包访问大写开头的导出标识符,该结构体的正确名称为awsecs.AsgCapacityProviderProps,不要使用小写开头的写法。ecs未定义:检查awsecs包的导入语句,显式声明别名即可,示例写法:ecs "github.com/aws/aws-cdk-go/awscdk/v2/awsecs"this未定义:this不是CDK内置全局变量,是方法接收者的自定义命名,需要在栈构造方法的签名中显式声明接收者变量,才能在方法内用this指代当前栈实例。
awsecs.Cluster类型无addAsgCapacityProvider方法报错
Go版CDK所有公开方法均为大写开头,不存在小写开头的addAsgCapacityProvider方法,直接调用大写开头的AddAsgCapacityProvider()方法即可。不要直接照搬TypeScript版CDK文档的小驼峰命名写法,Go版本的公开成员全部遵循大驼峰命名规范。- 无法引用未导出的
awsecs.taskDefinitionProps报错
同样是Go语言导出规则限制,Task Definition的配置结构体正确名称为awsecs.TaskDefinitionProps,首字母必须大写,小写开头的taskDefinitionProps是包内私有结构体,外部包无法访问。
可正常运行的最小代码参考
package main import ( "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/aws-cdk-go/awscdk/v2/awsautoscaling" "github.com/aws/aws-cdk-go/awscdk/v2/awsec2" "github.com/aws/aws-cdk-go/awscdk/v2/awsecs" "github.com/aws/aws-cdk-go/awscdk/v2/awsiam" "github.com/aws/constructs-go/constructs/v10" "github.com/aws/jsii-runtime-go" ) type EcsAsgStackProps struct { awscdk.StackProps } func NewEcsAsgStack(scope constructs.Construct, id string, props *EcsAsgStackProps) awscdk.Stack { var sprops awscdk.StackProps if props != nil { sprops = props.StackProps } stack := awscdk.NewStack(scope, &id, &sprops) // 创建VPC vpc := awsec2.NewVpc(stack, jsii.String("AppVpc"), &awsec2.VpcProps{ MaxAzs: jsii.Number(2), }) // 创建ECS集群 cluster := awsecs.NewCluster(stack, jsii.String("AppCluster"), &awsecs.ClusterProps{ Vpc: vpc, }) // 创建Auto Scaling Group asg := awsautoscaling.NewAutoScalingGroup(stack, jsii.String("AppAsg"), &awsautoscaling.AutoScalingGroupProps{ Vpc: vpc, InstanceType: awsec2.InstanceType_Of(awsec2.InstanceClass_BURSTABLE3, awsec2.InstanceSize_MICRO), MachineImage: awsecs.EcsOptimizedImage_AmazonLinux2(awsecs.AmiHardwareType_X86_64), MinCapacity: jsii.Number(1), MaxCapacity: jsii.Number(3), }) // 给ASG绑定ECS所需权限 asg.Role().AddManagedPolicy(awsiam.ManagedPolicy_FromAwsManagedPolicyName(jsii.String("service-role/AmazonEC2ContainerServiceforEC2Role"))) // 挂载ASG Capacity Provider到集群 capacityProvider := awsecs.NewAsgCapacityProvider(stack, jsii.String("AsgCp"), &awsecs.AsgCapacityProviderProps{ AutoScalingGroup: asg, }) cluster.AddAsgCapacityProvider(capacityProvider) // 配置CPU使用率自动扩缩容 asg.ScaleOnCpuUtilization(jsii.String("CpuScalingPolicy"), &awsautoscaling.CpuUtilizationScalingProps{ TargetUtilizationPercent: jsii.Number(70), }) // 创建EC2类型Task Definition(注意结构体名大写开头) _ = awsecs.NewEc2TaskDefinition(stack, jsii.String("AppTaskDef"), &awsecs.Ec2TaskDefinitionProps{}) return stack } func main() { defer jsii.Close() app := awscdk.NewApp(nil) NewEcsAsgStack(app, "EcsAsgStack", &EcsAsgStackProps{}) app.Synth() }
代码调整完成后,在cdk目录下执行go mod tidy拉取缺失依赖,再执行cdk deploy即可正常编译部署。
内容的提问来源于stack exchange,提问作者carsona
相关产品推荐
相关产品推荐

