4 Stocker des données sur Amazon S3 Dans ce chapitre, nous plongeons la tête la première dans Amazon S3, Simple Storage Service (service simple de stockage). Après un aperçu rapide des concepts de S3 les plus importants, nous consacrerons la plus grande partie de ce chapitre à passer en revue le code nécessaire pour manipuler des buckets et des objets sous S3 et son pendant pour la distribution de contenu, CloudFront. Aperçu de S3 S3 est un service de stockage à l échelle d Internet. Toutes les données sont stockées de manière redondante pour prévenir les problèmes dus à une perte de connectivité temporaire ou à des pannes permanentes de matériel. S3 peut gérer de gros volumes de données et un grand nombre d accès concurrents. En mars 2009, S3 contenait déjà plus de 124 milliards d objets et gérait plus de 1 billion de requêtes par an 1. S3 vous permet de stocker vos données dans des conteneurs appelés buckets ou compartiments. Un bucket est une entité de stockage nommée attachée à un compte AWS donné. Vous pouvez créer jusqu à 100 buckets sur votre compte AWS. Le nom des buckets doit être unique globalement ; vous devez donc choisir vos noms avec soin et chercher jusqu à trouver des noms disponibles. Les buckets sont utilisés pour grouper un nombre arbitraire d objets S3. Arbitraire ici veut réellement dire arbitraire il est parfaitement raisonnable de stocker des millions ou des dizaines de millions d objets dans un seul bucket S3. Selon vos besoins, vous pouvez choisir d utiliser plusieurs buckets pour une seule application, ou un bucket par application. 1. http://aws.amazon.com/about-aws/whats-new/2009/03/30/ celebrating-3-years-of-amazon-s3-with-3-months-of-transfer-in-for-3-centsgb/
54 Le Cloud Computing avec Amazon Web Services Vous pouvez stocker tout type de données dans S3. Il peut s agir de fichiers texte tels que des pages HTML, des feuilles de style CSS ou du code source C, ou de fichiers binaires comme des images JPEG, des fichiers de sauvegarde au format tar ou même des données chiffrées (vous pouvez chiffrer les données sensibles avant de les stocker dans S3 si vous le souhaitez). S3 est idéal pour stocker des données web. Tous les objets S3 ont leur propre URL et S3 peut gérer un taux de requêtes très élevé. S3 peut stocker des objets dont la taille atteint jusqu à 5 To. C est une limite que vous n approcherez probablement jamais en pratique, et ce en raison de plusieurs facteurs. Selon la vitesse de votre connexion Internet, télécharger un objet de cette taille sur le serveur prendra des jours, voire des semaines. Si la connexion est interrompue, vous devrez recommencer le téléchargement. Certains outils S3 essaient également de lire entièrement l objet en mémoire avant de commencer sa mise en ligne. Chaque objet S3 a une URL unique formée en concaténant ces composants : le protocole (http:// ou https://) ; le nom du bucket, terminé par "." ; le suffixe S3 (s3.amazonaws.com) ; la clé de l objet précédée de "/". La clé de l objet peut elle-même contenir des caractères "/". Ces caractères font simplement partie du nom de l objet et n ont pas de signification spéciale pour S3. S3 n est pas un système de fichiers hiérarchique et n a donc pas de notion de sous-dossier. Les outils S3 du Chapitre 3 maintiennent l impression polie que "/" est spécial et permettent aux utilisateurs d explorer le contenu d un bucket S3 comme s il contenait effectivement des sous-dossiers. On peut accéder à S3 via deux API. L API SOAP contient des fonctions telles que ListAllMyBuckets, CreateBucket et DeleteBucket. L API HTTP utilise les verbes HTTP standard (GET, PUT, HEAD et DELETE) comme base pour toutes les opérations. L opération GET récupère le contenu d un bucket ou un objet ; l opération PUT crée un nouveau bucket ou objet ; l opération DELETE supprime un bucket ou un objet ; et l opération HEAD récupère des informations sur un objet. Vous pouvez ajouter des métadonnées sous la forme de paires clé-valeur lorsque vous créez un nouvel objet S3. Les métadonnées sont renvoyées sous la forme d en-têtes HTTP lorsque l objet est récupéré avec une requête HTTP GET. L accès à un bucket S3 est contrôlé par une ACL ou liste de contrôle d accès (Access Control List). Une ACL contient jusqu à 100 autorisations (en anglais, grant) ; chacune de ces autorisations contient un destinataire et l étendue des permissions. Grâce aux ACL, vous pouvez donner des accès à des utilisateurs ou à des groupes d utilisateurs spécifiques.
Chapitre 4 Stocker des données s ur Amazon S3 55 Les utilisateurs spécifiques représentent un compte AWS individuel. Le compte peut être spécifié avec une adresse de courrier électronique ou un identifiant canonique d utilisateur, mais il est toujours retourné en tant qu objet CanonicalUser : l adresse de courrier électronique est simplement un confort. Les groupes représentent des classes prédéfinies d utilisateurs, n importe quel utilisateur d AWS ou les utilisateurs anonymes (n importe quelle personne). Le composant "permission" d une ACL indique les accès attribués aux destinataires. Vous pouvez donner des permissions pour des buckets ou des objets, mais la sémantique est légèrement différente, comme l explique le Tableau 4.1. Tableau 4.1 : Permissions appliquées aux buckets et aux objets Permission Appliquée à un bucket Appliquée à un objet READ WRITE Autorisation de dresser la liste des contenus du bucket Autorisation de créer, remplacer ou supprimer tout objet du bucket Autorisation de lire l objet ou ses métadonnées Non pris en charge pour les objets READ_ACP Autorisation de lire l ACL du bucket Autorisation de lire l ACL de l objet WRITE_ACP Autorisation de réécrire l ACL du Autorisation de réécrire l ACL de l objet bucket FULL_CONTROL Toutes les autorisations présentées ici Toutes les autorisations présentées ici Le propriétaire d un bucket ou d un objet a toujours la permission implicite READ_ ACP : on peut toujours accéder à l ACL de ses propres objets. De la même manière, le propriétaire a également implicitement la permission WRITE_ACP, de sorte que l on peut toujours changer l ACL de ses propres objets. La permission FULL_CONTROL n est qu un simple confort et a le même effet que d appliquer les permissions READ, WRITE, READ_ACP et WRITE_ACP. Les permissions sur les buckets et sur les objets sont distinctes. Les permissions sur le bucket n ont pas d influence sur les permissions des objets nouvellement créés : les ACL doivent être définies individuellement pour chaque objet. Le modèle tarifaire de S3 Votre usage de S3 est facturé selon trois critères : la quantité de données stockées ; la quantité de données transférées vers et depuis S3 ;
56 Le Cloud Computing avec Amazon Web Services le nombre de requêtes vers S3. Voyons chacune de ces trois dimensions en détail. Le stockage S3 est facturé en fonction d une unité nommée gigaoctet-mois (gigabyte-month, en anglais). Si vous stockez exactement 1 gigaoctet pendant exactement 1 mois, vous serez facturé 1 gigaoctet-mois, c est-à-dire 0,14 dollar (quatorze cents US) pour des données stockées en Europe 2. Le temps et l espace peuvent être échangés l un contre l autre ; vous pouvez aussi stocker 2 gigaoctets pour un demi-mois ou 30 gigaoctets pour 1 jour pour le même tarif. En interne, S3 utilise une unité de facturation plus fine, l octet-heure. Cela permet à AWS de mesurer votre utilisation avec un degré de précision très élevé et de vous facturer en fonction de cela. Les transferts de données sont facturés en fonction de la quantité de données transférées vers et depuis S3. Les données transférées vers S3 sont facturées 0,10 dollar par gigaoctet. Ce montant est, une fois de plus, proportionnel à la quantité réelle de données transférées. Les données transférées depuis S3 sont facturées sur une échelle mobile commençant à 0,15 dollar par gigaoctet et dégressif en fonction du volume, atteignant 0,08 dollar par gigaoctet pour tout le transfert de données au-delà des 150 premiers téraoctets par mois. Un cas particulier important est celui des transferts de données entre S3 et une instance Amazon EC2 de la même région : ceux-ci sont gratuits. Il existe également des tarifs peu élevés (mais à ne pas négliger) pour chaque requête faite à S3. Les requêtes HTTP GET sont facturées au tarif de 0,01 dollar pour 10 000 requêtes. Les requêtes PUT, COPY, LIST et POST sont facturées au tarif de 0,01 dollar pour 1 000 requêtes. Tout ceci considéré, et compte tenu de l offre de démarrage gratuit d AWS, vous pouvez créer un prototype de votre application S3 pour presque rien et payer plus pour le stockage et les transferts de données au fur et à mesure que votre application améliore sa popularité. ATTENTION Gardez un œil sur le compteur! Vous devez garder à l esprit que le compteur tourne toujours! Si vous écrivez un programme qui examine un de vos buckets S3 toutes les secondes (une requête LIST), vous dépenserez 86 cents par jour, qu il y ait quelque chose de nouveau dans le bucket ou non. Vérifiez toujours vos conditions de fin de boucle avec le plus grand soin. Il est préférable d éviter d écrire une boucle infinie qui vous coûte de l argent à chaque itération. 2. Tous les tarifs AWS sont sujets à changements. Les derniers tarifs pour S3 sont disponibles à l adresse http://aws.amazon.com/s3.
Chapitre 4 Stocker des données s ur Amazon S3 57 Vous pouvez (et devriez) vérifier votre utilisation de S3 à n importe quel moment du mois pour vérifier qu elle correspond à ce à quoi vous vous attendez. Pour cela, connectez-vous au portail AWS et choisissez l option Account Activity dans le menu Your Account. Aperçu de CloudFront CloudFront est un service web pour distribuer du contenu web à haute vitesse avec latence faible. CloudFront est intégré avec S3, ce qui rend très simple de distribuer n importe quel objet public de S3 sur le réseau CloudFront de 18 edge locations (emplacements périphériques) 3. À l heure où nous traduisons ces lignes, les edge locations sont distribués à travers les États-Unis, l Europe et l Asie, comme le montre le Tableau 4.2. Tableau 4.2 : Edge locations du réseau CloudFront États-Unis Europe Asie Ashburn, Virginie Dallas/Fort Worth, Texas Jacksonville, Floride Los Angeles, Californie Miami, Floride Newark, New Jersey New York, New York Palo Alto, Californie Seattle, Washington Saint Louis, Missouri Amsterdam Dublin Francfort Londres Paris Hong Kong Singapour Tokyo CloudFront est très simple à utiliser. Il suffit de créer une distribution pour n importe lequel de vos buckets S3 et CloudFront fait le reste. Le modèle tarifaire de CloudFront L utilisation de CloudFront est facturée selon deux dimensions : les transferts de données ; le nombre de requêtes vers CloudFront. 3. Le nombre et l emplacement de ces points de sortie peuvent changer dans le futur.
58 Le Cloud Computing avec Amazon Web Services Les données transférées vers et depuis CloudFront sont facturées selon une échelle mobile. Démarrant à 0,15 dollar par gigaoctet, les tarifs baissent en fonction du volume, atteignant 0,03 dollar par gigaoctet pour tout transfert sortant au-delà de 1 000 téraoctets par mois. Les volumes de données entre S3 et CloudFront sont également facturés. Les tarifs les plus récents pour CloudFront sont disponibles à l adresse http://aws.amazon.com/cloudfront. De plus, pour 10 000 requêtes HTTP GET traitées par CloudFront, 0,009 dollar est facturé. Programmer S3 et CloudFront Une fois ces remarques préliminaires faites, il est temps de passer à la partie amusante : le code! Dans cette section, vous apprendrez comment dresser la liste de vos buckets, créer de nouveaux buckets et dresser la liste des objets d un bucket de plusieurs manières différentes. Nous couvrirons également le traitement du contenu d un bucket (et nous verrons comment effectuer quelques traitements d image simples) et comment distribuer votre contenu avec CloudFront. IMPORTANT Exécuter le code. Comme nous l avons mentionné dans la section intitulée "Exécuter le code PHP" de cet ouvrage, les programmes de cette section qui commencent avec un dièse et un point d exclamation (#!/usr/bin/php) doivent être démarrés depuis la ligne de commande. Les autres sont prévus pour fonctionner depuis un serveur web. Créer un bucket S3 Avançons à présent et créons un nouveau bucket. Avant de commencer, cependant, nous allons créer un nouveau fichier PHP et l appeler book.inc.php. Celui-ci contient de nombreuses définitions et fonctions communes que nous utiliserons tout au long de cet ouvrage. Je l ai placé dans un sous-répertoire nommé include. La première définition que nous allons ajouter au fichier book.inc.php est le nom du bucket S3 : chap04/include/book.inc.php (extrait) <?php define( BOOK_BUCKET, livre-pearson-aws-cloud ); define( BUCKET_REGION, AmazonS3::REGION_EU_W1);?>
Chapitre 4 Stocker des données s ur Amazon S3 59 Nous avons ici créé une nouvelle constante nommée BOOK_BUCKET et lui avons donné la valeur livre-pearson-aws-cloud. Vous devez bien sûr trouver votre propre nom de bucket : comme mentionné précédemment, les noms de buckets doivent être uniques au niveau global et j ai déjà chipé celui-ci! Nous avons également défini une région privilégiée pour la création du bucket afin que celui-ci soit créé sur des serveurs européens. Voici le code pour créer un nouveau bucket S3 : chap04/create_bucket.php (extrait) #!/usr/bin/php <?php error_reporting(e_all); ❶ require_once( sdk.class.php ); ❷ require_once( include/book.inc.php ); $s3 = new AmazonS3(); ❸ $res = $s3->create_bucket(book_bucket, BUCKET_REGION); if ($res->isok()) ❹ { print( Bucket.BOOK_BUCKET. créé\n ); } else { print( Erreur lors de la création du bucket.book_bucket. \n ); }?> Examinons le code instruction par instruction. ❶ On commence par définir le niveau des rapports d erreur. Cette instruction indique à PHP de signaler tous les avertissements et erreurs. S astreindre à cette discipline de programmation est important et vous permet de connaître les éventuels problèmes plutôt tôt que tard. C est une bonne chose sur le long terme car la plupart des bogues potentiels auront été supprimés avant d apparaître. ❷ Puis on inclut les fichiers nécessaires. La première instruction met en mémoire le fichier sdk.class.php. Ce fichier contient la bibliothèque du SDK que nous utilisons dans cet ouvrage. La deuxième instruction place book.inc.php en mémoire. ❸ Vient alors la partie principale du script. On crée d abord un nouvel objet AmazonS3 et on appelle la méthode create_bucket, l instruction clé de ce script, pour créer un nouveau bucket. Si vous avez personnalisé la définition de BOOK_BUCKET dans book. inc.php, le script créera un bucket pour vous (si ce bucket n existe pas déjà).