Procédure de mise à jour d'une pile - AWS CloudFormation

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Procédure de mise à jour d'une pile

Avec AWS CloudFormation, vous pouvez mettre à jour les propriétés des ressources dans vos piles existantes. Ces modifications peuvent aller de simples modifications de configuration, telles que la mise à jour du seuil d'alarme lors CloudWatch d'une alarme, à des modifications plus complexes, telles que la mise à jour de l'Amazon Machine Image (AMI) exécutée sur une instance Amazon EC2. Beaucoup de ressources AWS d'un modèle peuvent être mises à jour, et nous continuons à élargir cette prise en charge.

Cette section décrit une progression simple des mises à jour d'une pile en cours d'exécution. Elle explique comment l'utilisation de modèles rend possible l'utilisation d'un système de contrôle de version pour la configuration de votre infrastructure AWS, tout comme vous utilisez le contrôle de version pour les logiciels que vous exécutez. Nous effectuerons les étapes suivantes :

  1. Création de la pile initiale : création d'une pile à l'aide d'une AMI Amazon Linux de base via l'installation du serveur web Apache et d'une application PHP simple à l'aide des scripts d'assistant AWS CloudFormation.

  2. Mise à jour de l'application— mettez à jour l'un des fichiers de l'application et déployez le logiciel à l'aide de CloudFormation.

  3. Mise à jour du type d'instance : modification du type d'instance Amazon EC2 sous-jacente.

  4. Mise à jour de l'AMI dans une instance Amazon EC2 : modification de l'Amazon Machine Image (AMI) de l'instance Amazon EC2 dans votre pile.

  5. Ajout d'une paire de clés à une Instance : ajout d'une paire de clés Amazon EC2 à l'instance, puis mise à jour du groupe de sécurité pour permettre l'accès SSH à l'instance.

  6. Modification des ressources de la pile : ajout ou suppression de ressources de la pile, en convertissant cette dernière en application à équilibrage de charge et à dimensionnement automatique.

Application simple

Nous allons commencer par la création d'une pile que nous pourrons utiliser tout au long de cette section. Nous avons fourni un modèle simple qui lance une application web PHP à instance unique hébergée sur le serveur Web Apache et exécutée une AMI Linux Amazon.

Le serveur Web Apache, PHP et l'application PHP simple sont tous installés par les scripts d'assistant CloudFormation qui sont installés par défaut sur l'AMI Amazon Linux. L'extrait de modèle suivant illustre les métadonnées qui décrivent les packages et les fichiers à installer (dans ce cas, le serveur Web Apache et l'infrastructure PHP provenant du référentiel Yum pour l'AMI Amazon Linux). Cet extrait montre également la section Services, qui s'assure que le serveur Web Apache est en cours d'exécution. Dans la section Propriétés de la définition de l'instance Amazon EC2, la UserData propriété contient le CloudInit script qui appelle cfn-init pour installer les packages et les fichiers.

"WebServerInstance": { "Type" : "AWS::EC2::Instance", "Metadata" : { "AWS::CloudFormation::Init" : { "config" : { "packages" : { "yum" : { "httpd" : [], "php" : [] } }, "files" : { "/var/www/html/index.php" : { "content" : { "Fn::Join" : ["", [ "<?php\n", "echo '<h1>AWS CloudFormation sample PHP application</h1>';\n", "echo '<p>", { "Ref" : "WelcomeMessage" }, "</p>';\n", "?>\n" ]]}, "mode" : "000644", "owner" : "apache", "group" : "apache" }, }, : "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" } } } } } }, "Properties": { : "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash\n", "yum install -y aws-cfn-bootstrap\n", : "# Install the files and packages from the metadata\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServerInstance ", " --region ", { "Ref" : "AWS::Region" }, "\n", : ]]}} } },

L'application elle-même repose sur un exemple « Hello, World » de deux lignes qui est entièrement défini dans le modèle. Pour une application réelle, les fichiers peuvent être stockés sur Amazon S3 ou dans un autre référentiel et référencés à partir du modèle. GitHub CloudFormation peut télécharger des packages (tels que des RPM ou RubyGems) et référencer des fichiers individuels, des extensions .zip et des .tar fichiers pour créer les artefacts de l'application sur l'instance Amazon EC2.

Ce modèle active et configure le démon cfn-hup pour écouter les modifications apportées à la configuration définie dans les métadonnées pour l'instance Amazon EC2. Avec le programme cfn-hup, vous pouvez mettre à jour les logiciels d'application, tels que la version Apache ou PHP, ou vous pouvez mettre à jour le fichier d'application PHP lui-même à partir d'AWS CloudFormation. L'extrait suivant issue la même ressource Amazon EC2 dans le modèle présente les éléments nécessaires à la configuration de cfn-hup pour appeler cfn-init afin de mettre à jour le logiciel si des modifications des métadonnées sont détectées :

