Я написал некоторый код на Go, который используется для масштабирования группы экземпляров в AWS.Он принимает две переменные среды: ASG_MAX_SCALE и ASG_MIN_SCALE и проверяет требуемую емкость указанной ASG в AWS.Я использую его в качестве подонка в Кубернетесе, и, к сожалению, иногда я получаю неправильный ответ от AWS API.Он должен работать следующим образом: если текущая требуемая емкость равна ASG_MAX_SCALE, установите для требуемой емкости значение ASG_MIN_SCALE и наоборот.Проблема заключается в том, что иногда, например, даже если текущая требуемая емкость равна 2 (что я вижу в консоли AWS), API-интерфейс AWS отвечает 3, что не увеличивает масштаб ASG.Это также происходило с другой стороны, реальная Желаемая мощность была 3, но она ответила 2. Проблема странная, потому что это происходит случайно.Если я использую деталь для локальной проверки требуемой мощности (на моем ноутбуке), она всегда дает правильный ответ.
Вот код:
var newASGsize int64
maxScaleASG, err := strconv.Atoi(os.Getenv("ASG_MAX_SCALE"))
if err != nil {
panic(err)
}
minScaleASG, err := strconv.Atoi(os.Getenv("ASG_MIN_SCALE"))
if err != nil {
panic(err)
}
svc := autoscaling.New(session.New())
describeInput := &autoscaling.DescribeAutoScalingGroupsInput{
AutoScalingGroupNames: []*string{
aws.String(os.Getenv("ASG_NAME")),
},
}
fmt.Println("Instance Group: " + os.Getenv("ASG_NAME"))
describeResult, err := svc.DescribeAutoScalingGroups(describeInput)
awsErr(err)
if *describeResult.AutoScalingGroups[0].DesiredCapacity == int64(maxScaleASG) {
newASGsize = int64(minScaleASG)
} else {
newASGsize = int64(maxScaleASG)
}
updateInput := &autoscaling.UpdateAutoScalingGroupInput{
AutoScalingGroupName: aws.String(os.Getenv("ASG_NAME")),
DesiredCapacity: aws.Int64(newASGsize),
}
_, err = svc.UpdateAutoScalingGroup(updateInput)
awsErr(err)
for {
describeResult, err := svc.DescribeAutoScalingGroups(describeInput)
awsErr(err)
if asgReadinessCheck(describeResult.AutoScalingGroups[0].Instances, newASGsize) == true {
break
}
fmt.Println("The instance group is not ready. Sleeping for 5 seconds...")
time.Sleep(5 * time.Second)
}
Может кто-нибудь подсказать, еслиЯ что-то не так делаю?
Заранее спасибо.