私は.NET SDKを使用して、アプリケーションをWindows EC2インスタンスに自動的にデプロイする手助けをしています。私が達成したいプロセスは、次のとおりです。AWS API/SDKを使用して既存のElastic Load Balancerに新しいEC2インスタンスを登録することは可能ですか?
- 新しいEC2インスタンスを作成します - この 「ブートストラップ」自体 で サービスを使用して、新しいバージョンのアプリケーションをロードすることによって。
- 新しいインスタンスが「実行中」の状態のにあることを確認してください。
- 新しいインスタンス で簡単な受け入れテストを実行します。
- 既存の弾性負荷分散装置 に、アプリケーションの古い バージョンを実行するインスタンスがある新しいインスタンスを登録します。
- 新しいインスタンスがロードバランサで に登録されると、古いインスタンス の登録を解除します。
- 古い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を使用して、既存のロードバランサで新しいインスタンスを登録することはできますか?