"WebServerInstance": { "Type" : "AWS::EC2::Instance", "Metadata" : { "AWS::CloudFormation::Init" : { "config" : { : "files" : { : "/etc/cfn/cfn-hup.conf" : { "content" : { "Fn::Join" : ["", [ "[main]\n", "stack=", { "Ref" : "AWS::StackName" }, "\n", "region=", { "Ref" : "AWS::Region" }, "\n" ]]}, "mode" : "000400", "owner" : "root", "group" : "root" }, "/etc/cfn/hooks.d/cfn-auto-reloader.conf" : { "content": { "Fn::Join" : ["", [ "[cfn-auto-reloader-hook]\n", "triggers=post.update\n", "path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init\n", "action=/opt/aws/bin/cfn-init -s ", { "Ref" : "AWS::StackId" }, " -r WebServerInstance ", " --region ", { "Ref" : "AWS::Region" }, "\n", "runas=root\n" ]]} } }, : }, "Properties": { : "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ : "# Start up the cfn-hup daemon to listen for changes to the Web Server metadata\n", "/opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup'\n", : ]]}} } },

Pour terminer la pile, le modèle crée un groupe de sécurité Amazon EC2.

{ "AWSTemplateFormatVersion" : "2010-09-09", "Description" : "AWS CloudFormation Sample Template: Sample template that can be used to test EC2 updates. **WARNING** This template creates an Amazon Ec2 Instance. You will be billed for the AWS resources used if you create a stack from this template.", "Parameters" : { "InstanceType" : { "Description" : "WebServer EC2 instance type", "Type" : "String", "Default" : "t2.small", "AllowedValues" : [ "t1.micro", "t2.nano", "t2.micro", "t2.small", "t2.medium", "t2.large", "m1.small", "m1.medium", "m1.large", "m1.xlarge", "m2.xlarge", "m2.2xlarge", "m2.4xlarge", "m3.medium", "m3.large", "m3.xlarge", "m3.2xlarge", "m4.large", "m4.xlarge", "m4.2xlarge", "m4.4xlarge", "m4.10xlarge", "c1.medium", "c1.xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "c4.large", "c4.xlarge", "c4.2xlarge", "c4.4xlarge", "c4.8xlarge", "g2.2xlarge", "g2.8xlarge", "r3.large", "r3.xlarge", "r3.2xlarge", "r3.4xlarge", "r3.8xlarge", "i2.xlarge", "i2.2xlarge", "i2.4xlarge", "i2.8xlarge", "d2.xlarge", "d2.2xlarge", "d2.4xlarge", "d2.8xlarge", "hi1.4xlarge", "hs1.8xlarge", "cr1.8xlarge", "cc2.8xlarge", "cg1.4xlarge" ], "ConstraintDescription" : "must be a valid EC2 instance type." } }, "Mappings" : { "AWSInstanceType2Arch" : { "t1.micro" : { "Arch" : "HVM64" }, "t2.nano" : { "Arch" : "HVM64" }, "t2.micro" : { "Arch" : "HVM64" }, "t2.small" : { "Arch" : "HVM64" }, "t2.medium" : { "Arch" : "HVM64" }, "t2.large" : { "Arch" : "HVM64" }, "m1.small" : { "Arch" : "HVM64" }, "m1.medium" : { "Arch" : "HVM64" }, "m1.large" : { "Arch" : "HVM64" }, "m1.xlarge" : { "Arch" : "HVM64" }, "m2.xlarge" : { "Arch" : "HVM64" }, "m2.2xlarge" : { "Arch" : "HVM64" }, "m2.4xlarge" : { "Arch" : "HVM64" }, "m3.medium" : { "Arch" : "HVM64" }, "m3.large" : { "Arch" : "HVM64" }, "m3.xlarge" : { "Arch" : "HVM64" }, "m3.2xlarge" : { "Arch" : "HVM64" }, "m4.large" : { "Arch" : "HVM64" }, "m4.xlarge" : { "Arch" : "HVM64" }, "m4.2xlarge" : { "Arch" : "HVM64" }, "m4.4xlarge" : { "Arch" : "HVM64" }, "m4.10xlarge" : { "Arch" : "HVM64" }, "c1.medium" : { "Arch" : "HVM64" }, "c1.xlarge" : { "Arch" : "HVM64" }, "c3.large" : { "Arch" : "HVM64" }, "c3.xlarge" : { "Arch" : "HVM64" }, "c3.2xlarge" : { "Arch" : "HVM64" }, "c3.4xlarge" : { "Arch" : "HVM64" }, "c3.8xlarge" : { "Arch" : "HVM64" }, "c4.large" : { "Arch" : "HVM64" }, "c4.xlarge" : { "Arch" : "HVM64" }, "c4.2xlarge" : { "Arch" : "HVM64" }, "c4.4xlarge" : { "Arch" : "HVM64" }, "c4.8xlarge" : { "Arch" : "HVM64" }, "g2.2xlarge" : { "Arch" : "HVMG2" }, "g2.8xlarge" : { "Arch" : "HVMG2" }, "r3.large" : { "Arch" : "HVM64" }, "r3.xlarge" : { "Arch" : "HVM64" }, "r3.2xlarge" : { "Arch" : "HVM64" }, "r3.4xlarge" : { "Arch" : "HVM64" }, "r3.8xlarge" : { "Arch" : "HVM64" }, "i2.xlarge" : { "Arch" : "HVM64" }, "i2.2xlarge" : { "Arch" : "HVM64" }, "i2.4xlarge" : { "Arch" : "HVM64" }, "i2.8xlarge" : { "Arch" : "HVM64" }, "d2.xlarge" : { "Arch" : "HVM64" }, "d2.2xlarge" : { "Arch" : "HVM64" }, "d2.4xlarge" : { "Arch" : "HVM64" }, "d2.8xlarge" : { "Arch" : "HVM64" }, "hi1.4xlarge" : { "Arch" : "HVM64" }, "hs1.8xlarge" : { "Arch" : "HVM64" }, "cr1.8xlarge" : { "Arch" : "HVM64" }, "cc2.8xlarge" : { "Arch" : "HVM64" } }, "AWSRegionArch2AMI" : { "us-east-1" : {"HVM64" : "ami-0ff8a91507f77f867", "HVMG2" : "ami-0a584ac55a7631c0c"}, "us-west-2" : {"HVM64" : "ami-a0cfeed8", "HVMG2" : "ami-0e09505bc235aa82d"}, "us-west-1" : {"HVM64" : "ami-0bdb828fd58c52235", "HVMG2" : "ami-066ee5fd4a9ef77f1"}, "eu-west-1" : {"HVM64" : "ami-047bb4163c506cd98", "HVMG2" : "ami-0a7c483d527806435"}, "eu-west-2" : {"HVM64" : "ami-f976839e", "HVMG2" : "NOT_SUPPORTED"}, "eu-west-3" : {"HVM64" : "ami-0ebc281c20e89ba4b", "HVMG2" : "NOT_SUPPORTED"}, "eu-central-1" : {"HVM64" : "ami-0233214e13e500f77", "HVMG2" : "ami-06223d46a6d0661c7"}, "ap-northeast-1" : {"HVM64" : "ami-06cd52961ce9f0d85", "HVMG2" : "ami-053cdd503598e4a9d"}, "ap-northeast-2" : {"HVM64" : "ami-0a10b2721688ce9d2", "HVMG2" : "NOT_SUPPORTED"}, "ap-northeast-3" : {"HVM64" : "ami-0d98120a9fb693f07", "HVMG2" : "NOT_SUPPORTED"}, "ap-southeast-1" : {"HVM64" : "ami-08569b978cc4dfa10", "HVMG2" : "ami-0be9df32ae9f92309"}, "ap-southeast-2" : {"HVM64" : "ami-09b42976632b27e9b", "HVMG2" : "ami-0a9ce9fecc3d1daf8"}, "ap-south-1" : {"HVM64" : "ami-0912f71e06545ad88", "HVMG2" : "ami-097b15e89dbdcfcf4"}, "us-east-2" : {"HVM64" : "ami-0b59bfac6be064b78", "HVMG2" : "NOT_SUPPORTED"}, "ca-central-1" : {"HVM64" : "ami-0b18956f", "HVMG2" : "NOT_SUPPORTED"}, "sa-east-1" : {"HVM64" : "ami-07b14488da8ea02a0", "HVMG2" : "NOT_SUPPORTED"}, "cn-north-1" : {"HVM64" : "ami-0a4eaf6c4454eda75", "HVMG2" : "NOT_SUPPORTED"}, "cn-northwest-1" : {"HVM64" : "ami-6b6a7d09", "HVMG2" : "NOT_SUPPORTED"} } }, "Resources" : { "WebServerInstance": { "Type" : "AWS::EC2::Instance", "Metadata" : { "Comment" : "Install a simple PHP application", "AWS::CloudFormation::Init" : { "config" : { "packages" : { "yum" : { "httpd" : [], "php" : [] } }, "files" : { "/var/www/html/index.php" : { "content" : { "Fn::Join" : ["", [ "<?php\n", "echo '<h1>AWS CloudFormation sample PHP application</h1>';\n", "?>\n" ]]}, "mode" : "000644", "owner" : "apache", "group" : "apache" }, "/etc/cfn/cfn-hup.conf" : { "content" : { "Fn::Join" : ["", [ "[main]\n", "stack=", { "Ref" : "AWS::StackId" }, "\n", "region=", { "Ref" : "AWS::Region" }, "\n" ]]}, "mode" : "000400", "owner" : "root", "group" : "root" }, "/etc/cfn/hooks.d/cfn-auto-reloader.conf" : { "content": { "Fn::Join" : ["", [ "[cfn-auto-reloader-hook]\n", "triggers=post.update\n", "path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init\n", "action=/opt/aws/bin/cfn-init -s ", { "Ref" : "AWS::StackId" }, " -r WebServerInstance ", " --region ", { "Ref" : "AWS::Region" }, "\n", "runas=root\n" ]]} } }, "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" }, "cfn-hup" : { "enabled" : "true", "ensureRunning" : "true", "files" : ["/etc/cfn/cfn-hup.conf", "/etc/cfn/hooks.d/cfn-auto-reloader.conf"]} } } } } }, "Properties": { "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" }, { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] }, "InstanceType" : { "Ref" : "InstanceType" }, "SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ], "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash -xe\n", "yum install -y aws-cfn-bootstrap\n", "# Install the files and packages from the metadata\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServerInstance ", " --region ", { "Ref" : "AWS::Region" }, "\n", "# Start up the cfn-hup daemon to listen for changes to the Web Server metadata\n", "/opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup'\n", "# Signal the status from cfn-init\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServerInstance ", " --region ", { "Ref" : "AWS::Region" }, "\n" ]]}} }, "CreationPolicy" : { "ResourceSignal" : { "Timeout" : "PT5M" } } }, "WebServerSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP access via port 80", "SecurityGroupIngress" : [ {"IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0"} ] } } }, "Outputs" : { "WebsiteURL" : { "Description" : "Application URL", "Value" : { "Fn::Join" : ["", ["http://", { "Fn::GetAtt" : [ "WebServerInstance", "PublicDnsName" ]}]] } } } }

