2011-03-16 44 views
1

我正在使用.Net SDK來幫助自動將應用程序部署到Windows EC2實例中。我想實現的過程是:使用AWS API/SDK向現有Elastic Load Balancer註冊新的EC2實例 - 有可能嗎?

  1. 創建一個新的EC2實例 - 通過使用 服務 加載新的應用程序版本 「白手起家」本身。
  2. 確保新的實例是在 「運行」狀態
  3. 運行上 新實例一些簡單的驗收測試。
  4. 與 具有運行舊 版本的應用程序實例的 現有的彈性負載均衡器註冊新的實例。
  5. 當新實例與負載均衡器註冊 時,取消註冊 舊的實例。
  6. 停止舊的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​​向現有負載均衡器註冊新實例?

回答

0

所有這些都很容易實現。使用Auto Scaling。使用API​​。

0

正如羅馬提到,這聽起來像自動縮放是一個好辦法讓你去,它可能不會解決所有的問題,你的,但其肯定是一個很好的起點:

-an自動縮放組可綁到負載均衡器,例如生病了X健康的情況下

- 新的實例被自動添加到負載均衡器(無交通將被髮送,直到它通過了健康檢查)

- 你可以自定義健康檢查,如ping http://hostname/isalive只是有您的實例來響應這些請求一旦其越過步驟3

- 你可以定義縮放策略,但默認情況下,如果你是產能過剩的最古老的情況下會被殺死

- 你沒有提到的用例該應用程序,但如果你不想公開的地址,你可以使用一個內部的負載平衡器,不採取任何流量,只是照顧健康檢查

- 在可能的情況下,你應該總是使用最小特權原則的安全性,你必須給你的方法每個實例很多控制其他實例的權力,無論是通過錯誤還是濫用,都可能非常容易出錯

相關問題