如何检查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"完成时,映像才真正可用。
关于运行状态,我同意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服务启动延迟等了。