Cet exemple utilise une instance Amazon EC2 unique, mais vous pouvez utiliser les mêmes mécanismes pour des solutions plus complexes qui utilisent des équilibreurs de charge ELB et des groupes Amazon EC2 Auto Scaling pour gérer un ensemble de serveurs d'applications. Cependant, certains éléments spécifiques doivent être pris en compte pour les groupes Auto Scaling. Pour plus d’informations, consultez Mise à jour de groupes Auto Scaling.

Création de la pile initiale

Dans le cadre de cet exemple, nous allons utiliser AWS Management Console pour créer une pile initiale à partir de l'exemple de modèle.

Avertissement

La réalisation de cette procédure permettre de déployer les services AWS en direct. Les tarifs d'utilisation standard vous seront facturés pendant toute la durée d'exécution de ces services.

Pour créer la pile à partir d'AWS Management Console
  1. Copiez le modèle précédent et enregistrez-le localement sur votre système en tant que fichier texte. Notez son emplacement, car vous en aurez besoin pour utiliser le fichier dans une étape ultérieure.

  2. Connectez-vous à la CloudFormation console à l'adresse https://console.aws.amazon.com/cloudformation.

  3. Choisissez Create New Stack.

  4. Dans l'assistant Créer une nouvelle pile, sur l'écran Sélectionner un modèle, tapez UpdateTutorial dans le champ Nom. Sur la même page, sélectionnez Télécharger un modèle sur Amazon S3 et accédez au fichier que vous avez téléchargé lors de la première étape, puis choisissez Suivant.

  5. Sur l'écran Specify Parameters (Spécifier les paramètres), dans la case Instance Type (Type d'instance), tapez t1.micro. Ensuite, sélectionnez Suivant.

  6. Sur l'écran Options, choisissez Suivant.

  7. Sur l'écran Vérification, vérifiez que tous les paramètres correspondent à ce que vous souhaitez et choisissez Créer.

Une fois que l'état de votre pile indique CREATE_COMPLETE, l'onglet Output affiche l'URL de votre site web. Si vous choisissez la valeur de la sortie WebsiteURL, vous verrez votre nouvelle application PHP à l'œuvre.

Mise à jour de l'application

Maintenant que nous avons déployé la pile, nous allons mettre à jour l'application. Nous allons apporter une modification basique du texte qui est affiché par l'application. Pour ce faire, nous allons ajouter une commande echo dans le fichier index.php, comme illustré dans cet extrait de modèle :

"WebServerInstance": { "Type" : "AWS::EC2::Instance", "Metadata" : { "AWS::CloudFormation::Init" : { "config" : { : "files" : { "/var/www/html/index.php" : { "content" : { "Fn::Join" : ["", [ "<?php\n", "echo '<h1>AWS CloudFormation sample PHP application</h1>';\n", "echo '<p>Updated version via UpdateStack</p>';\n ", "?>\n" ]]}, "mode" : "000644", "owner" : "apache", "group" : "apache" }, : } },

Utilisez un éditeur de texte pour modifier manuellement le fichier de modèle que vous avez enregistré localement.

Nous allons maintenant mettre à jour la pile.

Pour mettre à jour la pile à partir d'AWS Management Console
  1. Connectez-vous à la console AWS CloudFormation à l'adresse : https://console.aws.amazon.com/cloudformation.

  2. Sur le tableau de bord AWS CloudFormation, choisissez la pile que vous avez créée précédemment, puis choisissez Mettre à jour la pile.

  3. Dans l'assistant Mettre à jour la pile, sur l'écran Sélectionner un modèle, sélectionnez Télécharger un modèle sur Amazon S3, sélectionnez le modèle modifié et choisissez Suivant.

  4. Sur l'écran Options, choisissez Suivant.

  5. Choisissez Suivant, car la pile n'a pas de politique de pile. Toutes les ressources peuvent être mises à jour sans politique de substitution.

  6. Sur l'écran Vérification, vérifiez que tous les paramètres correspondent à ce que vous souhaitez et choisissez Mettre à jour.

Si vous mettez à jour la pile à partir d'AWS Management Console, vous remarquerez que les paramètres qui ont été utilisés pour créer la pile initiale apparaissent déjà sur la page Paramètres de l'assistant Mettre à jour la pile. Si vous utilisez la commande aws cloudformation update-stack, veillez à taper les mêmes valeurs de paramètre que celles que vous avez utilisées initialement pour créer la pile.

Lorsque votre pile indique l'état UPDATE_COMPLETE, vous pouvez choisir la valeur de sortie WebsiteURL à nouveau pour vérifier que les modifications de votre application ont pris effet. Par défaut, le programme démon cfn-hup s'exécute toutes les 15 minutes. Par conséquent, la modification de l'application peut prendre jusqu'à 15 minutes une fois que la pile a été mise à jour.

Pour consulter l'ensemble de ressources qui ont été mises à jour, accédez à la console AWS CloudFormation. Dans l'onglet Événements, examinez les événements de la pile. Dans ce cas particulier, les métadonnées de l'instance Amazon EC2 ont WebServerInstance été mises à jour, ce qui a également entraîné AWS CloudFormation la réévaluation des autres ressources (WebServerSecurityGroup) afin de s'assurer qu'il n'y avait aucune autre modification. Aucune des autres ressources de pile n'a été modifiée. AWS CloudFormation met uniquement à jour les ressources qui sont concernées par les modifications de la pile. Ces modifications peuvent être directes, telles que des modifications de propriétés ou de métadonnées, ou elles peuvent être dues à des dépendances ou à des flux de données via Ref GetAtt, ou à d'autres fonctions de modèle intrinsèques.

Cette mise à jour simple illustre le processus. Cependant, vous pouvez apporter des modifications beaucoup plus complexes aux fichiers et aux packages qui sont déployés dans vos instances Amazon EC2. Par exemple, vous pouvez choisir d'ajouter MySQL à l'instance, ainsi que la prise en charge PHP pour MySQL. Pour ce faire, il suffit d'ajouter les packages, les fichiers et les services supplémentaires à la configuration, puis de mettre à jour la pile pour déployer les modifications. Dans l'extrait de modèle suivant, les modifications sont indiquées en rouge :

"WebServerInstance": { "Type" : "AWS::EC2::Instance", "Metadata" : { "Comment" : "Install a simple PHP application", "AWS::CloudFormation::Init" : { "config" : { "packages" : { "yum" : { "httpd" : [], "php" : [], "php-mysql" : [], "mysql-server" : [], "mysql-libs" : [], "mysql" : [] } }, : "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" }, "cfn-hup" : { "enabled" : "true", "ensureRunning" : "true", "files" : ["/etc/cfn/cfn-hup.conf", "/etc/cfn/hooks.d/cfn-auto-reloader.conf"]}, "mysqld" : { "enabled" : "true", "ensureRunning" : "true" } } } } } }, "Properties": { : } }

