如何检查AWS实例是否真的可用

时间:2016-10-03 13:45:28

标签: c# .net amazon-web-services amazon-ec2 aws-sdk

我正在从代码

开始新的AWS实例(使用Windows)
RunInstancesResponse launchResponse = ec2Client.RunInstances(launchRequest);

然后我要求它的状态:

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

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

2 个答案:

答案 0 :(得分:1)

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

要查看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自动执行。

答案 1 :(得分:0)

同意Anthony - 不要依赖API的状态。 你说:

  

&#34;我试图连接到此实例,但它失败了。后来才是   可以连接&#34;

为什么不在代码中执行此操作?

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服务启动延迟等。