Как проверить выполнение приложений в экземпляре AWS EC2

Как проверить, на какой платформе запускается мое приложение, экземпляр 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. Это было очень медленно при выполнении метода isAWS(). код 'req.GetResponse()' занимает много времени. поэтому я хочу знать, как я могу справиться с этим? пожалуйста помогите! спасибо заранее.

Ответ 1

Как вы сказали, вызов WebRequest.Create() медленный на вашем рабочем столе, поэтому вам действительно нужно проверить сетевой трафик (используя Netmon) чтобы фактически определить, что заняло много времени. Этот запрос открывает соединение, подключается к целевому серверу, загружает контент и затем закрывает соединение, поэтому хорошо знать, где это время принято.

Также, если вы просто хотите узнать, доступен ли какой-либо URL (на Azure, на EC2 или любом другом веб-сервере, в режиме реального времени и работает нормально, вы можете просто запросить загрузку заголовков с помощью

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

Любой из вышеперечисленных методов будет быстрее выполнять работу вашего сайта.

Ответ 2

Лучший способ сделать это - сделать запрос на получение метаданных экземпляра.

Из Документация AWS:

Чтобы просмотреть все категории метаданных экземпляра из работающего экземпляр, используйте следующий 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"

Ответ 3

Я думаю, что твоя оригинальная идея очень хорошая, но не нужно делать веб-запрос. Просто попробуйте выяснить, разрешено ли имя (в python):

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