2013-06-08 4 views
1

J'ai un script python qui fonctionne sur les machines aws, ainsi que sur d'autres machines. La fonctionnalité du script dépend de si oui ou non il est sur AWS.Détermine si la machine actuelle est sur aws en python

Existe-t-il un moyen de découvrir par programme si il s'exécute sur AWS ou non? (peut-être en utilisant boto?)

Répondre

2

Si vous voulez faire en utilisant strictement Boto, vous pourriez faire :

import boto.utils 
md = boto.utils.get_instance_metadata(timeout=.1, num_retries=0) 

le timeout spécifie le combien de temps le client HTTP attendra une réponse avant d'expirer. Le paramètre num_retries contrôle le nombre de fois que le client va réessayer la demande avant d'abandonner et de renvoyer et de vider le dictionnaire.

+0

Pour votre information, les anciennes versions de Boto (par exemple 'v2.2.2 python-boto' sur Ubuntu précise) ne prennent pas en charge la' paramètres timeout' et 'num_retries'. –

0

J'ai trouvé un moyen, en utilisant:

try: 
    instance_id_resp = requests.get('http://169.254.169.254/latest/meta-data/instance-id') 
    is_on_aws = True 
except requests.exceptions.ConnectionError as e: 
    is_on_awas = False 
0

J'ai essayé certains de ce qui précède, et quand pas fonctionnant sur Amazon j'ai eu des problèmes d'accès 169.254.169.254. Peut-être que cela a quelque chose à voir avec le fait que je cours depuis une géographie non américaine.

Dans tous les cas, voici un morceau de code qui a fonctionné pour moi:

def running_on_amazon(): 
    import urllib2 
    import socket 

    # I'm using curlmyip.com, but there are other websites that provide the same service 
    ip_finder_addr = "http://curlmyip.com" 
    f = urllib2.urlopen(ip_finder_addr) 
    my_ip = f.read(100).strip() 
    host_addr = socket.gethostbyaddr(my_ip) 

    my_public_name = host_addr[0] 
    amazon = (my_public_name.find("aws") >=0) 
    return amazon # returns a boolean value. 
Questions connexes