Upload
simonette-brunel
View
117
Download
2
Tags:
Embed Size (px)
Citation preview
Formation
Introduction au AWS SDK Java
Introduction au AWS SDK Java
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• API Java (utilisable avec Groovy)• Intégration avec Eclipse• Supporte les services suivants :
• EC2 (auto-scaling, ELB, CloudWatch)• S3, Glacier, Datapipeline, EMR• CloudFront, CloudSearch• RDS, DynamoDB, SimpleDB• SQS, SNS, SES• Route53, elasticBeanstalk
Formation AWS Boto
5
Installer AWS SDK for Java• SDK Eclipse: ajouter le channel AWS http://aws.amazon.com/eclipse• AWS SDK for Java : http://aws.amazon.com/fr/sdkforjava/
Formation AWS Boto
6
Concepts Généraux
Formation AWS Boto
7
Principes de base• Paquetage principal : «com.amazonaws»
• Authentification « com.amazonaws.auth »• Services « com.amazonaws.services.xxx »• Chaque connexion à un service Amazon est représenté par une interface « AmazonXXX » (ie : AmazonEC2)
• « AmazonXXXClient » : interface synchrone• « AmazonXXXClientAsync » : interface asynchrone, retourne
des futures
Formation AWS Boto
8
Credentials• Interface « com.amazonaws.auth.AWSCredentials »• Implémentations :
• « BasicAWSCredentials(String accessKey, String secretKey) »
• « PropertiesCredentials(File file) »
« PropertiesCredentials(InputStream stream) »[EDF - Évolution
• Exemple de fichier properties :
Formation AWS Boto
9
accessKey=XXXXsecretKey=YYYY
Credentials Providers• Interface « com.amazonaws.auth.AWSCredentialsProvider »• Implémentations :
• « AWSCredentialsProviderChain(AWSCredentialsProvider ...credentialsProviders) »
• « ClasspathPropertiesFileCredentialsProvider »• « SystemPropertiesCredentialsProvider » : vérifie les propriétés java « aws.accessKeyId » et « aws.secretKey »
Formation AWS Boto
10
Client• On récupére un objet « <service>Client » à un service pour une région donnée• C'est à travers cet objet qu'on manipulera notre service• Paramètres communs aux constructeurs
• AWSCredentials ou AWSCredentialsProvider• ClientConfiguration : permet de configurer différents aspects du client REST (proxy, retries, timeout,protocoles -HTTP/HTTPS-)
Formation AWS Boto
11
Requests• Paquetage « com.amazonaws.<service>.model »• Les objets « request » représente une requêtes HTTP• C'est à travers cet objet qu'on fournira les paramètres de notre requêtes• Ceux-ci sont fourni à une méthode du client pour soumission à AWS
Formation AWS Boto
12
Model• Paquetage « com.amazonaws.<service>.model »• Contient les représentations des différents concepts : Instance, Bucket, SecurityGroup, etc.
Formation AWS Boto
13
Region• Paquetage « com.amazonaws.regions »• Enum « regions.Region » listant les différentes régions• Classe « regions.Region »/ « regions.RegionUtils »
• Permet de lister les régions• Obtenir l'objet région à partir d'une chaine ID• Lister les régions supportant un service AWS donné• Récupérer l'endpoint d'un service• Créer un client pour un service
Formation AWS Boto
14
Documentation en ligne
Formation AWS Boto
15
http://aws.amazon.com/fr/sdkforjava/
EC2
Formation AWS Boto
16
Connexion à EC2AWSCredentialsProvider provider = new ClasspathPropertiesFileCredentialsProvider() ;
AmazonEC2 ec2 = new AmazonEC2Client(provider) ;
# connexion à une autre région
Region usWest2 = new Region.getRegion(Regions.US_WEST_2) ;
ec2.setRegion(usWest2) ;
Formation AWS Boto
17
Lister les AMI disponibles# Lister les AMI SysFera
DescribeImagesRequest request = new DescribeImagesRequest() ;
Request.setOwners(Arrays.asList('443252058477')) ;
DescribeImagesResults res = ec2.describeImages(request) ;
List<Images> images = res.getImages() ;
# récupérer une AMI particulière
Request.setImageIds(Arrays.asList('ami-2ea50247') ;
Formation AWS Boto
18
Démarrer une instance EC2RunInstancesRequest request = new RunInstancesRequest(ami, 1, 1) ;
RunInstancesResult res = ec2.runInstances(request) ;
Reservation reservation= res.getReservation() ;
List<Instance> instances = reservation.getInstances() ;
Formation AWSBoto
19
Connaître l'état d'une instance EC2
# récupérer les informations
InstanceState state = instance.getState() ;
String dns = instance.getPublicDnsName() ;
String ip = instance.getPublicIpAddress() ;
Date launchDate = instance.getLaunchTime() ;
Formation AWS Boto
20
Terminer une instance EC2# récupérer la réservation
DescribeInstancesRequest request = new DescribeInstancesRequest() ;
Filter filter = new Filter('tag:name', Arrays.asList('prod1')) ;
request.setFilters(Arrays.asList(filter)) ;
DescribeInstancesResult res = ec2.describeInstances(request) ;
List<Reservation> reservations = result.getReservations() ;
Reservation resa = reservations[0] ;
# récupérer l'instance
instance = resa[0]
instance.terminate()
# on peut également tuer toutes les instances
# resa.terminate_all()
Formation AWS Boto
21
Terminer une instance EC2# récupérer l'instance
List<Instance> instances = reservation.getInstances() ;
List<String> ids = new List<String>() ;
for(Instance i : instances) {
ids.add(i.getInstanceId());
}
TerminateInstancesRequest request = new TerminateInstancesRequest() ;
request.setImageIds(ids) ;
Ec2.terminateInstances(request) ;
Formation AWS Boto
22
Créer un groupe de sécuritéCreateSecurityGroupRequest request = new CreateSecurityGroupRequest('ssh-access', 'open ssh port') ;
ec2.createSecurityGroup(request) ;
Formation AWS Boto
23
Configurer un groupe de sécurité# ajouter une règle
IpPermission ssh = new IpPermission();
ssh.withFromPort(22).withToPort(22).withIpRanges('0.0.0.0/0');
IpPermission http = new IpPermission();
http.withFromPort(22).withToPort(22).withIpRanges('0.0.0.0/0');
List<IpPermission> perms = Arrays.asList(ssh, http) ;
AuthorizeSecurityGroupIngressRequest request = new authorizeSecurityGroupIngressRequest('ssh-access', perms);
Formation AWS Boto
24
Configurer un groupe de sécurité# supprimer une règle
RevokeSecurityGroupIngressRequest request = new RevokeSecurityGroupIngressRequest('ssh-access', perms);
Formation AWS Boto
25
Allouer une EIPAllocateAddressRequest request = new AllocateAddressRequest();
AllocateAddressResult res = ec2.allocateAddress(request);
String eip = res.getPublicIp();
# associer l'ip à une machine
AssociateAddressRequest request
conn.associate_address(instance.id, eip.public_ip)
# ou bien instance.use_ip(eip)
conn.disassociate_address(eip)
Formation AWS Boto
26
Associer une EIPAssociateAddressRequest request = new AssociateAddressRequest(id, eip);
ec2.associateAddress(request);
DisassociateAddressRequest request = new DisassociateAddressRequest(eip);
ec2.disassociateAddress(request);
Formation AWS Boto
27
EBS# créer un volume de 2Go
CreateVolumeRequest request = new CreateVolumeRequest(2, 'eu-west-1a');
CreateVolumeResult res = ec2.createVolume(request);
Volume vol = res.getVolume();
# attacher le volume
AttachVolumeRequest request = new AttachVolumeRequest(volId, instanceId, '/dev/sdb');
ec2.attachVolume(request);
Formation AWS Boto
28
EBS# créer un volume de 2Go
CreateSnapshotRequest request = new CreateSnapshotRequest(volId, 'description');
CreateSnapshotResult res = ec2.createSnapshot(request);
Snapshot snap = res.getSnapshot();
Formation AWS Boto
29
S3
Formation AWS Boto
30
Connexion à S3AmazonS3 s3 = new AmazonS3Client(new ClasspathPropertiesFileCredentialsProvider());
Formation AWS Boto
31
Créer un bucket# créer un bucket
CreateBucketRequest request = new CreateBucketRequest(bucket);
Bucket b = s3.createBucket(request);
Formation AWS Boto
32
Lister les bucketsListBucketsRequest request = new ListBucketsRequest();
List<Bucket> buckets = s3.listBuckets(request);
for (Bucket b: buckets) {
String s = String.format("====\n" +
"name: %s\n" +
"Date: %s\n",
b.getName(),
b.getCreationDate());
System.out.println(s);
}
Formation AWS Boto
33
Stocker des données (1)# stocker une image à partir d'un fichier
PutObjectRequest request = new PutObjectRequest(bucket_name, 'boto', new File('boto_vermelho.jpg'));
s3.putObject(request);
Formation AWS Boto
34
Stocker des données (2)# télécharger un objet dans un fichier
GetObjectrequest request = new GetObjectRequest(bucket_name, 'boto');
S3Object res = s3.getObject(request);
S3ObjectInputStream stream = res.getObjectContent();
IOUtils.copy(stream, new FileOutputStream("test.jpg"));
Formation AWS Boto
35
Lister le contenu d'un bucketListObjectRequest request = new ListObjectRequest().withBucketName('toto');
ObjectListing res = S3.listObject(request);
List<S3ObjectSummary> summaries = res.getObjectSummaries();
Formation AWS Boto
36
ELB
Formation AWS Boto
37
Connexion à ELBAmazonElasticLoadBalancing elb = new AmazonElasticloadBalancing(provider);
Formation AWS Boto
38
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
HealthCheck hc = new HealthCheck('HTTP:8080/health',
20, 20, 5, 3);
Formation AWS Boto
39
Création d'un load balancerList<String> zones = Arrays.asList('us-east-1a', 'us-east-1b');
Listener http = new Listener('http', 80, 8080);
Listener https = new Listener('https', 443, 8443);
List<Listener> listeners = Arrays.asList(http, https);
CreateLoadBalancerRequest request = new CreateLoadBalancerRequest('lb1', listeners, zones) ;
CreateLoadBalancerResult res = elb.createLoadBalancer(request);
Formation AWS Boto
40
Création d'un load balancer# récupérer le nom DNS du LB
String dns = res.getDNSName() ;
# configurer le healthCheck
ConfigureHealthCheckRequest request = new ConfigureHealthCheckRequest('lb1', hc);
elb.configureHealthCheck(request)
Formation AWS Boto
41
Ajouter des instances à un LB# ajouter des instances
List<Instances> instances = Arrays.asList(new Instance('i-xxx'), new Instance('i-yyy'));
RegisterInstancesWithLoadBalancerRequest request = new RegisterInstancesWithLoadBalancerRequest('lb1', instances);
Elb.registerInstancesWithLoadBalancer(request);
Formation AWS Boto
42
Retirer des instances à un LB# retirer des instances
DeregisterInstancesFromLoadBalancerRequest request = new DeregisterInstancesFromLoadBalancerRequest('lb1', instances);
elb.deregisterInstancesFromLoadBalancer(request);
Formation AWS Boto
43
Manipuler les zones dans un LB# désactiver une zone
DisableAvailabilityZonesForLoadBalancerRequest request = new DisableAvailabilityZonesForLoadBalancerRequest('lb1',Arrays.asList('us-east-1a'));
elb.disableAvailabilityZonesForLoadBalancer(request);
# activer une zone
EnableAvailabilityZonesForLoadBalancerRequest request = new EnableAvailabilityZonesForLoadBalancerRequest('lb1',Arrays.asList('us-east-1a'));
elb.enableAvailabilityZonesForLoadBalancer(request) ;
Formation AWS Boto
44
Détruire un Load BalancerDeleteLoadBalancerRequest request = new DeleteLoadBalancerRequest('lb1');
elb.deleteLoadBalancer(request);
Formation AWS Boto
45
SQS
Formation AWS Boto
46
Connexion à SQSAmazonSQS sqs = new AmazonSQSClient(provider);
Formation AWS Boto
47
Création d'une fileCreateQueueRequest request = new CreateQueueRequest('tasks');
CreateQueueResult res = elb.createQueue(request);
# récupérer l'url d'une queue
System.out.println(res.getQueueUrl());
https://queue.amazonaws.com/443252058477/tasks
Formation AWS Boto
48
Récupérer une file# lister l'ensemble des files
ListQueuesRequest request = new ListQueuesRequest();
ListQueuesResult res = sqs.listQueues(request);
List<String> qUrls = res.getQueuesUrls();
Formation AWS Boto
49
Envoi d'un messageString message = 'xxxxx';
SendMessageRequest request = new SendMessageRequest(qUrls, message);
sqs.sendMessage(request);
Formation AWS Boto
50
Consommer un message (1)# nombre de messages dans une queue
GetQueueAttributeRequest = new GetQueueAttributeRequest(qUrls).withAttributesName('ApproximateNumberOfMessages');
GetQueueAttributeResult res = sqs.getQueueAttribute(request);
map<String, String> attrs = res.getAttributes();
Attrs['ApproximateNumberOfMessages'] ;
# 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
51
Consommer un message (3)# récupérer un message
ReceiveMessageRequest request = new ReceiveMessageRequest(qUrls).withMaxNumberOfMessages(20);
ReceiveMessageResult res = sqs.receiveMessage(request);
List<Messages> messages = res.getMessages();
# afficher le contenu du message
System.out.println(messages.get(0).getBody());
Formation AWS Boto
52
Consommer un message (3)# attention récupérer un message, ne veut pas dire => consommer !
# valider la consommation
DeleteMessageRequest request = new DeleteMessageRequest(qUrls, message.getReceiptHandle());
Formation AWS Boto
53
Détruire notre file# destruction
DeleteQueueRequest request = new DeleteQueueRequest(qUrls);
sqs.deleteQueue(request);
Formation AWS Boto
54
SimpleDB
Formation AWS Boto
55
Connexion à SimpleDB
AmazonSimpleDB sdb = new AmazonSimpleDB(provider);
Formation AWS Boto
56
Création d'un domaineCreateDomainRequest request = new CreateDomainRequest('domain1');
sdb.createDomain(request);
# lister les domaines
ListDomainsResult res = sdb.listDomain(new ListDomainsRequest());
List<Strings> names = res.getDomainNames();
Formation AWS Boto
57
Métadonnées associés à un domaine
DomainMetadataRequest request = new DomainMetadataRequest('domain1') ;
DomainMetadataResult res = sdb.domainMetaData(request);
# lister le nombre d'items dans le domaine
System.out.println(res.getItemCount());
Formation AWS Boto
58
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
59
Récupérer un item (1)GetAttributesRequest request = new GetAttributesRequest('domain1', 'cmd7');
# forcer une lecture vérouillée
request.setConsistentRead(true);
GetAttributesResult res = sdb.getAttributes(request);
Formation AWS Boto
60
Récupérer un item (2)# possibilité d'utiliser « SQL »
SelectRequest request = new SelectRequest('select * from commandes where id="7"');
SelectResult res = sdb.select(request);
List<Item> items = res.getItems();
for (Item item : items) {
System.out.println(item.getName());
}
Formation AWS Boto
61
Alternatives
Formation AWS Boto
62
Boto• Bibliothèque Python• SDK officiel Python• Beaucoup moins verbeux !
Formation AWS Boto
63
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
64
Libcloud (2)• Plus de 26 fournisseurs supportés
• AWS, Rackspace, Eucalyptus, OpenStack, OpenNebula, CloudSigma, Google Storage, Vsphere, Gandi.net, etc...
Formation AWS Boto
65
https://libcloud.apache.org
Deltacloud (1)
Formation AWS Boto
66
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
67
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
68
Formation AWS Boto
69
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
70
Bibliographie
Mise en pratique
Formation AWS Boto
71