Amazon ec2 使用AWS API/SDK向现有弹性负载平衡器注册新的EC2实例-可能吗?

Amazon ec2 使用AWS API/SDK向现有弹性负载平衡器注册新的EC2实例-可能吗?,amazon-ec2,amazon-web-services,amazon,load-balancing,Amazon Ec2,Amazon Web Services,Amazon,Load Balancing,我正在研究使用.Net SDK来帮助将应用程序自动部署到Windows EC2实例中。我想要实现的过程是: 创建一个新的EC2实例-此 通过在 使用 服务 确保新实例位于 “运行”状态 在上运行一些简单的验收测试 新实例 将新实例注册到 现有的弹性负载平衡器 有一个实例运行旧的 应用程序的版本 注册新实例时 使用负载平衡器,取消注册 旧的例子 停止旧的EC2实例 我已经设法让第一步和第二步起作用,我对第三步和第六步很有信心 为此,我一直在编写一个简单的C#控制台应用程序,它使用AWS.NETSD

我正在研究使用.Net SDK来帮助将应用程序自动部署到Windows EC2实例中。我想要实现的过程是:

  • 创建一个新的EC2实例-此 通过在 使用 服务
  • 确保新实例位于 “运行”状态
  • 在上运行一些简单的验收测试 新实例
  • 将新实例注册到 现有的弹性负载平衡器 有一个实例运行旧的 应用程序的版本
  • 注册新实例时 使用负载平衡器,取消注册 旧的例子
  • 停止旧的EC2实例
  • 我已经设法让第一步和第二步起作用,我对第三步和第六步很有信心

    为此,我一直在编写一个简单的C#控制台应用程序,它使用AWS.NETSDKv1.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();
    }
    
    public IList pointtoneInstance(字符串newInstanceId)
    {
    var allInstances=新列表();
    使用(var elbClient=ClientUtilities.GetElbClient())
    {
    尝试
    {
    var newInstances=newlist{newinstance(newInstanceId)};
    var registeInstanceRequest=新的RegisterInstancesWithLoadBalancerRequest
    {
    LoadBalancerName=LoadBalancerName,
    实例=新实例
    };
    var registerReponse=elbClient.RegisterInstancesWithLoadBalancer(RegisterInstanceRequest);
    allInstances=registerReponse.RegisterInstancesWithLoadBalancerResult.Instances;
    var descripbeInstanceHealthRequest=新的descripbeInstanceHealthRequest
    {
    实例=新实例
    };
    描述InstanceHealthResponse描述InstanceHealthResponse;
    做
    {
    describeInstanceHealthResponse=elbClient.DescribeInstanceHealth(describeInstanceHealthRequest);
    }而(describeInstanceHealthResponse.DescribeInstanceHealthResult.InstanceStates[0]。状态==“OutOfService”);
    _DebugFormat(“新实例[{0}]正在使用中-即将停止删除旧实例”,newInstanceId);
    if(allInstances.Any(i=>i.InstanceId!=newInstanceId))
    {
    elbClient.DeregisterInstancesFromLoadBalancer(新的DeregisterInstancesFromLoadBalancer请求
    {
    Instances=allInstances.Where(i=>i.InstanceId!=newInstanceId).ToList(),
    LoadBalancerName=LoadBalancerName
    });
    foreach(allInstances.Where(i=>i.InstanceId!=newInstanceId).ToList()中的var实例)
    {
    _DebugFormat(“实例[{0}]现在已从负载平衡器[{1}]注销”,Instance.InstanceId,LoadBalancerName);
    }
    }
    }
    捕获(异常)
    {
    _日志错误(异常);
    }
    }
    返回allInstances.Where(i=>i.InstanceId!=newInstanceId).ToList();
    }
    
    代码冻结在这一行:

    var registerReponse=elbClient.RegisterInstancesWithLoadBalancer(registerInstanceRequest)

    当我更详细地查看文档()时,我注意到这一行:

    注意:为了完成此通话 如果成功,客户端必须具有 创建了LoadBalancer。客户 必须提供相同的帐户 与以前使用的凭据相同的凭据 创建LoadBalancer


    是否可以使用API向现有负载平衡器注册新实例?

    所有这些都很容易实现。使用自动缩放。使用API。

    正如Roman提到的,听起来自动缩放是一种很好的方法,它可能无法解决所有问题,但它确实是一个很好的起点:

    -自动缩放组可以绑定到负载平衡器,例如,将有x个正常实例

    -新实例将自动添加到负载平衡器(在通过运行状况检查之前,不会发送任何流量)

    -您可以定义自定义的运行状况检查,例如ping,只要实例通过步骤3,就可以让实例响应这些请求

    -您可以定义扩展策略,但默认情况下,如果容量过大,最旧的实例将被终止

    -你没有提到应用程序的使用案例,但是如果你不想要一个面向公众的地址,你可以使用一个不接受任何流量的内部负载均衡器,只需检查运行状况即可

    -在可能的情况下,您应该始终使用最小特权原则进行安全保护,在您的方法中,您必须赋予每个实例很大的权限来控制其他实例,无论是由于错误还是滥用,这都很容易出错