Formation Introduction à JClouds. Formation AWSBoto 2

Preview:

Citation preview

Formation

Introduction à JClouds

Introduction à JClouds

Formation AWS Boto

2

Plan• Présentation & Installation• Concepts généraux• Zoom sur EC2 et S3• Alternatives

Formation AWS Boto

3

Présentation & Installation

Formation AWS Boto

4

Historique• Projet Apache depuis 2011• API Java & Clojure• API matures : ComputeService, BlobStore• Supporte :

• AWS• Eucalyptus• Google Storage• OpenStack• OpenNebula• Azure

Formation AWS Boto

5

Installer JClouds• Utilisation de Maven

Formation AWS Boto

6

Concepts Généraux

Formation AWS Boto

7

Principes de base• Module principal : « boto »

• Configuration• Logs• Méthodes de convenance connect_<service> pour obtenir

un objet Connection à un service AWS spécifique• Un module boto.<service> par service AWS (ex : boto.ec2, boto.sqs)

• Chaque module fournit une méthode connect_to_region()

Formation AWS Boto

8

Connections• On récupére un objet connection à un service pour une région donnée• C'est à travers cet objet qu'on manipulera notre service• Paramètres communs aux méthodes connect_<service>()

• aws_access_key• aws_secret_access_key• is_secure: force l'utilisation de HTTPS• region: objet boto.<service>.regioninfo.RegionInfo

initialisé avec le nom de la région• debug

Formation AWS Boto

9

Documentation en ligne

Formation AWS Boto

10

http://boto.readthedocs.org

EC2

Formation AWS Boto

11

Instance (1)• Un objet boto.ec2.instance.Instance représente une instance EC2• Quelques attributs utiles

• id : identifiant de l'instance• groups : groupe de sécurité (politique pare-feu)• State : état de l'instance• instance_type : type de l'instance• image_id : identifiant de l'AMI• public_dns_name : nom DNS publique de l'instance• private_dns_name : nom DNS privé de l'instance

Formation AWS Boto

12

Instance (2)• Opérations courantes

• start() démarrer l'instance• stop() mettre en pause l'instance

(instance EBS uniquement)• terminate() arrêter définitivement l'instance• reboot() redémarrer une instance en pause• add_tag()/remove_tag() ajouter/enlever un tag à

l'instance• update() mettre à jour les informations de

l'instance

Formation AWS Boto

13

Réservation• boto.ec2.instance.Reservation représente une

réservation EC2• Conteneur d'instances (attribut : instances)• Une méthode utile : stop_all()

Formation AWS Boto

14

Connexion à EC2import boto

import boto.ec2

conn = boto.connect_ec2()

# alternatives

# conn = boto.ec2.EC2Connection()

Formation AWS Boto

15

Lister les AMI disponibles# Lister les AMI SysFera

amis = conn.get_all_images(owners=

[443252058477])

# récupérer une AMI particulière

ami = conn.get_image(image_id='ami-2ea50247')

Formation AWS Boto

16

haikel
La méthode get_all_images() est bogué, il faut impérativement passer les owner idPour récupérer son ownerId, pas d'APIconn.get_all_security_groups()[0].owner_idu'443252058477'=> SysFera's owner id

Démarrer une instance EC2Reservation = conn.run_instances('ami-xxx',

key_name= key_name, security_groups=['ssh-group'], instance_type='m1.small', user_data=user_data)

instance = reservation.instances[0]

Formation AWSBoto

17

Connaître l'état d'une instance EC2# mettre à jour les informations

instance.update()

# afficher les informations

print instance.state

print instance.public_dns_name

print instance.launch_time

Formation AWS Boto

18

Terminer une instance EC2# récupérer la réservation

resa = conn.get_all_instances(filters={'tag:Name' : 'prod1'})[0]

# récupérer l'instance

instance = resa[0]

instance.terminate()

# on peut également tuer toutes les instances

# resa.terminate_all()

Formation AWS Boto

19

Créer un groupe de sécuritétry :

# on vérifie que le groupe n'existe pas

group = conn.get_all_security_groups('ssh-access')

except EC2ResponseError as e :

# on crée un groupe

group = conn.create_security_group('ssh-access', 'open ssh port')

Formation AWS Boto

20

Configurer un groupe de sécurité# ajouter une règle

group.authorize('tcp', 22, 22, '0.0.0.0/0')

group.authorize('tcp', 80, 80, '0.0.0.0/0')

# supprimer une règle

group.revoke('tcp', 80, 80, '0.0.0.0/0')

Formation AWS Boto

21

