我正在使用.Net SDK來幫助自動將應用程序部署到Windows EC2實例中。我想實現的過程是:使用AWS API/SDK向現有Elastic Load Balancer註冊新的EC2實例 - 有可能嗎?
- 創建一個新的EC2實例 - 通過使用 服務 加載新的應用程序版本 「白手起家」本身。
- 確保新的實例是在 「運行」狀態
- 運行上 新實例一些簡單的驗收測試。
- 與 具有運行舊 版本的應用程序實例的 現有的彈性負載均衡器註冊新的實例。
- 當新實例與負載均衡器註冊 時,取消註冊 舊的實例。
- 停止舊的EC2實例。
我設法步驟1和2的工作,而且我很有信心約3和6
要做到這一點,我一直在寫一個使用AWS簡單的C#控制檯應用程序.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);
當我看到更詳細的機制的文檔(relevant documentation here)我注意到這條線:
注意:爲了使此呼叫成功, 成功,客戶端必須有 創建了LoadBalancer。客戶端 必須提供與用於創建LoadBalancer的帳戶相同的帳戶 憑據。
實際上是否可以使用API向現有負載均衡器註冊新實例?