2012-06-06 5 views
11

¿Cómo puedo verificar qué plataforma ejecuta mi aplicación, instancia de AWS EC2, instancia de Azure Role y sistema que no es de nube? ahora hacerlo de esta manera:Cómo verificar la ejecución de aplicaciones en la instancia de 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; 
    } 
} 

pero tengo un problema cuando mis aplicaciones se ejecuta en el sistema no en la nube, como sistema de ventanas local. Se puso muy lento al ejecutar el método isAWS(). el código 'req.GetResponse()' lleva mucho tiempo. entonces quiero saber cómo puedo lidiar con eso? ¡por favor, ayúdame! gracias por adelantado.

Respuesta

2

Como ha dicho el WebRequest.Create() es lento en el escritorio para que realmente necesita para comprobar el tráfico de red (usando Netmon) para determinar realmente lo que llevó mucho tiempo. Esta solicitud abre la conexión, se conecta al servidor de destino, descarga el contenido y luego cierra la conexión, por lo que es bueno saber dónde se toma este tiempo.

Además, si lo que desea es saber si cualquier URL (en Azure, en EC2 o cualquier otro servidor web está vivo y funcionando bien sólo se puede solicitar a sólo los encabezados de descarga mediante el uso de

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. 

También puede usar GET sólo un rango de los datos en lugar de los datos completos para acelerar llamar:

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 

cualquiera de los métodos anteriormente será más rápido para llegar a donde su sitio está en marcha

+0

Gracias tu post! Se volvió más rápido cuando cambié el método que me proporcionó. – Jimmy

+0

Me alegro de que funcionó para ti. agradecido si aceptas mis sugerencias como respuesta. ¡¡Gracias!! – AvkashChauhan

+0

¡Gracias por tu publicación! Se volvió más rápido cuando cambié el método que me proporcionó. pero aún lentamente cuando mi sitio no funciona. como de costumbre, el código 'req.GetResponse()' toma aproximadamente 3 segundos de tiempo. entonces, ¿quiero saber cómo obtener más rápido cuando la solicitud recibe respuestas del servidor? – Jimmy

6

me XX. entinta tu idea original es bastante buena, pero no es necesario hacer la solicitud web. Simplemente tratar de ver si se resuelve el nombre (en Python):

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

FYI: esto solo funciona si está utilizando la resolución de Amazon interna. Si haces algo así como apuntar tu resolver a 8.8.8.8, esto fallará. Tuvimos una falla de DNS en Amazon (su servidor DNS estaba fuera de línea) y la prueba falló. –

11

La mejor manera de hacer esto sería hacer una solicitud para obtener los metadatos de instancia.

Desde el AWS Documentation:

Para ver todas las categorías de metadatos de instancia dentro de un instancia en ejecución, utilice el siguiente URI:

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

En una instancia de Linux, puede utilizar una herramienta como cURL, o use el comando GET , por ejemplo:

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

Aquí hay un ejemplo usando el envoltorio de 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

Me gusta esta solución, pero si no se ejecuta en EC2, el tiempo de espera es increíblemente largo. – EmmEff

+5

ahora puede establecer un límite de reintentos: '' get_instance_metadata (timeout = 0.5, num_retries = 1) '' –

Cuestiones relacionadas