Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

71
Formation Introduction au AWS SDK Java

Transcript of Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Page 1: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Formation

Introduction au AWS SDK Java

Page 2: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Introduction au AWS SDK Java

Formation AWS Boto

2

Page 3: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Formation AWS Boto

3

Page 4: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Présentation & Installation

Formation AWS Boto

4

Page 5: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 6: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 7: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Concepts Généraux

Formation AWS Boto

7

Page 8: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 9: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 10: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 11: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 12: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 13: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Model• Paquetage « com.amazonaws.<service>.model »• Contient les représentations des différents concepts : Instance, Bucket, SecurityGroup, etc.

Formation AWS Boto

13

Page 14: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 15: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Documentation en ligne

Formation AWS Boto

15

http://aws.amazon.com/fr/sdkforjava/

Page 16: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

EC2

Formation AWS Boto

16

Page 17: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 18: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

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
Page 19: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 20: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 21: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 22: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 23: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Créer un groupe de sécuritéCreateSecurityGroupRequest request = new CreateSecurityGroupRequest('ssh-access', 'open ssh port') ;

ec2.createSecurityGroup(request) ;

Formation AWS Boto

23

Page 24: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 25: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

RevokeSecurityGroupIngressRequest request = new RevokeSecurityGroupIngressRequest('ssh-access', perms);

Formation AWS Boto

25

Page 26: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 27: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Associer une EIPAssociateAddressRequest request = new AssociateAddressRequest(id, eip);

ec2.associateAddress(request);

DisassociateAddressRequest request = new DisassociateAddressRequest(eip);

ec2.disassociateAddress(request);

Formation AWS Boto

27

Page 28: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

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)
Page 29: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 30: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

S3

Formation AWS Boto

30

Page 31: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Connexion à S3AmazonS3 s3 = new AmazonS3Client(new ClasspathPropertiesFileCredentialsProvider());

Formation AWS Boto

31

Page 32: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Créer un bucket# créer un bucket

CreateBucketRequest request = new CreateBucketRequest(bucket);

Bucket b = s3.createBucket(request);

Formation AWS Boto

32

Page 33: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 34: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 35: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

haikel
Le header content-type permet de configurer le bon type mime pour les téléchargements via HTTP
Page 36: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 37: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

ELB

Formation AWS Boto

37

Page 38: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Connexion à ELBAmazonElasticLoadBalancing elb = new AmazonElasticloadBalancing(provider);

Formation AWS Boto

38

Page 39: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 40: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 41: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 42: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 43: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Retirer des instances à un LB# retirer des instances

DeregisterInstancesFromLoadBalancerRequest request = new DeregisterInstancesFromLoadBalancerRequest('lb1', instances);

elb.deregisterInstancesFromLoadBalancer(request);

Formation AWS Boto

43

Page 44: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 45: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Détruire un Load BalancerDeleteLoadBalancerRequest request = new DeleteLoadBalancerRequest('lb1');

elb.deleteLoadBalancer(request);

Formation AWS Boto

45

Page 46: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

SQS

Formation AWS Boto

46

Page 47: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Connexion à SQSAmazonSQS sqs = new AmazonSQSClient(provider);

Formation AWS Boto

47

Page 48: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 49: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 50: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Envoi d'un messageString message = 'xxxxx';

SendMessageRequest request = new SendMessageRequest(qUrls, message);

sqs.sendMessage(request);

Formation AWS Boto

50

Page 51: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 52: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 53: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 54: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Détruire notre file# destruction

DeleteQueueRequest request = new DeleteQueueRequest(qUrls);

sqs.deleteQueue(request);

Formation AWS Boto

54

Page 55: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

SimpleDB

Formation AWS Boto

55

Page 56: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Connexion à SimpleDB

AmazonSimpleDB sdb = new AmazonSimpleDB(provider);

Formation AWS Boto

56

Page 57: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 58: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 59: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 60: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 61: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 62: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Alternatives

Formation AWS Boto

62

Page 63: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Boto• Bibliothèque Python• SDK officiel Python• Beaucoup moins verbeux !

Formation AWS Boto

63

Page 64: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 65: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 66: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Deltacloud (1)

Formation AWS Boto

66

Page 67: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 68: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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

Page 69: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

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/

Page 70: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Formation AWS Boto

70

Bibliographie

Page 71: Formation Introduction au AWS SDK Java. Formation AWSBoto 2.

Mise en pratique

Formation AWS Boto

71