2012-06-06 4 views
11

Come posso verificare su quale piattaforma viene eseguita la mia app, l'istanza di AWS EC2, l'istanza del ruolo di Azure e il sistema non cloud? ora farlo in questo modo:Come verificare le esecuzioni dell'applicazione nell'istanza 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; 
    } 
} 

ma ho avuto un problema quando i miei apps corre nel sistema non-cloud, come il sistema locale di Windows. È diventato molto lento durante l'esecuzione del metodo isAWS(). il codice 'req.GetResponse()' richiede molto tempo. quindi voglio sapere come posso affrontarlo? mi aiuti per favore! Grazie in anticipo.

risposta

2

Come hai detto, la chiamata WebRequest.Create() è lenta sul desktop, quindi è davvero necessario controllare il traffico di rete (utilizzando Netmon) per determinare effettivamente ciò che è durato molto tempo. Questa richiesta, apre la connessione, si connette al server di destinazione, scarica il contenuto e quindi chiude la connessione, quindi è bene sapere dove è stata scattata questa volta.

anche se volete solo sapere se qualsiasi URL (su Azure, su EC2 o qualsiasi altro server web è vivo e lavorando bene si può solo chiedere di solo le intestazioni scaricare utilizzando

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. 

È inoltre possibile utilizzare GET solo una gamma di dati, invece di dati completi per accelerare chiamare:

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 

Qualsiasi del metodo di cui sopra sarà più veloce per arrivare dove il vostro sito è in esecuzione

+0

Grazie tuo post! È diventato più veloce quando cambio il metodo che hai fornito. – Jimmy

+0

Sono contento che abbia funzionato per te. grato se accetti i miei suggerimenti come risposta. Grazie!! – AvkashChauhan

+0

Grazie per il tuo post! È diventato più veloce quando ho cambiato il metodo che hai fornito. ma è ancora lento quando il mio sito non funziona. come al solito, il codice 'req.GetResponse()' richiede circa 3 secondi. quindi voglio sapere come ottenere più velocemente quando la richiesta riceve le risposte dal server? – Jimmy

6

i °. inchiostro la tua idea originale è abbastanza buona, ma non è necessario effettuare la richiesta web. Basta provare a vedere se si risolve nome (in python):

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

FYI: funziona solo se stai usando il risolutore di amazon interno. Se fai qualcosa come puntare il tuo resolver su 8.8.8.8, questo fallirà. Abbiamo avuto un errore DNS su Amazon (il loro server DNS era offline) e il test non è riuscito. –

11

Il modo migliore per farlo sarebbe quello di fare una richiesta per ottenere i metadati di istanza.

Dal AWS Documentation:

Per visualizzare tutte le categorie di esempio i metadati all'interno di un running esempio, utilizzare il seguente URI:

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

In un'istanza Linux, è possibile utilizzare uno strumento come cURL o utilizzare il comando GET , ad esempio:

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

Ecco un esempio utilizzando il wrapper 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

Mi piace questa soluzione, ma se non funziona su EC2, il timeout è incredibilmente lungo. – EmmEff

+5

ora puoi impostare un limite per i tentativi: '' get_instance_metadata (timeout = 0.5, num_retries = 1) '' –