15

如何检查我的应用程序运行的平台、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()”需要很长时间。所以我想知道我该如何处理它?请帮我!提前致谢。

4

4 回答 4

13

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

AWS 文档

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

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

在 Linux 实例上,您可以使用 cURL 等工具,也可以使用 GET 命令,例如:

PROMPT> GET http://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"
于 2013-07-12T20:53:14.980 回答
7

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

def is_ec2():
    import socket
    try:
        socket.gethostbyname('instance-data.ec2.internal.')
        return True
    except socket.gaierror:
        return False
于 2013-02-01T01:54:21.327 回答
2

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

此外,如果您只想知道是否有任何 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.

您也可以只使用 GET 一个范围的数据而不是完整的数据来加快调用:

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

上述任何一种方法都可以更快地找到您的网站正在运行的位置。

于 2012-06-06T22:45:45.547 回答
1

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

于 2018-04-17T20:11:01.797 回答