Mise à jour d'une pile
Avec CloudFormation, vous pouvez mettre à jour les propriétés des ressources dans vos piles existantes. Ces modifications peuvent aller d'ajustements simples d'un configuration, tels que la mise à jour du seuil d'une alarme CloudWatch, à des modifications plus complexes, telles que la mise à jour de l'Amazon Machine Image (AMI) exécutée dans 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 :
-
Création de la pile initiale : créez une pile à l’aide d’une AMI Amazon Linux de base, en installant le serveur Web Apache et une application PHP simple à l’aide des scripts d’aide CloudFormation.
-
Mise à jour de l'application : mise à jour de l'un des fichiers de l'application et déploiement du logiciel à l'aide de CloudFormation.
-
Mise à jour du type d'instance : modification du type d'instance Amazon EC2 sous-jacente.
-
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.
-
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.
-
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 Properties de la définition d'instance Amazon EC2, la propriété UserData contient le script CloudInit 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 dans Amazon S3, dans GitHub ou dans un autre référentiel, puis référencés à partir du modèle. CloudFormation peut télécharger des packages (par exemple, RPM ou RubyGems), ainsi que des fichiers individuels de référence, et développer des fichiers .zip et .tar pour créer des artefacts d'application dans 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. À l’aide du démon cfn-hup, vous pouvez mettre à jour des logiciels d’application, tels que la version d’Apache ou de PHP, ou vous pouvez mettre à jour le fichier d’application PHP lui-même à partir de 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 de plus amples 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
-
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.
-
Connectez-vous à la console CloudFormation à l'adresse https://console.aws.amazon.com/cloudformation
. -
Choisissez Create New Stack.
-
Dans l’assistant Créer une nouvelle pile, sur l’écran Sélectionner un modèle, tapez
UpdateTutorialdans 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. -
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. -
Sur l'écran Options, choisissez Suivant.
-
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
-
Connectez-vous à la console CloudFormation, à l’adresse : https://console.aws.amazon.com/cloudformation
. -
Sur le tableau de bord CloudFormation, choisissez la pile que vous avez créée précédemment, puis choisissez Mettre à jour la pile.
-
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.
-
Sur l'écran Options, choisissez Suivant.
-
Choisissez Suivant, car la pile n'a pas de politique de pile. Toutes les ressources peuvent être mises à jour sans politique de substitution.
-
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 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 voir l’ensemble des ressources qui ont été mises à jour, accédez à la console 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 WebServerInstance ont été mises à jour, suite à quoi CloudFormation a réévalué également les autres ressources (WebServerSecurityGroup) pour s’assurer qu’il n’y avait pas d’autres modifications. Aucune des autres ressources de la pile n’a été modifiée. CloudFormation met uniquement à jour les ressources qui sont concernées par les modifications de la pile. Ces modifications peuvent être directes (modifications de propriété ou de métadonnées, par exemple) ou elles peuvent être le résultat de dépendances ou de flux de données d'une fonction Ref, d'un fonction GetAtt ou de toute autre fonction intrinsèque de modèle. Pour plus d’informations, consultez la Référence des fonctions 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 métadonnées CloudFormation pour installer 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 packages RubyGems. 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, CloudFormation n’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, voir la section consécrée à l'Attribut UpdatePolicy.
Modification des propriétés de ressource
Avec 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 la propriété InstanceType est un paramètre d'entrée du modèle, nous n'avons pas besoin de modifier le modèle. Nous pouvons modifier la valeur de ce paramètre sur la page Specify Parameters de l'assistant Stack Update.
Pour mettre à jour la pile à partir d' AWS Management Console
-
Connectez-vous à la console CloudFormation à l'adresse https://console.aws.amazon.com/cloudformation
. -
Sur le tableau de bord CloudFormation, choisissez la pile que vous avez créée précédemment, puis choisissez Mettre à jour la pile.
-
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).
-
Remplacez la valeur de la zone de texte InstanceType
t1.microparm1.small. Ensuite, choisissez Suivant. -
Sur l'écran Options, choisissez Suivant.
-
Choisissez Suivant, car la pile n'a pas de politique de pile. Toutes les ressources peuvent être mises à jour sans politique de substitution.
-
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’instance d’une instance Amazon EC2 soutenue par EBS en démarrant et en arrêtant l’instance. CloudFormation tente d’optimiser la modification en mettant à jour le type d’instance et en redémarrant l’instance, de sorte que l’ID de l’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, CloudFormation met également à jour l’adresse IP Elastic. Vous pouvez voir les modifications dans la console CloudFormation, sous l’onglet Événements.
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. 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, 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, 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, un processus appelé 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
-
Créez les nouvelles AMI contenant les modifications de votre application ou de votre système d'exploitation. Pour plus d’informations, consultez Créer une AMI basée sur Amazon EBS dans le Guide de l’utilisateur Amazon EC2.
-
Mettez à jour votre modèle pour intégrer les nouveaux ID d'AMI.
-
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 update-stack.
Lorsque vous mettez à jour la pile, CloudFormation détecte que l'ID AMI a changé. Il déclenche donc une mise à jour de la pile de la même manière que celle que nous avons lancée 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, voir la section consécrée à l'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
-
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." } : }, -
Ajoutez la propriété KeyName à l'instance Amazon EC2.
"WebServerInstance": { "Type" : "AWS::EC2::Instance", : "Properties": { :"KeyName" : { "Ref" : "KeyName" },: } }, -
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"} ] } }, -
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 update-stack.
Modification des ressources de la pile
Étant donné que les besoins d’une application peuvent changer au fil du temps, CloudFormation vous permet de modifier le jeu 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.
-
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" } } } -
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 plus de clarté dans le modèle, nous avons remplacé le nom de la ressource WebServerInstance par LaunchConfig. Par conséquent, vous devrez mettre à jour le nom de ressource référencé par cfn-init et cfn-hup (pour ce faire, il suffit de rechercher le terme WebServerInstance et de le remplacer par LaunchConfig, sauf dans cfn-signal). Pour cfn-signal, vous devez envoyer un signal au groupe Auto Scaling (WebServerGroup), pas à l'instance, comme illustré dans l'extrait suivant :
"# Signal the status from cfn-init\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref" : "AWS::StackName" }, " --resourceWebServerGroup", " --region ", { "Ref" : "AWS::Region" }, "\n" -
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" } } } -
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"}} ] } } -
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 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 :
-
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. CloudFormation utilise les actions de mise à jour ou de modification des ressources sous-jacentes pour apporter des modifications aux ressources. Pour comprendre l'impact des mises à jour, consultez la documentation des ressources spécifiques.
-
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. En cas de modifications réversibles, CloudFormation utilise les API de mise à jour ou de modification du type pour les ressources sous-jacentes. En cas de modifications de propriété immuables, CloudFormation crée d'autres ressources avec les propriétés mises à jour, puis les associent à la pile avant de supprimer les anciennes ressources. Bien que CloudFormation tente de réduire le délai pendant lequel les ressources de la pile sont indisponibles, 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 de CloudFormation pour démarrer des applications et sur l'intégration avec d'autres services de configuration et de déploiement, comme 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 exemple de modèle Amazon ElastiCache qui montre comment intégrer une application PHP avec ElasticCache à l'aide de cfn-hup et de cfn-init pour répondre aux modifications de la configuration du cluster de cache Amazon ElastiCache. Tout cela peut être réalisé par une mise à jour de la pile.