Я хотел бы запустить некоторые сценарии на хостах, которые являются экземплярами EC2, но я не знаю, как убедиться, что хост действительно является экземпляром EC2.
Я сделал несколько тестов, но этого недостаточно:
- Проверьте, доступен ли двоичный файл ec2_userdata (но это не всегда будет так)
- Проверьте наличие " http://169.254.169.254/latest/meta-data " (но будет ли это всегда так? И что это за "магический IP"?)
amazon-ec2
Kelindil
источник
источник
Ответы:
На самом деле, существует очень простой способ определить, является ли хост экземпляром EC2: проверить обратный поиск вашего публичного IP-адреса. Обороты EC2 довольно трудно пропустить.
Кроме того, если вы не изменили его, имя хоста должно быть вашим обратным, что облегчит его обнаружение.
Вы также можете использовать «магический IP», о котором вы говорили, поскольку это действительно стандартный способ получения тегов экземпляра EC2, однако, если вы не находитесь в сети EC2, вам придется подождать тайм-аут, который обычно не желательно ...
Если этих методов недостаточно, просто сделайте whois своего IP-адреса и проверьте, находитесь ли вы внутри IP-блока Amazon EC2.
РЕДАКТИРОВАТЬ: Вы можете использовать этот маленький бит оболочки:
Осторожно, хотя [[это башизм. Вы также можете использовать Python или Perl uniline, YMMV.
источник
hostname -d
возвращаетсяeu-west-1.compute.internal
Изменен ответ Ханнеса, чтобы избежать сообщений об ошибках и включить пример использования в скрипт:
Это не работает в экземплярах Windows. Преимущество перед скручиванием заключается в том, что он близок к мгновенному как для EC2, так и для не EC2.
источник
ec2
- ложное срабатывание. Это маловероятно (шанс 1 на 256) и только в том случае, если вы используете гипервизор, который заполняет этот файл. Вот почему в приведенной выше документации написано «вы, вероятно, смотрите на экземпляр EC2».Сначала я почувствовал необходимость опубликовать новый ответ из-за следующих тонких проблем с существующими ответами и после получения вопроса о моем комментарии к ответу @ qwertzguy . Вот проблемы с текущими ответами:
hostname -d
, которое используется для внутреннего DNS, а не что-либо с "amazonaws.com" в нем.)instance-data.ec2.internal
DNS поиск не может работать. На экземпляре Ubuntu EC2 VPC, на котором я только что тестировал, я вижу:$ curl http://instance-data.ec2.internal curl: (6) Could not resolve host: instance-data.ec2.internal
что может привести к ложному выводу кода, полагающегося на этот метод, что он не на EC2!dmidecode
от @tamale может работать, но полагается на вас.) , Имеющийdmidecode
доступны на вашем экземпляре и б.) , Имеющих корень илиsudo
беспарольный способность из вашего кода.bios_version
оф1.0
. Этот файл вообще не документирован в документации Amazon , поэтому я бы не стал полагаться на него.whois
на результат проблематична на нескольких уровнях. Обратите внимание, что URL, предложенный в этом ответе, - это страница 404 прямо сейчас! Даже если вы найдете стороннюю службу, которая работает, она будет сравнительно очень медленной (по сравнению с локальной проверкой файла) и, возможно , столкнется с проблемами ограничения скорости или сетевыми проблемами, или, возможно, ваш экземпляр EC2 даже не имеет внешний доступ к сети.-m
или--max-time
в curl, чтобы избежать его зависания в течение очень долгого времени, особенно в случае экземпляра, не относящегося к EC2, где этот адрес может ни к чему не приводить и зависать (как в ответе @ algal ).Кроме того, я не вижу, чтобы кто-либо упоминал о задокументированном запасном варианте проверки (возможного) файла Amazon
/sys/devices/virtual/dmi/id/product_uuid
.Кто знал, что определить, работаете ли вы на EC2, может быть так сложно ?! Хорошо, теперь, когда у нас есть (большинство) проблем с перечисленными подходами, вот предложенный фрагмент кода bash, чтобы проверить, работаете ли вы на EC2. Я думаю, что это должно работать в основном на любых экземплярах Linux, экземпляры Windows - это упражнение для читателя.
Очевидно, вы могли бы расширить это с помощью еще большего количества резервных проверок и включить паранойю по поводу обработки, например, ложного срабатывания
/sys/hypervisor/uuid
при случайном запуске с «ec2» и так далее. Но это достаточно хорошее решение для иллюстративных целей и, вероятно, почти для всех непатологических вариантов использования.[†] Получил это объяснение от поддержки AWS по поводу изменений для экземпляров c5 / m5:
источник
elif
говорится в комментарии над этим блоком, и поэтому вelif
тесте используется-r
оператор теста, который проверяет, существует ли файл и есть ли у вас разрешения на чтение для этого файла.Найдите метаданные по внутреннему доменному имени EC2 вместо IP-адреса, которое вернет быстрый сбой DNS, если вы не используете EC2, и позволит избежать конфликтов IP-адресов или проблем маршрутизации:
На некоторых дистрибутивах, очень базовых системах или на ранних стадиях установки, curl недоступен. Вместо этого используйте wget :
источник
-bash: !": event not found
.echo
Вместо этого используйте одинарные кавычки .Если цель состоит в том, чтобы определить, является ли это экземпляром EC2 ИЛИ другим типом облачного экземпляра, таким как google, то он
dmidecode
работает очень хорошо, и не требуется никаких сетей. Мне нравится это против некоторых других подходов, потому что путь метаданных url различен для EC2 и GCE.источник
1.0
- без упоминанияamazon
.Имена хостов могут измениться, запустите whois против вашего публичного IP:
или нажмите URL-адрес метаданных AWS
источник
Это также хорошо работает для хостов Linux в ec2 и не требует сети и каких-либо связанных таймаутов:
grep -q amazon /sys/devices/virtual/dmi/id/bios_version
Это работает, потому что Amazon определяет эту запись следующим образом:
$ cat /sys/devices/virtual/dmi/id/bios_version 4.2.amazon
источник
1.0
. Нет упоминания оamazon
.но я не знаю, насколько это переносимо между дистрибутивами.
источник
Быстрый ответ:
Я использовал один из ответов, опубликованных здесь, более года, но он не работает с новыми типами экземпляров 'c5' (сейчас я работаю над обновлением с 'c4').
Мне нравится это решение, потому что оно вряд ли сломается в будущем.
На старых типах экземпляров и на более новых типах этот файл присутствует и начинается с 'EC2'. Я проверил Ubuntu, работающий на VirtualBox (который мне также нужно поддерживать), и он содержит строку «VirtualBox».
Как отмечал предыдущий автор (но это было легко пропустить) - есть документация Amazon о том, как это сделать, - в том числе и мой ответ.
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_instances.html
источник
Возможно, вы можете использовать «facter»:
«Facter - это кроссплатформенная библиотека для извлечения простых фактов об операционной системе, таких как операционная система, дистрибутив Linux или MAC-адрес».
http://www.puppetlabs.com/puppet/related-projects/facter/
Например, если мы посмотрим на факт ec2 (facter-1.6.12 / lib / facter / ec2.rb):
источник
Если у вас установлен curl, эта команда вернет 0, если вы работаете в EC2, и ненулевое, если вы не:
Он пытается получить метаданные EC2, объявляющие AMI-ID. Если это не удалось через 3 секунды, предполагается, что он не работает в EC2.
источник
Немного опоздал на эту вечеринку, однако я наткнулся на этот пост и нашел документацию по AWS:
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_instances.html
Это, конечно, требует сетевых издержек, хотя вы можете установить время ожидания curl следующим образом:
Это устанавливает время ожидания 5 с.
источник