Vous pouvez mettre à jour les CloudFormation métadonnées pour les mettre à jour avec les nouvelles versions des packages utilisés par l'application. Dans les exemples précédents, la propriété de version de chaque package est vide, ce qui indique que cfn-init doit installer la dernière version du package.

"packages" : { "yum" : { "httpd" : [], "php" : [] }

Vous pouvez éventuellement spécifier une chaîne de version d'un package. Si vous modifiez cette chaîne de version dans les appels ultérieurs de mise à jour de la pile, la nouvelle version du package sera déployée. Voici un exemple d'utilisation des numéros de version pour les RubyGems packages. Tous les packages compatibles avec la gestion des versions peuvent inclure des versions spécifiques.

"packages" : { "rubygems" : { "mysql" : [], "rubygems-update" : ["1.6.2"], "rake" : ["0.8.7"], "rails" : ["2.3.11"] } }

Mise à jour de groupes Auto Scaling

Si vous utilisez des groupes Auto Scaling dans votre modèle, plutôt que des ressources d'instance Amazon EC2, la mise à jour de l'application fonctionne exactement de la même manière. Toutefois, AWS CloudFormationn'assure aucune synchronisation ni sérialisation entre les différentes instances Amazon EC2 d'un groupe Auto Scaling. Le programme démon cfn-hup de chaque hôte s'exécute indépendamment et met à jour l'application selon son propre calendrier. Lorsque vous utilisez cfn-hup pour mettre à jour la configuration dans les instances, chaque instance exécute les hooks de cfn-hup selon son propre calendrier. Il n'y a pas de coordination entre les instances de la pile. Notez également les points suivants :

  • Si les modifications cfn-hup sont exécutées en même temps dans toutes les instances Amazon EC2 du groupe Auto Scaling, le service sera peut-être indisponible pendant la mise à jour.

  • Si les modifications cfn-hup sont exécutées à différents moments, d'anciennes et de nouvelles versions du logiciel peuvent être exécutées en parallèle.

Pour éviter ces problèmes, pensez à imposer une mise à jour propagée dans les instances du groupe Auto Scaling. Pour plus d’informations, consultez Attribut UpdatePolicy.

Modification des propriétés de ressource

Avec AWS CloudFormation, vous pouvez modifier les propriétés d'une ressource existante dans la pile. Les sections suivantes décrivent différentes mises à jour qui permettent de résoudre des problèmes spécifiques. Toutefois, vous pouvez modifier n'importe quelle propriété de n'importe quelle ressource compatible avec la mise à jour de la pile, si nécessaire.

Mise à jour du type d'instance

La pile que nous avons développée jusqu'à présent utilise une instance Amazon EC2 t1.micro. Supposons que le site web que vous venez de créer reçoive plus de trafic que ce qu'une instance T1.micro peut gérer et que vous vouliez à présent migrer vers un type d'instance Amazon EC2 m1.small. Si l'architecture du type d'instance change, l'instance sera créée avec une autre AMI. Si vous vérifiez les mappages dans le modèle, vous verrez que les instances t1.micro et m1.small ont les mêmes architectures et utilisent les mêmes AMI Amazon Linux.

"Mappings" : { "AWSInstanceType2Arch" : { "t1.micro" : { "Arch" : "HVM64" }, "t2.nano" : { "Arch" : "HVM64" }, "t2.micro" : { "Arch" : "HVM64" }, "t2.small" : { "Arch" : "HVM64" }, "t2.medium" : { "Arch" : "HVM64" }, "t2.large" : { "Arch" : "HVM64" }, "m1.small" : { "Arch" : "HVM64" }, "m1.medium" : { "Arch" : "HVM64" }, "m1.large" : { "Arch" : "HVM64" }, "m1.xlarge" : { "Arch" : "HVM64" }, "m2.xlarge" : { "Arch" : "HVM64" }, "m2.2xlarge" : { "Arch" : "HVM64" }, "m2.4xlarge" : { "Arch" : "HVM64" }, "m3.medium" : { "Arch" : "HVM64" }, "m3.large" : { "Arch" : "HVM64" }, "m3.xlarge" : { "Arch" : "HVM64" }, "m3.2xlarge" : { "Arch" : "HVM64" }, "m4.large" : { "Arch" : "HVM64" }, "m4.xlarge" : { "Arch" : "HVM64" }, "m4.2xlarge" : { "Arch" : "HVM64" }, "m4.4xlarge" : { "Arch" : "HVM64" }, "m4.10xlarge" : { "Arch" : "HVM64" }, "c1.medium" : { "Arch" : "HVM64" }, "c1.xlarge" : { "Arch" : "HVM64" }, "c3.large" : { "Arch" : "HVM64" }, "c3.xlarge" : { "Arch" : "HVM64" }, "c3.2xlarge" : { "Arch" : "HVM64" }, "c3.4xlarge" : { "Arch" : "HVM64" }, "c3.8xlarge" : { "Arch" : "HVM64" }, "c4.large" : { "Arch" : "HVM64" }, "c4.xlarge" : { "Arch" : "HVM64" }, "c4.2xlarge" : { "Arch" : "HVM64" }, "c4.4xlarge" : { "Arch" : "HVM64" }, "c4.8xlarge" : { "Arch" : "HVM64" }, "g2.2xlarge" : { "Arch" : "HVMG2" }, "g2.8xlarge" : { "Arch" : "HVMG2" }, "r3.large" : { "Arch" : "HVM64" }, "r3.xlarge" : { "Arch" : "HVM64" }, "r3.2xlarge" : { "Arch" : "HVM64" }, "r3.4xlarge" : { "Arch" : "HVM64" }, "r3.8xlarge" : { "Arch" : "HVM64" }, "i2.xlarge" : { "Arch" : "HVM64" }, "i2.2xlarge" : { "Arch" : "HVM64" }, "i2.4xlarge" : { "Arch" : "HVM64" }, "i2.8xlarge" : { "Arch" : "HVM64" }, "d2.xlarge" : { "Arch" : "HVM64" }, "d2.2xlarge" : { "Arch" : "HVM64" }, "d2.4xlarge" : { "Arch" : "HVM64" }, "d2.8xlarge" : { "Arch" : "HVM64" }, "hi1.4xlarge" : { "Arch" : "HVM64" }, "hs1.8xlarge" : { "Arch" : "HVM64" }, "cr1.8xlarge" : { "Arch" : "HVM64" }, "cc2.8xlarge" : { "Arch" : "HVM64" } }, "AWSRegionArch2AMI" : { "us-east-1" : {"HVM64" : "ami-0ff8a91507f77f867", "HVMG2" : "ami-0a584ac55a7631c0c"}, "us-west-2" : {"HVM64" : "ami-a0cfeed8", "HVMG2" : "ami-0e09505bc235aa82d"}, "us-west-1" : {"HVM64" : "ami-0bdb828fd58c52235", "HVMG2" : "ami-066ee5fd4a9ef77f1"}, "eu-west-1" : {"HVM64" : "ami-047bb4163c506cd98", "HVMG2" : "ami-0a7c483d527806435"}, "eu-west-2" : {"HVM64" : "ami-f976839e", "HVMG2" : "NOT_SUPPORTED"}, "eu-west-3" : {"HVM64" : "ami-0ebc281c20e89ba4b", "HVMG2" : "NOT_SUPPORTED"}, "eu-central-1" : {"HVM64" : "ami-0233214e13e500f77", "HVMG2" : "ami-06223d46a6d0661c7"}, "ap-northeast-1" : {"HVM64" : "ami-06cd52961ce9f0d85", "HVMG2" : "ami-053cdd503598e4a9d"}, "ap-northeast-2" : {"HVM64" : "ami-0a10b2721688ce9d2", "HVMG2" : "NOT_SUPPORTED"}, "ap-northeast-3" : {"HVM64" : "ami-0d98120a9fb693f07", "HVMG2" : "NOT_SUPPORTED"}, "ap-southeast-1" : {"HVM64" : "ami-08569b978cc4dfa10", "HVMG2" : "ami-0be9df32ae9f92309"}, "ap-southeast-2" : {"HVM64" : "ami-09b42976632b27e9b", "HVMG2" : "ami-0a9ce9fecc3d1daf8"}, "ap-south-1" : {"HVM64" : "ami-0912f71e06545ad88", "HVMG2" : "ami-097b15e89dbdcfcf4"}, "us-east-2" : {"HVM64" : "ami-0b59bfac6be064b78", "HVMG2" : "NOT_SUPPORTED"}, "ca-central-1" : {"HVM64" : "ami-0b18956f", "HVMG2" : "NOT_SUPPORTED"}, "sa-east-1" : {"HVM64" : "ami-07b14488da8ea02a0", "HVMG2" : "NOT_SUPPORTED"}, "cn-north-1" : {"HVM64" : "ami-0a4eaf6c4454eda75", "HVMG2" : "NOT_SUPPORTED"}, "cn-northwest-1" : {"HVM64" : "ami-6b6a7d09", "HVMG2" : "NOT_SUPPORTED"} }

Utilisons à présent le modèle que nous avons modifié dans la section précédente pour modifier le type d'instance. Comme InstanceType il s'agissait d'un paramètre d'entrée du modèle, il n'est pas nécessaire de le modifier ; nous pouvons modifier la valeur du paramètre dans l'assistant Stack Update, sur la page Spécifier les paramètres.

Pour mettre à jour la pile à partir d'AWS Management Console
  1. Connectez-vous à la console AWS CloudFormation à l'adresse https://console.aws.amazon.com/cloudformation.

  2. Sur le CloudFormation tableau de bord, choisissez la pile que vous avez créée précédemment, puis choisissez Update Stack.

  3. Dans l'assistant Mettre à jour la pile, sur l'écran Sélectionner un modèle, sélectionnez Utiliser modèle en cours, puis choisissez Suivant.

    La page Spécifier les détails affiche les paramètres qui ont servi à créer la pile initiale, préremplis dans la section Specify Parameters (Spécifier les paramètres).

  4. Modifiez la valeur de la zone de InstanceTypetexte de t1.micro àm1.small. Ensuite, choisissez Suivant.

  5. Sur l'écran Options, choisissez Suivant.

  6. Choisissez Suivant, car la pile n'a pas de politique de pile. Toutes les ressources peuvent être mises à jour sans politique de substitution.

  7. Sur l'écran Vérification, vérifiez que tous les paramètres correspondent à ce que vous souhaitez et choisissez Mettre à jour.

Vous pouvez modifier dynamiquement le type d'une instance Amazon EC2 basée sur EBS en démarrant et en arrêtant l'instance. AWS CloudFormation tente d'optimiser la modification en mettant à jour le type d'instance et en redémarrant l'instance, afin que l'ID d'instance ne change pas. Toutefois, au redémarrage de l'instance, l'adresse IP publique de cette dernière change. Pour vous assurer que l'adresse IP Elastic est liée correctement après la modification, AWS CloudFormation met également à jour l'adresse IP Elastic. Vous pouvez voir les modifications dans l'onglet Events de la console AWS CloudFormation.

Pour vérifier le type d'instance à partir d'AWS Management Console, ouvrez la console Amazon EC2 et localisez-y votre instance.

Mise à jour de l'AMI dans une instance Amazon EC2

Examinons à présent comment nous pouvons modifier Amazon Machine Image (AMI) exécutée dans l'instance. Nous allons lancer la modification de l'AMI en mettant à jour la pile pour utiliser un nouveau type d'instance Amazon EC2, tels que t2.medium, qui est un type d'instance HVM64.

Dans la section précédente, nous utiliserons notre modèle existant pour modifier le type d'instance utilisé par notre exemple de pile. Sur la page Specify Parameters de l'assistant Stack Update, modifiez la valeur du type d'instance.

Dans ce cas, nous ne pouvons pas simplement démarrer et arrêter l'instance pour modifier l'AMI. AWS CloudFormation considère qu'il s'agit d'une modification apportée à une propriété immuable de la ressource. Afin d'apporter une modification à une propriété immuable, AWS CloudFormation doit lancer une ressource de remplacement (dans le cas présent, une nouvelle instance Amazon EC2 qui exécute la nouvelle AMI).

Une fois que la nouvelle instance est en cours d'exécution, AWS CloudFormation met à jour les autres ressources de la pile de sorte à renvoyer vers la nouvelle ressource. Lorsque toutes les nouvelles ressources sont créées, l'ancienne ressource est supprimée. Ce processus s'appelle UPDATE_CLEANUP. Cette fois-ci, vous remarquerez que l'ID d'instance et l'URL d'application de l'instance dans la pile ont changé suite à la mise à jour. Les événements du tableau Event contiennent la description « Requested update has a change to an immutable property and hence creating a new physical resource » pour indiquer qu'une ressource a été remplacée.

Si l'AMI que vous souhaitez mettre à jour inclut le code de l'application, vous pouvez utiliser le même mécanisme de mise à jour de la pile pour mettre à jour l'AMI afin de charger votre nouvelle application.

Pour mettre à jour l'AMI d'une instance dans votre pile
  1. Créez les nouvelles AMI contenant les modifications de votre application ou de votre système d'exploitation. Pour plus d'informations, accédez à Création de vos propres AMI dans le Amazon EC2 Guide de l'utilisateur pour les instances Linux.

  2. Mettez à jour votre modèle pour intégrer les nouveaux ID d'AMI.

  3. Mettez à jour la pile à partir de la AWS Management Console, comme indiqué dans Mise à jour de l'application, ou à l'aide de la commande AWS aws cloudformation update-stack.

Lorsque vous mettez à jour la pile, vous CloudFormation détectez que l'ID de l'AMI a changé, puis cela déclenche une mise à jour de la pile de la même manière que nous avons initié la mise à jour ci-dessus.

Mise à jour de la configuration de lancement Amazon EC2 pour un groupe Auto Scaling

Si vous utilisez des groupes Auto Scaling plutôt que des instances Amazon EC2, le processus de mise à jour des instances en cours d'exécution est légèrement différent. Avec des ressources Auto Scaling, la configuration des instances Amazon EC2, telle que le type d'instance ou l'ID AMI, est encapsulée dans la configuration de lancement Auto Scaling. Vous pouvez apporter des modifications à la configuration de lancement de la même manière que nous avons modifié les ressources d'instance Amazon EC2 dans les sections précédentes. Cependant, la modification de la configuration de lancement n'a pas impact sur les instances Amazon EC2 en cours d'exécution dans le groupe Auto Scaling. Une configuration de lancement mise à jour s'applique uniquement aux instances qui sont créées après la mise à jour.

Si vous souhaitez propager la modification à votre configuration de lancement dans toutes les instances de votre groupe Auto Scaling, vous pouvez utiliser un attribut de mise à jour. Pour plus d’informations, consultez Attribut UpdatePolicy.

Ajout de propriétés de ressource

Jusqu'ici, nous nous sommes intéressés à la modification des propriétés existantes d'une ressource dans un modèle. Vous pouvez également ajouter des propriétés qui n'étaient pas initialement spécifiées dans le modèle. Pour illustrer ce propos, nous allons ajouter une paire de clés Amazon EC2 à une instance EC2 existante, puis ouvrir le port 22 dans le groupe de sécurité Amazon EC2 afin que vous puissiez utiliser SSH (Secure Shell) pour accéder à l'instance.

Ajout d'une paire de clés à une Instance

Pour ajouter l'accès SSH à une instance Amazon EC2 existante
  1. Ajoutez deux paramètres supplémentaires au modèle pour transmettre le nom d'une paire de clés Amazon EC2 existante et l'emplacement SSH.

    "Parameters" : { "KeyName" : { "Description" : "Name of an existing Amazon EC2 key pair for SSH access", "Type": "AWS::EC2::KeyPair::KeyName" }, "SSHLocation" : { "Description" : " The IP address range that can be used to SSH to the EC2 instances", "Type": "String", "MinLength": "9", "MaxLength": "18", "Default": "0.0.0.0/0", "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})", "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x." } : },
  2. Ajoutez la KeyName propriété à l'instance Amazon EC2.

    "WebServerInstance": { "Type" : "AWS::EC2::Instance", : "Properties": { : "KeyName" : { "Ref" : "KeyName" }, : } },
  3. Ajoutez le port 22 ainsi que l'emplacement SSH aux règles de trafic entrant du groupe de sécurité Amazon EC2.

    "WebServerSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP and SSH", "SecurityGroupIngress" : [ {"IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : { "Ref" : "SSHLocation"}}, {"IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0"} ] } },
  4. Mettez à jour la pile à partir de la AWS Management Console, comme indiqué dans Mise à jour de l'application, ou à l'aide de la commande AWS aws cloudformation update-stack.

Modification des ressources de la pile

Étant donné que les besoins d'une application peuvent changer au fil du temps, AWS CloudFormation vous permet de modifier l'ensemble de ressources qui constituent la pile. Pour illustrer cela, nous allons convertir l'application à instance unique provenant de Ajout de propriétés de ressource en application à équilibrage de charge et à dimensionnement automatique en mettant à jour la pile.

De cette manière, nous allons créer application PHP simple à instance unique à l'aide d'une adresse IP Elastic. Nous allons maintenant modifier les ressources de l'application lors d'une mise à jour afin de la transformer en application hautement disponible à équilibrage de charge et à dimensionnement automatique.

  1. Ajoutez une ressource Elastic Load Balancer.

    "ElasticLoadBalancer" : { "Type" : "AWS::ElasticLoadBalancing::LoadBalancer", "Properties" : { "CrossZone" : "true", "AvailabilityZones" : { "Fn::GetAZs" : "" }, "LBCookieStickinessPolicy" : [ { "PolicyName" : "CookieBasedPolicy", "CookieExpirationPeriod" : "30" } ], "Listeners" : [ { "LoadBalancerPort" : "80", "InstancePort" : "80", "Protocol" : "HTTP", "PolicyNames" : [ "CookieBasedPolicy" ] } ], "HealthCheck" : { "Target" : "HTTP:80/", "HealthyThreshold" : "2", "UnhealthyThreshold" : "5", "Interval" : "10", "Timeout" : "5" } } }
  2. Convertissez l'instance EC2 du modèle en configuration de lancement Auto Scaling. Comme les propriétés sont identiques, nous devons uniquement remplacer le type de nom :

    "WebServerInstance": { "Type" : "AWS::EC2::Instance",

    par :

    "LaunchConfig": { "Type" : "AWS::AutoScaling::LaunchConfiguration",

    Pour des raisons de clarté dans le modèle, nous avons changé le nom de la ressource de WebServerInstanceà LaunchConfig. Vous devrez donc mettre à jour le nom de la ressource référencé par cfn-init et cfn-hup (il suffit de le rechercher et de le remplacer par, sauf pour WebServerInstance cfn-signal). LaunchConfig Pour cfn-signal, vous devez signaler le groupe Auto Scaling (WebServerGroup) et non l'instance, comme indiqué dans l'extrait suivant :

    "# Signal the status from cfn-init\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServerGroup ", " --region ", { "Ref" : "AWS::Region" }, "\n"
  3. Ajoutez une ressource de groupe Auto Scaling.

    "WebServerGroup" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "AvailabilityZones" : { "Fn::GetAZs" : "" }, "LaunchConfigurationName" : { "Ref" : "LaunchConfig" }, "MinSize" : "1", "DesiredCapacity" : "1", "MaxSize" : "5", "LoadBalancerNames" : [ { "Ref" : "ElasticLoadBalancer" } ] }, "CreationPolicy" : { "ResourceSignal" : { "Timeout" : "PT15M" } }, "UpdatePolicy": { "AutoScalingRollingUpdate": { "MinInstancesInService": "1", "MaxBatchSize": "1", "PauseTime" : "PT15M", "WaitOnResourceSignals": "true" } } }
  4. Mettez à jour la définition du groupe de sécurité pour limiter le trafic aux instances issues de l'équilibreur de charge.

    "WebServerSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP access via port 80 locked down to the ELB and SSH access", "SecurityGroupIngress" : [ {"IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "SourceSecurityGroupOwnerId" : {"Fn::GetAtt" : ["ElasticLoadBalancer", "SourceSecurityGroup.OwnerAlias"]}, "SourceSecurityGroupName" : {"Fn::GetAtt" : ["ElasticLoadBalancer", "SourceSecurityGroup.GroupName"]}}, {"IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : { "Ref" : "SSHLocation"}} ] } }
  5. Mettez à jour les sorties pour renvoyer le nom DNS de l'équilibreur de charge ELB en tant qu'emplacement de l'application à partir de :

    "WebsiteURL" : { "Value" : { "Fn::Join" : ["", ["http://", { "Fn::GetAtt" : [ "WebServerInstance", "PublicDnsName" ]}]]}, "Description" : "Application URL" }

    par :

    "WebsiteURL" : { "Value" : { "Fn::Join" : ["", ["http://", { "Fn::GetAtt" : [ "ElasticLoadBalancer", "DNSName" ]}]]}, "Description" : "Application URL" }

Pour référence, l'exemple suivant illustre le modèle complet. Si vous utilisez ce modèle pour mettre à jour la pile, vous convertirez votre application simple à instance unique en application Multi-AZ hautement disponible à équilibrage de charge et à dimensionnement automatique. Seules les ressources qui doivent être mises à jour seront modifiées. Dès lors, si cette application inclut des magasins de données, les données seront préservées. Désormais, vous pouvez utiliser AWS CloudFormation pour développer ou améliorer vos piles à mesure que vos besoins évoluent.

{ "AWSTemplateFormatVersion" : "2010-09-09", "Description" : "AWS CloudFormation Sample Template: Sample template that can be used to test EC2 updates. **WARNING** This template creates an Amazon Ec2 Instance. You will be billed for the AWS resources used if you create a stack from this template.", "Parameters" : { "KeyName": { "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instance", "Type": "AWS::EC2::KeyPair::KeyName", "ConstraintDescription" : "must be the name of an existing EC2 KeyPair." }, "SSHLocation" : { "Description" : " The IP address range that can be used to SSH to the EC2 instances", "Type": "String", "MinLength": "9", "MaxLength": "18", "Default": "0.0.0.0/0", "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})", "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x." }, "InstanceType" : { "Description" : "WebServer EC2 instance type", "Type" : "String", "Default" : "t2.small", "AllowedValues" : [ "t1.micro", "t2.nano", "t2.micro", "t2.small", "t2.medium", "t2.large", "m1.small", "m1.medium", "m1.large", "m1.xlarge", "m2.xlarge", "m2.2xlarge", "m2.4xlarge", "m3.medium", "m3.large", "m3.xlarge", "m3.2xlarge", "m4.large", "m4.xlarge", "m4.2xlarge", "m4.4xlarge", "m4.10xlarge", "c1.medium", "c1.xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "c4.large", "c4.xlarge", "c4.2xlarge", "c4.4xlarge", "c4.8xlarge", "g2.2xlarge", "g2.8xlarge", "r3.large", "r3.xlarge", "r3.2xlarge", "r3.4xlarge", "r3.8xlarge", "i2.xlarge", "i2.2xlarge", "i2.4xlarge", "i2.8xlarge", "d2.xlarge", "d2.2xlarge", "d2.4xlarge", "d2.8xlarge", "hi1.4xlarge", "hs1.8xlarge", "cr1.8xlarge", "cc2.8xlarge", "cg1.4xlarge" ], "ConstraintDescription" : "must be a valid EC2 instance type." } }, "Mappings" : { "AWSInstanceType2Arch" : { "t1.micro" : { "Arch" : "HVM64" }, "t2.nano" : { "Arch" : "HVM64" }, "t2.micro" : { "Arch" : "HVM64" }, "t2.small" : { "Arch" : "HVM64" }, "t2.medium" : { "Arch" : "HVM64" }, "t2.large" : { "Arch" : "HVM64" }, "m1.small" : { "Arch" : "HVM64" }, "m1.medium" : { "Arch" : "HVM64" }, "m1.large" : { "Arch" : "HVM64" }, "m1.xlarge" : { "Arch" : "HVM64" }, "m2.xlarge" : { "Arch" : "HVM64" }, "m2.2xlarge" : { "Arch" : "HVM64" }, "m2.4xlarge" : { "Arch" : "HVM64" }, "m3.medium" : { "Arch" : "HVM64" }, "m3.large" : { "Arch" : "HVM64" }, "m3.xlarge" : { "Arch" : "HVM64" }, "m3.2xlarge" : { "Arch" : "HVM64" }, "m4.large" : { "Arch" : "HVM64" }, "m4.xlarge" : { "Arch" : "HVM64" }, "m4.2xlarge" : { "Arch" : "HVM64" }, "m4.4xlarge" : { "Arch" : "HVM64" }, "m4.10xlarge" : { "Arch" : "HVM64" }, "c1.medium" : { "Arch" : "HVM64" }, "c1.xlarge" : { "Arch" : "HVM64" }, "c3.large" : { "Arch" : "HVM64" }, "c3.xlarge" : { "Arch" : "HVM64" }, "c3.2xlarge" : { "Arch" : "HVM64" }, "c3.4xlarge" : { "Arch" : "HVM64" }, "c3.8xlarge" : { "Arch" : "HVM64" }, "c4.large" : { "Arch" : "HVM64" }, "c4.xlarge" : { "Arch" : "HVM64" }, "c4.2xlarge" : { "Arch" : "HVM64" }, "c4.4xlarge" : { "Arch" : "HVM64" }, "c4.8xlarge" : { "Arch" : "HVM64" }, "g2.2xlarge" : { "Arch" : "HVMG2" }, "g2.8xlarge" : { "Arch" : "HVMG2" }, "r3.large" : { "Arch" : "HVM64" }, "r3.xlarge" : { "Arch" : "HVM64" }, "r3.2xlarge" : { "Arch" : "HVM64" }, "r3.4xlarge" : { "Arch" : "HVM64" }, "r3.8xlarge" : { "Arch" : "HVM64" }, "i2.xlarge" : { "Arch" : "HVM64" }, "i2.2xlarge" : { "Arch" : "HVM64" }, "i2.4xlarge" : { "Arch" : "HVM64" }, "i2.8xlarge" : { "Arch" : "HVM64" }, "d2.xlarge" : { "Arch" : "HVM64" }, "d2.2xlarge" : { "Arch" : "HVM64" }, "d2.4xlarge" : { "Arch" : "HVM64" }, "d2.8xlarge" : { "Arch" : "HVM64" }, "hi1.4xlarge" : { "Arch" : "HVM64" }, "hs1.8xlarge" : { "Arch" : "HVM64" }, "cr1.8xlarge" : { "Arch" : "HVM64" }, "cc2.8xlarge" : { "Arch" : "HVM64" } }, "AWSRegionArch2AMI" : { "us-east-1" : {"HVM64" : "ami-0ff8a91507f77f867", "HVMG2" : "ami-0a584ac55a7631c0c"}, "us-west-2" : {"HVM64" : "ami-a0cfeed8", "HVMG2" : "ami-0e09505bc235aa82d"}, "us-west-1" : {"HVM64" : "ami-0bdb828fd58c52235", "HVMG2" : "ami-066ee5fd4a9ef77f1"}, "eu-west-1" : {"HVM64" : "ami-047bb4163c506cd98", "HVMG2" : "ami-0a7c483d527806435"}, "eu-west-2" : {"HVM64" : "ami-f976839e", "HVMG2" : "NOT_SUPPORTED"}, "eu-west-3" : {"HVM64" : "ami-0ebc281c20e89ba4b", "HVMG2" : "NOT_SUPPORTED"}, "eu-central-1" : {"HVM64" : "ami-0233214e13e500f77", "HVMG2" : "ami-06223d46a6d0661c7"}, "ap-northeast-1" : {"HVM64" : "ami-06cd52961ce9f0d85", "HVMG2" : "ami-053cdd503598e4a9d"}, "ap-northeast-2" : {"HVM64" : "ami-0a10b2721688ce9d2", "HVMG2" : "NOT_SUPPORTED"}, "ap-northeast-3" : {"HVM64" : "ami-0d98120a9fb693f07", "HVMG2" : "NOT_SUPPORTED"}, "ap-southeast-1" : {"HVM64" : "ami-08569b978cc4dfa10", "HVMG2" : "ami-0be9df32ae9f92309"}, "ap-southeast-2" : {"HVM64" : "ami-09b42976632b27e9b", "HVMG2" : "ami-0a9ce9fecc3d1daf8"}, "ap-south-1" : {"HVM64" : "ami-0912f71e06545ad88", "HVMG2" : "ami-097b15e89dbdcfcf4"}, "us-east-2" : {"HVM64" : "ami-0b59bfac6be064b78", "HVMG2" : "NOT_SUPPORTED"}, "ca-central-1" : {"HVM64" : "ami-0b18956f", "HVMG2" : "NOT_SUPPORTED"}, "sa-east-1" : {"HVM64" : "ami-07b14488da8ea02a0", "HVMG2" : "NOT_SUPPORTED"}, "cn-north-1" : {"HVM64" : "ami-0a4eaf6c4454eda75", "HVMG2" : "NOT_SUPPORTED"}, "cn-northwest-1" : {"HVM64" : "ami-6b6a7d09", "HVMG2" : "NOT_SUPPORTED"} } }, "Resources" : { "ElasticLoadBalancer" : { "Type" : "AWS::ElasticLoadBalancing::LoadBalancer", "Properties" : { "CrossZone" : "true", "AvailabilityZones" : { "Fn::GetAZs" : "" }, "LBCookieStickinessPolicy" : [ { "PolicyName" : "CookieBasedPolicy", "CookieExpirationPeriod" : "30" } ], "Listeners" : [ { "LoadBalancerPort" : "80", "InstancePort" : "80", "Protocol" : "HTTP", "PolicyNames" : [ "CookieBasedPolicy" ] } ], "HealthCheck" : { "Target" : "HTTP:80/", "HealthyThreshold" : "2", "UnhealthyThreshold" : "5", "Interval" : "10", "Timeout" : "5" } } }, "WebServerGroup" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "AvailabilityZones" : { "Fn::GetAZs" : "" }, "LaunchConfigurationName" : { "Ref" : "LaunchConfig" }, "MinSize" : "1", "DesiredCapacity" : "1", "MaxSize" : "5", "LoadBalancerNames" : [ { "Ref" : "ElasticLoadBalancer" } ] }, "CreationPolicy" : { "ResourceSignal" : { "Timeout" : "PT15M" } }, "UpdatePolicy": { "AutoScalingRollingUpdate": { "MinInstancesInService": "1", "MaxBatchSize": "1", "PauseTime" : "PT15M", "WaitOnResourceSignals": "true" } } }, "LaunchConfig": { "Type" : "AWS::AutoScaling::LaunchConfiguration", "Metadata" : { "Comment" : "Install a simple PHP application", "AWS::CloudFormation::Init" : { "config" : { "packages" : { "yum" : { "httpd" : [], "php" : [] } }, "files" : { "/var/www/html/index.php" : { "content" : { "Fn::Join" : ["", [ "<?php\n", "echo '<h1>AWS CloudFormation sample PHP application</h1>';\n", "echo 'Updated version via UpdateStack';\n ", "?>\n" ]]}, "mode" : "000644", "owner" : "apache", "group" : "apache" }, "/etc/cfn/cfn-hup.conf" : { "content" : { "Fn::Join" : ["", [ "[main]\n", "stack=", { "Ref" : "AWS::StackId" }, "\n", "region=", { "Ref" : "AWS::Region" }, "\n" ]]}, "mode" : "000400", "owner" : "root", "group" : "root" }, "/etc/cfn/hooks.d/cfn-auto-reloader.conf" : { "content": { "Fn::Join" : ["", [ "[cfn-auto-reloader-hook]\n", "triggers=post.update\n", "path=Resources.LaunchConfig.Metadata.AWS::CloudFormation::Init\n", "action=/opt/aws/bin/cfn-init -s ", { "Ref" : "AWS::StackId" }, " -r LaunchConfig ", " --region ", { "Ref" : "AWS::Region" }, "\n", "runas=root\n" ]]} } }, "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" }, "cfn-hup" : { "enabled" : "true", "ensureRunning" : "true", "files" : ["/etc/cfn/cfn-hup.conf", "/etc/cfn/hooks.d/cfn-auto-reloader.conf"]} } } } } }, "Properties": { "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" }, { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] }, "InstanceType" : { "Ref" : "InstanceType" }, "KeyName" : { "Ref" : "KeyName" }, "SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ], "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash -xe\n", "yum install -y aws-cfn-bootstrap\n", "# Install the files and packages from the metadata\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource LaunchConfig ", " --region ", { "Ref" : "AWS::Region" }, "\n", "# Start up the cfn-hup daemon to listen for changes to the Web Server metadata\n", "/opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup'\n", "# Signal the status from cfn-init\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServerGroup ", " --region ", { "Ref" : "AWS::Region" }, "\n" ]]}} } }, "WebServerSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP access via port 80 locked down to the ELB and SSH access", "SecurityGroupIngress" : [ {"IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "SourceSecurityGroupOwnerId" : {"Fn::GetAtt" : ["ElasticLoadBalancer", "SourceSecurityGroup.OwnerAlias"]},"SourceSecurityGroupName" : {"Fn::GetAtt" : ["ElasticLoadBalancer", "SourceSecurityGroup.GroupName"]}}, {"IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : { "Ref" : "SSHLocation"}} ] } } }, "Outputs" : { "WebsiteURL" : { "Description" : "Application URL", "Value" : { "Fn::Join" : ["", ["http://", { "Fn::GetAtt" : [ "ElasticLoadBalancer", "DNSName" ]}]] } } } }

