Amazon ec2 如何检查AWS EC2实例中的应用程序运行

Amazon ec2 如何检查AWS EC2实例中的应用程序运行,amazon-ec2,amazon-web-services,instance,Amazon Ec2,Amazon Web Services,Instance,如何检查我的应用程序运行的平台、AWS EC2实例、Azure角色实例和非云系统? 现在我这样做: if(isAzure()) { //run in Azure role instance } else if(isAWS()) { //run in AWS EC2 instance } else { //run in the non-cloud system } //checked whether it runs in AWS EC2 instance or not. bo

如何检查我的应用程序运行的平台、AWS EC2实例、Azure角色实例和非云系统? 现在我这样做:

if(isAzure())
{
    //run in Azure role instance
}
else if(isAWS())
{
   //run in AWS EC2 instance
}
else
{
   //run in the non-cloud system
}

//checked whether it runs in AWS EC2 instance or not.
bool isAWS()
{
  string url = "http://instance-data";
  try
  {
     WebRequest req = WebRequest.Create(url);
     req.GetResponse();
     return true;
  }
  catch
  {
     return false;
  }  
}

但是,当我的应用程序运行在非云系统(如本地windows系统)时,我有一个问题。执行isAWS()方法时速度非常慢。代码'req.GetResponse()'需要很长时间。所以我想知道我该怎么处理它?请帮帮我!提前感谢。

正如您所说,WebRequest.Create()调用在您的桌面上很慢,因此您确实需要检查网络流量(使用)以确定实际花费的时间。此请求打开连接,连接到目标服务器,下载内容,然后关闭连接,以便知道这段时间花在哪里

另外,如果您只想知道任何URL(在Azure、EC2或任何其他web服务器上)是否处于活动状态且工作正常,您可以使用

string URI = "http://www.microsoft.com";
HttpWebRequest  req = (HttpWebRequest)WebRequest.Create(URI);
req.Method = WebRequestMethods.Http.Head;
var response = req.GetResponse();
int TotalSize = Int32.Parse(response.Headers["Content-Length"]);
// Now you can parse the headers for 200 OK and know that it is working.
您还可以使用“仅获取一系列数据”而不是“完整数据”来加快调用:

HttpWebRequest myHttpWebReq =(HttpWebRequest)WebRequest.Create("http://www.contoso.com");
myHttpWebReq.AddRange(-200, ContentLength); // return first 0-200 bytes
//Now you can send the request and then parse date for headers for 200 OK

上述任何一种方法都可以更快地到达站点运行的位置。

我认为您最初的想法非常好,但无需提出web请求。只需尝试查看名称是否正确(在python中):


更好的方法是请求获取实例元数据

从:

从正在运行的数据库中查看所有类别的实例元数据 实例,请使用以下URI:

http://169.254.169.254/latest/meta-data/

在Linux实例上,您可以使用诸如cURL之类的工具,或者使用GET 命令,例如:

PROMPT>GEThttp://169.254.169.254/latest/meta-data/

下面是一个使用Python Boto包装器的示例:

from boto.utils import get_instance_metadata

m = get_instance_metadata()

if len(m.keys()) > 0:
    print "Running on EC2"

else:
    print "Not running on EC2"

在ec2 Ubuntu实例上,文件
/sys/hypervisor/uuid
存在,它的前三个字符是“ec2”。我喜欢使用它,因为它不依赖外部服务器。

谢谢你的帖子!当我更改你提供的方法时,它变得更快了。我很高兴它能为你工作。如果你接受我的建议作为答案,我将不胜感激。谢谢ks你的帖子!当我更改了你提供的方法时,它变得更快了。但是当我的站点不工作时,它仍然很慢。像往常一样,代码'req.GetResponse()'需要大约3秒的时间。所以我想知道当请求从服务器获得响应时,如何更快?“站点不工作”这是否意味着URL是伪造的,因为没有站点?在某些情况下,错误URL的响应会更长,因为请求网络可能会等待一点时间以获得响应,如果没有响应,这就是网络的设计方式。如果有即时响应,则呼叫将立即返回,否则等待检查是否可以获得数据,然后进行finally返回时没有回应。“站点不工作”这意味着URL不可用。因此我想知道是否有一些解决方案来处理此问题?仅供参考:这仅在您使用内部amazon解析程序时有效。如果您执行类似于将解析程序指向8.8.8.8的操作,这将失败。我们在amazon上遇到DNS故障(他们的dns服务器处于脱机状态),测试失败。使用amazon解析程序,该主机对我不可用。您必须删除域名,让解析程序附加其默认名称。因此,请使用
socket.gethostbyname('instance-data
)。我喜欢此解决方案,但如果不在EC2上运行,超时时间会非常长。现在可以设置重试次数限制:
get\u instance\u metadata(timeout=0.5,num\u retries=1)
这非常好。如果get\u instance\u metadata(timeout=0.5,num\u retries=1),我可能会将其更改为
:…
作为一个空字典将是错误的,它看起来既好又简单,但它在我的两个实例上不起作用(键入t3a.nano)
from boto.utils import get_instance_metadata

m = get_instance_metadata()

if len(m.keys()) > 0:
    print "Running on EC2"

else:
    print "Not running on EC2"