Allouer une EIPeip = conn.allocate_address()

conn.associate_address(instance.id, eip.public_ip)

# ou bien instance.use_ip(eip)

conn.disassociate_address(eip)

Formation AWS Boto

22

EBS# créer un volume de 2Go

vol = conn.create_volume(2, 'eu-west-1a',

snapshot=None)

# attacher le volume

conn.attach_volume(volume_id=vol.id, instance_id=instance.id, '/dev/sdb')

# créer un snapshot

conn.create_snapshot(vol.id)

Formation AWS Boto

23

haikel
Le param snapshot dans la création de volume est ici uniquement à titre indicatif (None est le param par défaut) pour la création de volume à partir de snapshot)

S3

Formation AWS Boto

24

Connexion à S3import boto

from boto.s3.connection import Location

from boto.s3.key import Key

conn = boto.connect_s3()

Formation AWS Boto

25

Créer un bucket# créer un bucket

bucket_EN = conn.create_bucket('thumbnails')

# créer un bucket dans la région eu-west-1

bucket_FR = conn.create_bucket('vignettes', location=Location.EU)

Formation AWS Boto

26

Lister les bucketrs = conn.get_all_buckets()

for bucket in rs :

print bucket.name

Formation AWS Boto

27

Stocker des données (1)# stocker une image à partir d'un fichier

k = Key(bucket_FR)

k.key = 'boto_vermelho.jpg'

k.set_content_from_filename('~/images/boto_vermelho.jpg')

# télécharger un objet dans un fichier