Considérations en matière d'impact et de disponibilité

Différentes propriétés ont des impacts distincts sur les ressources de la pile. Vous pouvez utiliser CloudFormation pour mettre à jour n'importe quelle propriété. Toutefois, avant d'effectuer des modifications, posez-vous les questions suivantes :

  1. Comment la mise à jour affectera-t-elle la ressource elle-même ? Par exemple, la mise à jour d'un seuil d'alarme désactivera l'alarme pendant la mise à jour. Comme nous l'avons vu, la modification du type d'instance nécessite l'arrêt et le redémarrage de l'instance. AWS CloudFormation utilise des actions de mise à jour ou de modification pour que les ressources sous-jacentes apportent les modifications aux ressources. Pour comprendre l'impact des mises à jour, consultez la documentation des ressources spécifiques.

  2. La modification est-elle réversible ou immuable ? Certaines modifications des propriétés de ressource, telles que la modification de l'AMI dans une instance Amazon EC2, ne sont pas prises en charge par les services sous-jacents. Dans le cas de modifications modifiables, CloudFormation utilisera les API de type Update ou Modify pour les ressources sous-jacentes. Pour les modifications de propriétés immuables, CloudFormation créera de nouvelles ressources avec les propriétés mises à jour, puis les liera à la pile avant de supprimer les anciennes ressources. Bien que l'on CloudFormation essaie de réduire le temps d'arrêt des ressources de la pile, le remplacement d'une ressource est un processus en plusieurs étapes qui prend du temps. Au cours de la reconfiguration de la pile, votre application ne sera pas entièrement opérationnelle. Par exemple, il ne peut-être qu'elle ne parvienne pas à traiter les requêtes ou à accéder à une base de données.

Ressources connexes

Pour plus d'informations sur l'utilisation CloudFormation pour démarrer des applications et sur l'intégration à d'autres services de configuration et de déploiement tels que Puppet et Opscode Chef, consultez les livres blancs suivants :

Le modèle utilisé dans cette section est un exemple d'application PHP « Hello, World ». La bibliothèque de modèles contient également un ElastiCache exemple de modèle Amazon qui montre comment intégrer une application PHP à l' ElasticCache aide de cfn-hup et cfn-init pour répondre aux modifications de la configuration du cluster Amazon ElastiCache Cache, qui peuvent toutes être effectuées par Update Stack.