Использование AWS API / SDK для регистрации новых экземпляров EC2 с помощью существующего эластичного балансировщика нагрузки - возможно ли это? - PullRequest
1 голос
/ 16 марта 2011

Я работаю над использованием .Net SDK, чтобы помочь автоматизировать развертывание приложения в экземплярах Windows EC2. Процесс, которого я хочу достичь:

  1. Создайте новый экземпляр EC2 - это "самозагрузиться" сам, загрузив в новая версия приложения с использованием сервис.
  2. Убедитесь, что новый экземпляр находится в состояние «бег»
  3. Запустите несколько простых приемочных испытаний новый экземпляр.
  4. Зарегистрируйте новый экземпляр с существующий эластичный балансировщик нагрузки, который есть экземпляр, управляющий старым версия приложения.
  5. Когда новый экземпляр зарегистрирован с балансировщиком нагрузки, отменить регистрацию старый экземпляр.
  6. Остановите старый экземпляр EC2.

Мне удалось заставить работать шаги 1 и 2, и я довольно уверен в отношении 3 и 6.

Для этого я писал простое консольное приложение на C #, которое использует AWS .Net SDK v1.3.2 для выполнения различных вызовов API.

Однако, когда я перехожу к шагу 4, я не могу зарегистрировать новый экземпляр с помощью балансировщика нагрузки. Вот мой код:

public IList<Instance> PointToNewInstance(string newInstanceId)
{
    var allInstances = new List<Instance>();

    using (var elbClient = ClientUtilities.GetElbClient())
    {
        try
        {
            var newInstances = new List<Instance> {new Instance(newInstanceId)};
            var registInstancesRequest = new RegisterInstancesWithLoadBalancerRequest
                                             {
                                                 LoadBalancerName = LoadBalancerName,
                                                 Instances = newInstances
                                             };

            var registerReponse = elbClient.RegisterInstancesWithLoadBalancer(registInstancesRequest);
            allInstances = registerReponse.RegisterInstancesWithLoadBalancerResult.Instances;

            var describeInstanceHealthRequest = new DescribeInstanceHealthRequest
                                                    {
                                                        Instances = newInstances
                                                    };
            DescribeInstanceHealthResponse describeInstanceHealthResponse;

            do
            {
                describeInstanceHealthResponse = elbClient.DescribeInstanceHealth(describeInstanceHealthRequest);
            } while (describeInstanceHealthResponse.DescribeInstanceHealthResult.InstanceStates[0].State == "OutOfService");

            _log.DebugFormat("New instance [{0}] now in service - about to stop remove old instance", newInstanceId);

            if (allInstances.Any(i => i.InstanceId != newInstanceId))
            {
                elbClient.DeregisterInstancesFromLoadBalancer(new DeregisterInstancesFromLoadBalancerRequest
                                                                  {
                                                                      Instances = allInstances.Where(i => i.InstanceId != newInstanceId).ToList(),
                                                                      LoadBalancerName = LoadBalancerName
                                                                  });
                foreach (var instance in allInstances.Where(i => i.InstanceId != newInstanceId).ToList())
                {
                    _log.DebugFormat("Instance [{0}] has now been de-registered from load-balancer [{1}]", instance.InstanceId, LoadBalancerName);
                }
            }
        }
        catch (Exception exception)
        {
            _log.Error(exception);
        }
    }

    return allInstances.Where(i => i.InstanceId != newInstanceId).ToList();
}

Код просто зависает в этой строке:

var registerReponse = elbClient.RegisterInstancesWithLoadBalancer(registInstancesRequest);

Когда я посмотрел более подробно документацию ( соответствующую документацию здесь ), я заметил эту строку:

ПРИМЕЧАНИЕ: Для того, чтобы этот звонок был успешно, клиент должен иметь создал LoadBalancer. Клиент должен предоставить ту же учетную запись учетные данные, как те, которые были использованы для создать LoadBalancer.

Возможно ли использовать API для регистрации новых экземпляров с помощью существующего балансировщика нагрузки?

Ответы [ 2 ]

0 голосов
/ 10 апреля 2015

Как упоминает Роман, звучит так, что автоматическое масштабирование - это хороший способ для вас, он может решить не все ваши проблемы, но, безусловно, хорошая отправная точка:

- группу автоматического масштабирования можно привязать к балансировщику нагрузки, например, у меня х здоровых экземпляров

-новые экземпляры автоматически добавляются в балансировщик нагрузки (трафик не будет отправляться, пока он не пройдет проверку работоспособности)

- вы можете определить пользовательские проверки работоспособности, такие как ping http://hostname/isalive, просто сделайте так, чтобы ваш экземпляр отвечал на эти запросы, как только пройдет этап 3

-вы можете определить политики масштабирования, но по умолчанию, если у вас больше емкости, самые старые экземпляры будут убиты

- вы не упоминаете пример использования приложения, но если вам не нужен общедоступный адрес, вы можете использовать внутренний балансировщик нагрузки, который не принимает трафик, просто присматривайте за проверкой работоспособности

- везде, где это возможно, вы всегда должны использовать принципы наименьших привилегий для обеспечения безопасности, так как с вашим методом вам придется предоставлять каждому экземпляру много возможностей для управления другими экземплярами, будь то по ошибке или злоупотреблению, это может очень легко пойти не так

0 голосов
/ 14 февраля 2012

Все это легко реализовать.Используйте автоматическое масштабирование.Используйте API.

...