2015-04-11 3 views
3

Я пытаюсь настроить регистратор сообщений python для отправки сообщений об ошибках при регистрации ошибки, если экземпляр имеет набор тегов. Затем я быстро столкнулся с проблемой локальных компьютеров-разработчиков, которые не находятся на aws. Есть ли простой и быстрый способ проверить, выполняется ли сценарий на aws?Проверьте, работает ли скрипт python в экземпляре aws

я загружал данные экземпляра с:

import boto.utils 
from boto.ec2.connection import EC2Connection 
metadata = boto.utils.get_instance_metadata() 
conn = EC2Connection() 
instance = conn.get_only_instances(instance_ids=metadata['instance-id'])[0] 

Я могу, конечно, использовать тайм-аут на get_instance_metadata, но есть то напряжение между уже давно, чтобы разработчики ждать против возможности не посылать сообщение об ошибке электронная почта в производстве.

Может кто-нибудь подумать о хорошем решении?

ответ

1

Я не думаю, что это действительно проблема с boto. EC2 (и boto в свою очередь) не заботятся или не знают ничего о том, какие скрипты вы используете на своих серверах.

Если ваш сценарий имеет определенную подпись - например, прослушивание на порту - это лучший способ проверить, но застенчивый, вы можете просто искать свою подпись в ОС - ее процесс.

Используйте подпроцесс модуля и ваш preferred bash magic to check if it's running:

command = ["ssh", "{user}@{server}", "pgrep", "-fl", "{scriptname}"] 
try: 
    is_running = bool(subprocess.check_output(command)) 
except subprocess.CalledProcessError: 
    log.exception("Checking for script failed") 
    is_running = False 
+0

Да, это не проблема. Мне нравится Натан Бинкерт ответить на этот пост. http://stackoverflow.com/questions/10907418/how-to-check-application-runs-in-aws-ec2-instance – TristanMatthews

+0

Ооо, теперь я задаю вам вопрос. Почему бы вам просто не настроить компьютеры для установки переменной среды и проверить эту переменную среды в сценарии? Кажется, проще. – jwilner

+0

Мы говорили об этом, но я предпочел бы избежать решения, которое требует сделать что-то подобное на всех dev или всех производственных машинах. – TristanMatthews

2

AWS экземпляры имеют метаданные, так что вы могли бы сделать вызов службы метаданных и получить ответ, если ответ действительно, вы @ AWS, иначе вы не будете.

, например:

import urllib2 
meta = 'http://169.254.169.254/latest/meta-data/ami-id' 
req = urllib2.Request(meta) 
try: 
    response = urllib2.urlopen(req).read() 
    if 'ami' in response: 
     _msg = 'I am in AWS running on {}'.format(response) 
    else: 
     _msg = 'I am in dev - no AWS AMI' 
except Exception as nometa: 
    _msg = 'no metadata, not in AWS' 

print _msg 

Это просто удар - есть, вероятно, лучше чеки, но это один получит вам почувствовать это, и вы можете улучшить его, как вы считаете нужным. Если вы используете OpenStack или другую облачную службу локально, вы, конечно, получите ответ на метаданные, поэтому вам придется соответствующим образом скорректировать ваш чек ...

(вы также можете сделать это с помощью облачных объектов, если вы используете какой-то стартовый инструмент или менеджер, например, шеф-повар, кукольный, доморощенный и т. д. Отбросьте файл/ec2 в файловой системе, если он находится в AWS, или еще лучше, если локальное падение a/DEV на коробке)

Смежные вопросы