Почему я иногда получаю неправильный ответ от AWS? - PullRequest
0 голосов
/ 08 декабря 2018

Я написал некоторый код на 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)
}

Может кто-нибудь подсказать, еслиЯ что-то не так делаю?

Заранее спасибо.

...