15

アプリが実行されているプラ​​ットフォーム、AWS EC2 インスタンス、Azure ロール インスタンス、および非クラウド システムを確認するにはどうすればよいですか? 今、私は次のようにします:

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 システムなど、クラウド以外のシステムでアプリを実行すると、1 つの問題が発生します。isAWS() メソッドの実行中に非常に遅くなりました。コード「req.GetResponse()」には時間がかかります。だから私はそれに対処する方法を知りたいですか?私を助けてください!前もって感謝します。

4

4 に答える 4

7

あなたのオリジナルのアイデアはかなり良いと思いますが、Web リクエストを行う必要はありません。名前が解決されるかどうかを確認してください(Pythonで):

def is_ec2():
    import socket
    try:
        socket.gethostbyname('instance-data.ec2.internal.')
        return True
    except socket.gaierror:
        return False
于 2013-02-01T01:54:21.327 に答える
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.

完全なデータの代わりにデータの範囲のみを 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

上記の方法のいずれかを使用すると、サイトが実行されている場所をすばやく取得できます.

于 2012-06-06T22:45:45.547 に答える
1

ec2 Ubuntu インスタンスでは、ファイル/sys/hypervisor/uuidが存在し、その最初の 3 文字は「ec2」です。外部サーバーに依存しないため、これを使用するのが好きです。

于 2018-04-17T20:11:01.797 に答える