2011-03-16 8 views
1

私は.NET SDKを使用して、アプリケーションをWindows EC2インスタンスに自動的にデプロイする手助けをしています。私が達成したいプロセスは、次のとおりです。AWS API/SDKを使用して既存のElastic Load Balancerに新しいEC2インスタンスを登録することは可能ですか?

  1. 新しいEC2インスタンスを作成します - この 「ブートストラップ」自体 で サービスを使用して、新しいバージョンのアプリケーションをロードすることによって。
  2. 新しいインスタンスが「実行中」の状態のにあることを確認してください。
  3. 新しいインスタンス で簡単な受け入れテストを実行します。
  4. 既存の弾性負荷分散装置 に、アプリケーションの古い バージョンを実行するインスタンスがある新しいインスタンスを登録します。
  5. 新しいインスタンスがロードバランサで に登録されると、古いインスタンス の登録を解除します。
  6. 古いEC2インスタンスを停止します。

Iは、ステップ1と2の作業を取得するために管理している、と私はAWSを使用する簡単なC#のコンソールアプリケーションを書いてきたこれを行うには

3程度と6かなり確信しています.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)documentionでより詳細に見ると、私はこの行を気づい:

注:この呼び出しを成功させるには、 を成功させるには、クライアントに はLoadBalancerを作成しました。クライアント は、 の資格情報を、 LoadBalancerの作成に使用されたものと同じアカウントで提供する必要があります。

実際にAPIを使用して、既存のロードバランサで新しいインスタンスを登録することはできますか?

答えて

0

これはすべて実装が簡単です。自動スケーリングを使用します。 APIを使用します。

0

ローマンは述べているように、それは自動スケーリングは、あなたが行くための良い方法であるように、それはあなたの問題が、その確かに良い出発点の全て解決しないことがあり聞こえる:

-an自動スケーリンググループを接続することができますがロードバランサ、例えば病気のx

-newインスタンスが自動的にロードバランサに追加された正常なインスタンスを(それがヘルスチェックに合格するまで、トラフィックが送信されません)

を持っている - あなたはただ持っているなどのping http://hostname/isaliveとして、カスタムのヘルスチェックを定義することができますインスタンスのパスが - あなたは - あなたがのユースケースを言及していないあなたは能力の上にしている場合、最も古いインスタンスが

を殺されるスケーリングポリシーを定義が、デフォルトでできる3

ステップたら、これらの要求に応えますあなたはあなたが使用することができます公共の直面しているアドレスを望んでいない場合はアプリトラフィックをまったく必要としない内部ロードバランサ

可能であれば、セキュリティのために最低限の特権の原則を使用することをお勧めします。メソッドを使用すると、すべてのインスタンスに多くの負荷を与える必要があります間違いや虐待によるものかどうかに関わらず、これは非常に簡単に間違っている可能性があります。

関連する問題