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

本文关键字:是否 实例 真的 AWS 何检查 检查 | 更新日期: 2023-09-27 18:09:57

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

RunInstancesResponse launchResponse = ec2Client.RunInstances(launchRequest);

然后我请求它的状态:

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

当状态是16/运行时,我试图连接到这个实例,但它失败了。稍后就可以连接了。在AWS控制台中,当映像的状态为"running"时,我看到"Status Checks"开始运行,我认为当"Status Checks"完成时,映像才真正可用。

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

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

查看状态检查,您需要使用不同的API:

DescribeInstanceStatus:

  • 请求:DescribeInstanceStatusRequest

  • 反应:DescribeInstanceStatusResponse

    • instancatus对象:instancatus

简单的例子:

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
    }
}

其他一些想法:

  • 查看从实例用户数据发布消息
  • 轮询实例上的端点,直到它可用为止。如果这个实例专门托管web服务,这是一种更好的方法,可以使用ELB自动化。

同意Anthony的观点-不要依赖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服务启动延迟等了。