2012-06-06 41 views
11

如何檢查我的應用程序運行於哪個平臺,AWS EC2實例,Azure角色實例和非雲系統? 現在我是這樣做的:如何檢查在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; 
    } 
} 

,但我有一個問題,當我的應用程序在非雲系統運行,像本地的Windows系統。執行isAWS()方法時速度非常緩慢。代碼'req.GetResponse()'需要很長時間。所以我想知道我該如何處理它?請幫幫我!提前致謝。

回答

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. 

您也可以工作正常,你可以請求僅下載標題使用得到的只是一個範圍內的數據,而不是全面的數據,以加快撥打:

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 

任何上述方法會更快得到您的網站運行

+0

感謝您的文章!當我改變你提供的方法時,它變得更快。 – Jimmy

+0

我很高興它爲你工作。感謝您接受我的建議作爲答案。謝謝!! – AvkashChauhan

+0

謝謝你的文章!當我改變你提供的方法時,它變得更快。但是當我的網站不工作時,它仍然很慢。像往常一樣,代碼'req.GetResponse()'大約需要3秒的時間。所以我想知道當請求從服務器獲取響應時如何加快速度? – Jimmy

6

我日。墨水您的原創想法是相當不錯的,但沒有必要提出網絡請求。只需嘗試查看名稱是否解析(在python中):

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

僅供參考:這隻適用於使用內部的亞馬遜解析器的情況。如果你做了類似於將你的解析器指向8.8.8.8的東西,這將失敗。我們在亞馬遜(他們的DNS服務器脫機)出現DNS故障,測試失敗。 –

11

更好的方法是創建一個獲取實例元數據的請求。

AWS Documentation

從運行的 實例中查看實例元數據的所有類別,請使用以下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" 
+0

我喜歡這個解決方案,但如果不在EC2上運行,超時時間非常長。 – EmmEff

+5

你現在可以對重試設置一個限制:''get_instance_metadata(timeout = 0.5,num_retries = 1)'' –

相關問題