Вопрос по amazon-ec2 – Как проверить, работает ли приложение в экземпляре AWS EC2

12

Как узнать, на какой платформе работает мое приложение, экземпляр AWS EC2, экземпляр Azure Role и не облачная система? Теперь я делаю это так:

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   ответа
7

что ваша оригинальная идея довольно хороша, но нет необходимости делать веб-запрос. Просто попробуйте посмотреть, разрешается ли имя (в python):

def is_ec2():
    import socket
    try:
        socket.gethostbyname('instance-data.ec2.internal.')
        return True
    except socket.gaierror:
        return False
Error: User Rate Limit Exceededsocket.gethostbyname('instance-data).
Error: User Rate Limit Exceeded
2

вызов WebRequest.Create () медленный на вашем рабочем столе, поэтому вам действительно нужно проверить сетевой трафик (используяNetmon) чтобы на самом деле определить, что заняло много времени. Этот запрос открывает соединение, подключается к целевому серверу, загружает контент, а затем закрывает соединение, чтобы было полезно знать, где это время занято.

Также, если вы просто хотите узнать, работает ли какой-либо URL-адрес (в Azure, на EC2 или любом другом веб-сервере и работает нормально, вы можете просто запросить загрузку только заголовков, используя

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

Любой из вышеперечисленных методов будет быстрее, чтобы получить, где ваш сайт работает.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Jimmy
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Jimmy
Error: User Rate Limit Exceededstackoverflow.com/questions/10192327/webresponse-slow
11

емпляра.

ОтДокументация AWS:

To view all categories of instance metadata from within a running instance, use the following URI:

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

On a Linux instance, you can use a tool such as cURL, or use the GET command, for example:

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"
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededget_instance_metadata(timeout=0.5, num_retries=1)
2

/sys/hypervisor/uuid существует, и его первые три символа - «ec2». Мне нравится использовать это, потому что это не зависит от внешних серверов.

Похожие вопросы