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

How to check if AWS instance is really available

我正在从代码开始新的 AWS 实例(Windows):

RunInstancesResponse launchResponse = ec2Client.RunInstances(launchRequest);

然后我请求它的状态:

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

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

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

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

描述实例状态:

简单示例:

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.
  • 实现自动化

同意 Anthony 的观点 - 不要依赖 API 的地位。 你说:

"I'm trying to connect to this instance, but it fails. Later it is possible to connect"

为什么不在您的代码中这样做?

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