2016-10-03 66 views
1

我从代码开始新的AWS实例(与Windows):如何检查是否AWS实例实际上是提供

RunInstancesResponse launchResponse = ec2Client.RunInstances(launchRequest); 

然后我要求它的状态:

var instanceRequest = new DescribeInstancesRequest(); 
    var response = ec2Client.DescribeInstances(instanceRequest); 

当状态是16 /正在运行我试图连接到此实例,但失败。稍后可以连接。 在AWS控制台中,我看到'状态检查',当图像获取状态'运行'时开始运行,我认为'状态检查'完成时图像变得真正可用。

+3

我想从亚马逊的角度来看实例正在运行。问题是实例上的操作系统还没有完成引导/启动,可能没有准备好接受连接。在AWS说实例正在运行后,您可能不得不再等一两分钟。 –

回答

1

关于运行状态,我同意Mark B.运行状态并不保证OS已经启动完成,用户数据已经完成运行,您的生成密码是否可用等。检查状态可能是巧合的是对你更好,因为 - 默认情况下 - 它只检查正在运行的实例,但好处可能只是巧合,因为这些检查同样不会检查您实例上可能感兴趣的许多内部操作。

要看status checks,您需要使用不同的API:

个DescribeInstanceStatus:

简单的例子:

using (IAmazonEC2 client = new AmazonEC2Client()) 
{ 
    string instanceId = "i-abcd1234"; 

    DescribeInstanceStatusResponse response = client.DescribeInstanceStatus(
     new DescribeInstanceStatusRequest 
     { 
      InstanceIds = new List<string> { instanceId } 
     }); 

    InstanceStatus status = response?.InstanceStatuses.FirstOrDefault(
     x => x.InstanceId == instanceId 
    ); 

    if (status != null) 
    { 
     // Perform your checks on InstanceStatus here 
    } 
} 

其他一些另类的想法:

  • 看从实例user data
  • 投票的实例的端点发布的消息,直到它变得可用。如果此实例专门托管Web服务,则这是一种更好的方法,可以通过ELB自动执行。
0

同意安东尼 - 不要依赖于API的地位。 你说:

“我试图连接到该实例,但它失败后,它 可以连接。”

为什么不这样做,在你的代码?

while (true) 
{ 
    try 
    { 
     // try and connect to whatever you're waiting for on your instance(s) 
     ConnectToInstance("instance IP address goes here"); 
     return; 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine("Still waiting to connect: " + e)   
     Thread.Sleep(5000); 
    } 
} 

可能会增加一个等待的最长时间。那么你不依赖AWS状态或用户数据或Windows服务启动延迟等。

相关问题