2012-06-06 15 views
11

Jak mogę sprawdzić, na której platformie działa moja aplikacja, instancja AWS EC2, instancja roli Azure i system inny niż chmura? teraz to zrobić tak:Jak sprawdzić uruchamianie aplikacji w instancji AWS EC2

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

ale mam jeden problem, gdy moje aplikacje uruchamia się w systemie non-Cloud, jak lokalnego systemu Windows. Robił bardzo powoli podczas wykonywania metody isAWS(). kod "req.GetResponse()" zajmuje dużo czasu. więc chcę wiedzieć, jak mogę sobie z tym poradzić? proszę pomóż mi! z góry dziękuję.

Odpowiedz

2

Jak już powiedziałeś, wywołanie WebRequest.Create() jest powolne na Twoim komputerze, więc naprawdę musisz sprawdzić ruch sieciowy (używając Netmon), aby określić, co zajęło dużo czasu. To żądanie, otwiera połączenie, łączy się z serwerem docelowym, pobiera zawartość, a następnie zamyka połączenie, więc dobrze jest wiedzieć, gdzie ten czas jest zajęty.

także jeśli po prostu chcesz wiedzieć, czy każdy adres URL (na Azure na EC2 lub innego serwera WWW jest na żywo i działa dobrze można po prostu poprosić o tylko nagłówki pobierania za pomocą

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. 

można również używać tylko dostać szereg danych zamiast pełnych danych w celu przyspieszenia zadzwonić:

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 

żadnej z powyższych metod będzie szybciej się dostać, gdzie witryna jest uruchomiona

+0

Dzięki Twój post! Zrobiło się szybciej, gdy zmienię podaną metodę. – Jimmy

+0

Cieszę się, że zadziałało dla Ciebie. wdzięczny, jeśli przyjmiesz moje sugestie jako odpowiedź. Dzięki Ci!! – AvkashChauhan

+0

Dzięki twojemu postowi! Zrobiło się szybciej, gdy zmieniłem podaną metodę. ale nadal powoli, gdy moja strona nie działa. jak zwykle, kod "req.GetResponse()" zajmuje około 3 sekund. więc chcę wiedzieć, jak uzyskać szybszy dostęp do żądania otrzymywania odpowiedzi z serwera? – Jimmy

6

I th. tusz twój oryginalny pomysł jest całkiem niezły, ale nie musisz wysyłać żądania sieci. Wystarczy spróbować, aby zobaczyć czy ustąpienia Nazwa (python):

def is_ec2(): 
    import socket 
    try: 
     socket.gethostbyname('instance-data.ec2.internal.') 
     return True 
    except socket.gaierror: 
     return False 
+4

FYI: działa to tylko wtedy, gdy używasz wewnętrznego resolvera amazon. Jeśli zrobisz coś takiego, jak wskażesz swój resolver na 8.8.8.8, to się nie powiedzie. Mieliśmy awarię DNS w Amazon (ich serwer dns był w trybie offline) i test się nie powiódł. –

11

lepszy sposób to zrobić byłoby, aby złożyć zamówienie, aby uzyskać metadane instancji.

Z AWS Documentation:

Aby wyświetlić wszystkie kategorie przykład metadanych z poziomu uruchomionego przykład użyć następującego URI:

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

Na przykład Linux, można użyć narzędzie takie jak cURL lub użyj polecenia GET , na przykład:

PROMPT> GET http://169.254.169.254/latest/meta-data/

Oto przykład przy użyciu otoki 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" 
+0

Podoba mi się to rozwiązanie, ale jeśli nie działa na EC2, limit czasu jest niesamowicie długi. – EmmEff

+5

możesz teraz ustawić limit ponownych prób: '' get_instance_metadata (timeout = 0.5, num_retries = 1) '' –

Powiązane problemy