Amazon ec2 使用AWS API/SDK向现有弹性负载平衡器注册新的EC2实例-可能吗?
我正在研究使用.Net SDK来帮助将应用程序自动部署到Windows 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
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,就可以让实例响应这些请求
-您可以定义扩展策略,但默认情况下,如果容量过大,最旧的实例将被终止
-你没有提到应用程序的使用案例,但是如果你不想要一个面向公众的地址,你可以使用一个不接受任何流量的内部负载均衡器,只需检查运行状况即可
-在可能的情况下,您应该始终使用最小特权原则进行安全保护,在您的方法中,您必须赋予每个实例很大的权限来控制其他实例,无论是由于错误还是滥用,这都很容易出错