k.get_content_to_filename('foobar.jpg’)

Formation AWS Boto

28

Stocker des données (2)# stocker des données brutes

k.key = 'vermelho'

k.set_content_from_string('rose' ,

headers = {'Content-Type':'text/plain'})

# plus tard

k = bucket.get_key('vermelho')

content = k.get_content_as_string()

Formation AWS Boto

29

haikel
Le header content-type permet de configurer le bon type mime pour les téléchargements via HTTP

Lister le contenu d'un bucket# récupérer un bucket à partir de son nom

bucket = conn.lookup('toto')

keys = bucket.list()

# keys = bucket.get_all_keys()

for k in keys :

print '{0} (size : {1} ko)'.format(k.name, k.size)

# lister les clés préfixé par test/bidule

Keys = bucket.get_all_keys(prefix='test/bidule',delimiter='/')

Formation AWS Boto

30

Métadonnéesk.set_metadata('lieu', 'amazonie')

lieu = k.get_metadata('lieu')

Formation AWS Boto

31

Gestion des ACL# rendre public un bucket

b.make_public(recursive=True)

# rendre public un objet à partir de sa key

k.make_public()

k.generate_url(3600) # durée de vie : 1h

k.set_acl('public-read-write')

k.set_acl('private-read-write')

Formation AWS Boto

32

ELB

Formation AWS Boto

33

Connexion à ELBimport boto

from boto.ec2.elb import HealthCheck

conn = boto.connect_elb()

Formation AWS Boto

34

Définir un HealthCheck# un check toutes les 20s

# sur la ressource HTTP:8080/health

# 3 checks réussis => ressource active

# 5 checks échoués => ressource inactive

hc = HealthCheck(interval=20,

healthy_threshold=3,

unhealthy_threshold=5,

target='HTTP:8080/health')

Formation AWS Boto

35

Création d'un load balancerzones = ['us-east-1a', 'us-east-1b']

ports = [(80, 8080, 'http'), (443, 8443, 'https')]

lb = conn.create_load_balancer('lb1', zones, ports)

# associer notre HealthCheck à notre LB

lb.configure_health_check(hc)

# récupérer le nom DNS du LB

print lb.dns_name

Formation AWS Boto

36

Ajouter des instances à un LB# ajouter des instances

instances = ['i_xxxx', 'i_yyyy']

lb.register_instances(instances)

# les retirer

lb.deregister_instances(instances)

Formation AWS Boto

37

Manipuler les zones dans un LB# désactiver une zone

lb.disable_zone(['us-east-1a'])

# activer une zone

lb.enable_zone(['us-east-1b'])

Formation AWS Boto

38

Détruire un Load Balancerlb.delete()

Formation AWS Boto

39

SQS

Formation AWS Boto

40

Connexion à SQSimport boto

from boto import Message

conn = boto.connect_sqs()

Formation AWS Boto

41

Création d'une fileq = conn.create_queue('tasks')

# récupérer l'url d'une queue

print q.url

https://queue.amazonaws.com/443252058477/tasks

Formation AWS Boto

42

Récupérer une file# lister l'ensemble des files

rs = conn.get_all_queues()

for i in rs :

print i.name

q = conn.get_queue('tasks')

Formation AWS Boto

43

Envoi d'un messagemsg = message() # par défaut encodage base64

msg.set_body('hello world')

msg.attributes['hostname'] = socket.gethostname()

q.write(msg)

Formation AWS Boto

44

Consommer un message (1)# nombre de messages dans une queue

print q.count()

# récupérer un message

msg = q.read()

# récupérer plusieurs messages

msgs = q.get_all_messages(num_messages=20)

# afficher le contenu du message

print msg.get_body()

Formation AWS Boto

45

Consommer un message (2)# attention récupérer un message, ne veut pas dire => consommer !

print q.count()

# valider la consommation

msg.delete() # ou q.delete_message(msg)

Formation AWS Boto

46

#

Sauvegarder/Restaurer une file# dans un fichier

q.save_to_filename('tasks_backup', sep='\n')

q.load_from_filename('tasks_backup')

# dans S3 (sous le schéma <queue_id>/<message_id>)

q.save_to_s3(bucket_bak, prefix=None)

q.load_from_s3()

Formation AWS Boto

47

Détruire notre file# vider la file

q.clear()

# destruction

Conn.delete_queue(q)

Formation AWS Boto

48

SimpleDB

Formation AWS Boto

49

Connexion à SimpleDB

import boto

conn = boto.connect_sdb()

Formation AWS Boto

50

Création d'un domaine# on vérifie que le domaine n'existe pas

domain = conn.lookup('commandes')

if domain is None :

domain = conn.create_domain('commandes')

# lister les domaines

rs =conn.get_all_domains()

# autre façon de récupérer un domaine

domain = conn.get_domain('commandes')

Formation AWS Boto

51

Métadonnées associés à un domainemd = domain.domain_metadata()

# lister les attributs disponibles

dir(md)

# lister le nombre d'items dans le domaine

print md.item_count

Formation AWS Boto

52

Insérer un item# en un coup

domain.put_attributes('cmd1', {'id' : 1, 'nb' : 7})

# en plusieurs coups

item = domaine.new_item('cmd2')

item['id'] = 1

item.add_value('nb', 9)

item.save()

# en batch

domain.put_attributes({'cmd4' : {'id' : 1, 'nb' : 7}})

Formation AWS Boto

53

Récupérer un item (1)item = domain.get_item('cmd7')

# forcer une lecture vérouillée

item = domain.get_item('cmd7', consistent_read=True)

Formation AWS Boto

54

Récupérer un item (2)# possibilité d'utiliser « SQL »

rs = dom.select(select * from commandes where id="7"')

for i in rs :

print i

Formation AWS Boto

55

Sauvegarde XMLdoc = domain.to_xml()

Formation AWS Boto

56

Alternatives

Formation AWS Boto

57

Libcloud (1)• Bibliothèque Python• Couche d'abstraction entre les API des différents fournisseurs d'IaaS• Supporte

• Service d'instances virtuelles• Service de stockage• Service de load balancing• Service de DNS

Formation AWS Boto

58

Libcloud (2)• Plus de 26 fournisseurs supportés

• AWS, Rackspace, Eucalyptus, OpenStack, OpenNebula, CloudSigma, Google Storage, Vsphere, Gandi.net, etc...

Formation AWS Boto

59

https://libcloud.apache.org

Deltacloud (1)

Formation AWS Boto

60

Deltacloud (2)• Couche d'abstraction sous forme d'API REST• Développé en Ruby par Red Hat• Accessible directement par des requêtes et des bibliothèques clients (Ruby, Python, C, C++) et via Curl• Top Level Project Apache

Formation AWS Boto

61

Deltacloud (3)• Architecture flexible :

• Un proxy REST• 3 API en frontend : deltacloud, EC2 et CIMI• Des pilotes pour gérer différents fournisseurs

• Supporte environ 15 fournisseurs• AWS, Rackspace, OpenStack, OpenNebula, Eucalyptus, Azure

(stockage), vSphere etc.• Pilote « mock » pour tester ses applications !

Formation AWS Boto

62

Formation AWS Boto

63

Autres Langages• SDK officiel pour les langages PHP, Ruby, Java, .Net

https://aws.amazon.com/developertools

• En Ruby, l'excellent Fog :• Gère plusieurs fournisseurs• Supporte libvirt• Mode « mock » pour les tests

http://fog.io/

Formation AWS Boto

64

Bibliographie

Mise en pratique

Formation AWS Boto

65

Recommended