10 AWS avancé Dans ce chapitre, nous bâtirons sur les bases que nous avons apprises jusqu ici. Nous étudierons des sujets plus avancés tels que la surveillance de votre utilisation d AWS, l utilisation de volumes Elastic Block Storage, l accès aux métadonnées de vos instances EC2 et le tracé dynamique de diagrammes pour votre système AWS. Surveiller votre utilisation d EC2 La nature dynamique d AWS (la facilité avec laquelle vous pouvez ajouter des données dans Amazon S3, créer et peupler des domaines dans SimpleDB et lancer des instances EC2) signifie que vous devez rester conscient de votre utilisation (et des coûts associés). Activité du compte Vous pouvez tracer manuellement l activité en cliquant sur Account Activity du menu Your Account de la page http://aws.amazon.com. Une fois connecté, vous pouvez voir l utilisation détaillée et les coûts de chacun des services que vous utilisez. Vous pouvez développer chaque section avec l icône + à côté du nom du service. La Figure 10.1 illustre l activité de mon compte pour le mois de février 2011.
260 Le Cloud Computing avec Amazon Web Services Figure 10.1 Un mois d activité s ur le compte du traducteur de cet ouvrage. Si votre utilisation d AWS varie d un jour à l autre, vous devriez probablement vérifier fréquemment l activité de votre compte. C est doublement vrai si vous publiez de grosses quantités de contenu ou si vous utilisez la fonctionnalité Auto Scale pour démarrer des instances EC2 additionnelles en réponse à un trafic ou à une charge système plus importants. Accéder aux données d utilisation Les données brutes utilisées pour générer le rapport d activité du compte peuvent être téléchargées à partir du portail AWS en choisissant l option Usage Reports dans le menu. Vous pouvez télécharger des rapports pour tous les services et contrôler la période, les types d usages et le format des données (XML ou CSV), comme illustré à la Figure 10.2.
Chapitre 10 AWS avancé 261 Figure 10.2 Télécharger les rapports d utilis ation d AWS. Comme nous avons déjà vu comment traiter du XML, nous allons cette fois travailler avec un fichier CSV (Comma-Separated Value, valeurs séparées par des virgules) pour avoir l opportunité d apprendre une nouvelle compétence. Nous allons accéder aux données, les stocker dans SimpleDB, puis les récupérer et les visualiser. Commencez par télécharger des données pour un des services (ou tous) que vous avez utilisés. Choisissez Days pour Report Granularity, choisissez une Time Period représentative de votre utilisation récente AWS (j ai choisi un intervalle allant du 1 er janvier 2011 au 28 février 2011) et cliquez sur Download report (CSV). En fonction de la configuration de votre navigateur, vous pouvez obtenir un écran complet de données ou un nouveau fichier dans votre historique de téléchargement. Dans les deux cas, faites ce que vous avez à faire pour transférer les données vers votre instance EC2 en cours d exécution. J ai ouvert le fichier dans une copie locale de Notepad, sélectionné et copié le texte et je l ai copié dans un tampon Emacs sur mon instance EC2. J ai nommé ce fichier ec2_usage.csv, mais vous pouvez utiliser le nom que vous souhaitez. Importer les données d utilisation Voici les premières lignes de mon fichier ec2_usage.csv : Service, Operation, UsageType, StartTime, EndTime, UsageValue AmazonEC2,PublicIP-In,EU-DataTransfer-In-Bytes,01/17/11 00:00:00,01/18/11 00:00:00,1928 AmazonEC2,InterZone-Out,EU-DataTransfer-Regional-Bytes,01/17/11 00:00:00,01/18/11 00:00:00,35344 AmazonEC2,EBS:IO-Write,EU-EBS:VolumeIOUsage,01/17/11 00:00:00,01/18/11 00:00:00,4665
262 Le Cloud Computing avec Amazon Web Services AmazonEC2,GetMetricStatistics,EU-Calls,01/17/11 00:00:00,01/18/11 00:00:00,460 La première ligne du fichier fournit les noms des champs ; les autres lignes contiennent des données : un enregistrement par ligne, avec des valeurs séparées par des virgules. La fonction fgetcsv de PHP facilite la gestion des fichiers CSV. Cette fonction lit des lignes d un fichier, sépare les champs aux limites définies par les virgules (en respectant les chaînes entre guillemets) et renvoie un tableau de valeurs. Voici ce qu elle renvoie pour la première ligne de mon fichier : Array ( [0] => Service [1] => Operation [2] => UsageType [3] => StartTime [4] => EndTime [5] => UsageValue ) Les fichiers d utilisation de chaque service AWS contiennent des champs communs et certains sont spécifiques à un service donné. Par exemple, les fichiers d utilisation de S3 contiennent également un champ Resource. Ce champ associe les données avec un bucket S3. De façon similaire, les fichiers d utilisation de CloudFront utilisent le champ Resource pour identifier les données de compte associées à une distribution CloudFront donnée. Comme le format de données contient des éléments communs et certaines variantes spécifiques aux services, Amazon SimpleDB constitue un système de stockage idéal. Nous avons besoin d un domaine : chap10/include/book.inc.php (extrait) define( BOOK_AWS_USAGE_DOMAIN, aws_usage ); Nous pouvons utiliser une version modifiée du script de création de domaine du Chapitre 8 pour créer ce domaine : chap10/create_domain.php (extrait) $res = $sdb->create_domain(book_aws_usage_domain);
Chapitre 10 AWS avancé 263 Nous allons à présent construire un programme pour importer des données d un ou plusieurs fichiers CSV spécifiés sur la ligne de commande. Voici ce dont nous avons besoin pour démarrer : #!/usr/bin/php <?php error_reporting(e_all); require_once('sdk.class.php ); require_once('include/book.inc.php ); if ($argc == 1) exit("usage: ". $argv[0]. FICHIER_CSV...\n ); Le script s attend à trouver un ou plusieurs fichiers CSV sur la ligne de commande et le code qui précède effectue cette vérification. Il affiche un message d aide s il y a trop peu d arguments à la ligne de commande. Les données sont stockées dans SimpleDB : il faut créer un objet. $sdb = new AmazonSDB(); $sdb->set_region(sdb_region); On peut ensuite traiter chaque ligne avec une fonction ImportCSV que nous allons bientôt détailler : for ($i = 1; $i < $argc; $i++) $file = $argv[$i]; if (($ret = ImportCSV($sdb, $file))!== false) print( Importation de $file: $ret enregistrements\n ); else print( Échec de l import de $file\n );
264 Le Cloud Computing avec Amazon Web Services Examinons à présent la fonction ImportCSV. La première étape consiste à ouvrir le fichier ; cette requête renvoie false si le fichier ne peut pas être ouvert : function ImportCSV($sdb, $file) $fp = fopen($file, r ); if ($fp === false) return false; Comme la première ligne du fichier CSV contient les noms des champs, on les lit dans le tableau $fields. Nous avons besoin de ces noms pour traiter et stocker chaque ligne de données. Nous enregistrons également le nombre de lignes de données lues et traitées : $fields = fgetcsv($fp); $recordcount = 0; On peut maintenant traiter chaque ligne de données : while (($data = fgetcsv($fp))!== false) $recordcount++; Comme nous l avons discuté au Chapitre 8, le choix des clés SimpleDB est tout un art. Lorsque j ai construit cet outil, je voulais pouvoir importer le même fichier de données ou plusieurs fichiers de données avec des dates se chevauchant tout en maintenant l intégrité des données. Après quelques expériences, j ai composé une clé en concaténant le nom du service et l empreinte MD5 des champs sans données (tous les champs sauf UsageValue). Mon algorithme produit des clés de ce type : AmazonS3_c8e3df29d22bca8b7e73fd3b35152133 AmazonS3_2efdc1f3ab71d5b11cb3aa5cb738909d AmazonEC2_2a88d9d6945f7d081714f31abe610400 AmazonEC2_11ebe64d3b6b0cab959a6d91edaad8cb
Chapitre 10 AWS avancé 265 Voici comment faire cela. Déclarez les variables $key et $keydata : $key = ; $keydata = ; Puis chaque champ de chaque ligne est traité. La variable $fields contient les noms des champs pour le fichier. J ai également modifié la mise en forme des champs de date (StartTime et EndTime) pour améliorer les requêtes sur des intervalles. Voici le code pour le traitement des champs : $attrs = array(); for ($i = 0; $i < count($fields); $i++) if (($fields[$i] == StartTime ) ($fields[$i] == EndTime )) $data[$i] = date_create($data[$i])->format( c ); $attrs[$fields[$i]] = $data[$i]; if ($fields[$i] == Service ) $key = $data[$i]; if ($fields[$i]!= UsageValue ) $keydata.= $data[$i]; À la fin de la boucle, le tableau $attrs contient les données à écrire dans SimpleDB, $key contient le préfixe pour la clé et $keydata contient les données dont il faut générer une empreinte pour former le reste de la clé. Voici un exemple du contenu du tableau $attrs pour mes données : Array ["Service"] => "AmazonEC2" ["Operation"] => "InterZone-Out" [ UsageType ] => EU-DataTransfer-Regional-Bytes [ StartTime ] => 2011-01-17T00:00:00+01:00 [ EndTime ] => 2011-01-18T00:00:00+01:00 [ UsageValue ] => 35344