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.
Mise à jour d'une pile
Avec CloudFormation, vous pouvez mettre à jour les propriétés des ressources de 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 EC2 instance Amazon. La plupart des AWS ressources d'un modèle peuvent être mises à jour, et nous continuons à ajouter du support pour d'autres.
Cette section décrit une progression simple des mises à jour d'une pile en cours d'exécution. Il montre comment l'utilisation de modèles permet d'utiliser un système de contrôle de version pour la configuration de votre AWS infrastructure, 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 en utilisant une base Amazon LinuxAMI, en installant le serveur Web Apache et une PHP application simple à l'aide des scripts d' CloudFormationassistance.
-
Mise à jour de l'application— mettez à jour l'un des fichiers de l'application et déployez le logiciel à l'aide de CloudFormation.
-
Mise à jour du type d'instance— modifiez le type d'instance de l'EC2instance Amazon sous-jacente.
-
Mettre à jour le AMI sur une EC2 instance Amazon— modifiez l'Amazon Machine Image (AMI) pour l'EC2instance Amazon de votre stack.
-
Ajout d'une paire de clés à une Instance— ajoutez une paire de EC2 clés Amazon à l'instance, puis mettez à jour le groupe de sécurité pour autoriser l'SSHaccès à 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 PHP Web à instance unique hébergée sur le serveur Web Apache et exécutée sur Amazon LinuxAMI.
Le serveur Web Apache et l'PHPapplication simple sont tous installés par les scripts d' CloudFormation assistance installés par défaut sur Amazon Linux. PHP AMI L'extrait de modèle suivant montre les métadonnées qui décrivent les packages et les fichiers à installer, en l'occurrence le serveur Web Apache et l'PHPinfrastructure du référentiel Yum pour Amazon Linux. AMI 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'EC2instance Amazon, 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 RPMs ou RubyGems) et référencer des fichiers individuels, des extensions .zip
et .tar
des fichiers pour créer les artefacts de l'application sur l'EC2instance Amazon.
Le modèle active et configure le démon cfn-hup pour qu'il écoute les modifications apportées à la configuration définie dans les métadonnées de l'instance Amazon. EC2 À l'aide du daemon cfn-hup, vous pouvez mettre à jour le logiciel d'application, tel que la version d'ApachePHP, ou vous pouvez mettre à jour le fichier d'PHPapplication lui-même à partir de. CloudFormation L'extrait suivant provenant de la même EC2 ressource Amazon figurant dans le modèle montre les éléments nécessaires pour configurer cfn-hup afin d'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 compléter la pile, le modèle crée un groupe EC2 de sécurité Amazon.
{ "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 seule EC2 instance Amazon, mais vous pouvez utiliser les mêmes mécanismes sur des solutions plus complexes qui utilisent Elastic Load Balancing et Amazon EC2 Auto Scaling des groupes 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, veuillez consulter Mise à jour de groupes Auto Scaling.
Création de la pile initiale
Dans le cadre de cet exemple, nous allons utiliser le AWS Management Console pour créer une pile initiale à partir de l'exemple de modèle.
Avertissement
L'exécution de cette procédure permettra de déployer AWS des services 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 CloudFormation console à 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
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. -
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 le statut de votre stack est CREATE _COMPLETE, l'onglet de sortie affiche le statut URL de votre site Web. Si vous choisissez la valeur de la URL sortie du site Web, vous verrez votre nouvelle PHP application fonctionner.
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 du AWS Management Console
-
Connectez-vous à la CloudFormation console à l'adresse : https://console.aws.amazon.com/cloudformation.
-
Sur le CloudFormation tableau de bord, choisissez la pile que vous avez créée précédemment, puis choisissez Update Stack.
-
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 du AWS Management Console, vous remarquerez que les paramètres utilisés pour créer la pile initiale sont préremplis sur la page Paramètres de l'assistant de mise à jour de 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 est à l'COMPLETEétat UPDATE _, vous pouvez sélectionner à nouveau la valeur URL de sortie du site Web pour vérifier que les modifications apportées à 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 mises à jour, accédez à la CloudFormation console. Dans l'onglet Événements, examinez les événements de la pile. Dans ce cas particulier, les métadonnées de l'EC2instance Amazon ont WebServerInstance été mises à jour, ce qui a également entraîné CloudFormation la réévaluation des autres ressources (WebServerSecurityGroup
) pour s'assurer qu'il n'y avait aucune autre modification. Aucune des autres ressources de la pile n'a été modifiée. CloudFormation mettra à jour uniquement les ressources de la pile affectées par les modifications apportées à 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 simple mise à jour illustre le processus ; toutefois, vous pouvez apporter des modifications beaucoup plus complexes aux fichiers et aux packages déployés sur vos EC2 instances Amazon. Par exemple, vous pouvez décider d'ajouter My SQL à l'instance, en plus de PHP prendre en charge 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'EC2instance Amazon, la mise à jour de l'application fonctionnera exactement de la même manière ; toutefois, CloudFormation elle ne fournit aucune synchronisation ou sérialisation entre les EC2 instances Amazon 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 de cfn-hup s'exécutent simultanément sur toutes les EC2 instances Amazon du groupe Auto Scaling, il est possible que votre service ne soit pas disponible 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 de plus amples informations, veuillez consulter 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 construite jusqu'à présent utilise une instance Amazon EC2 t1.micro. Supposons que votre site Web nouvellement créé reçoit plus de trafic qu'une instance t1.micro ne peut en supporter, et que vous souhaitiez maintenant passer à un type d'instance Amazon EC2 m1.small. Si l'architecture du type d'instance change, l'instance sera créée avec un autreAMI. Si vous examinez les mappages du modèle, vous verrez que t1.micro et m1.small sont les mêmes architectures et utilisent le même Amazon Linux. AMIs
"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
-
Connectez-vous à la CloudFormation console à l'adresse https://console.aws.amazon.com/cloudformation.
-
Sur le CloudFormation tableau de bord, choisissez la pile que vous avez créée précédemment, puis choisissez Update Stack.
-
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).
-
Modifiez la valeur de la zone de InstanceTypetexte de
t1.micro
àm1.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 EC2 instance Amazon EBS sauvegardée par -backed en démarrant et en arrêtant l'instance. CloudFormation essaie d'optimiser le changement en mettant à jour le type d'instance et en redémarrant l'instance, afin 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 garantir que l'adresse IP élastique est correctement liée après la modification, elle CloudFormation sera également mise à jour. Vous pouvez voir les modifications dans la CloudFormation console sous l'onglet Événements.
Pour vérifier le type d'instance depuis le AWS Management Console, ouvrez la EC2 console Amazon et localisez-y votre instance.
Mettre à jour le AMI sur une EC2 instance Amazon
Voyons maintenant comment modifier l'Amazon Machine Image (AMI) qui s'exécute sur l'instance. Nous allons initier le AMI changement en mettant à jour la pile pour utiliser un nouveau type d'EC2instance Amazon, tel que t2.medium, qui est un type d'HVM64instance.
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 le AMI ; CloudFormation considère cela comme une modification d'une propriété immuable de la ressource. Pour modifier une propriété immuable, vous CloudFormation devez lancer une ressource de remplacement, dans ce cas une nouvelle EC2 instance Amazon exécutant la nouvelleAMI.
Une fois la nouvelle instance en cours d'exécution, CloudFormation met à jour les autres ressources de la pile pour qu'elles pointent vers la nouvelle ressource. Lorsque toutes les nouvelles ressources sont créées, l'ancienne ressource est supprimée, un processus connu sous le nom deUPDATE_CLEANUP
. Cette fois, vous remarquerez que l'ID d'instance et l'application URL de l'instance dans la pile ont changé à la suite de 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 du code d'application est écrit dans le fichier AMI que vous souhaitez mettre à jour, vous pouvez utiliser le même mécanisme de mise à jour de la pile pour le mettre AMI à jour afin de charger votre nouvelle application.
Pour mettre à jour le AMI pour une instance de votre stack
-
Créez votre nouveau AMIs contenant les modifications apportées à votre application ou à votre système d'exploitation. Pour plus d'informations, consultez la section Create an Amazon EBS -backed AMI dans le guide de l'EC2utilisateur Amazon.
-
Mettez à jour votre modèle pour intégrer le nouveau AMIIDs.
-
Mettez à jour la pile, soit à partir du AWS Management Console comme expliqué dans, Mise à jour de l'application soit à l'aide de la AWS commande update-stack.
Lorsque vous mettez à jour la pile, vous CloudFormation détectez que l'AMIID 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.
Mettre à jour la configuration de EC2 lancement d'Amazon pour un groupe Auto Scaling
Si vous utilisez des groupes Auto Scaling plutôt que des EC2 instances Amazon, le processus de mise à jour des instances en cours d'exécution est légèrement différent. Avec les ressources Auto Scaling, la configuration des EC2 instances Amazon, telle que le type d'instance ou l'AMIID, est encapsulée dans la configuration de lancement d'Auto Scaling. Vous pouvez apporter des modifications à la configuration de lancement de la même manière que nous avons apporté des modifications aux ressources des EC2 instances Amazon dans les sections précédentes. Cependant, la modification de la configuration de lancement n'a aucun impact sur les EC2 instances Amazon 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 de plus amples informations, veuillez consulter 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 cela, nous allons ajouter une paire de EC2 clés Amazon à une EC2 instance existante, puis ouvrir le port 22 dans le groupe de EC2 sécurité Amazon afin que vous puissiez utiliser Secure Shell (SSH) pour accéder à l'instance.
Ajout d'une paire de clés à une Instance
Pour ajouter SSH l'accès à une EC2 instance Amazon existante
-
Ajoutez deux paramètres supplémentaires au modèle pour transmettre le nom d'une paire de EC2 clés Amazon et son SSH emplacement existants.
"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 KeyName propriété à l'EC2instance Amazon.
"WebServerInstance": { "Type" : "AWS::EC2::Instance", : "Properties": { :
"KeyName" : { "Ref" : "KeyName" },
: } }, -
Ajoutez le port 22 et l'SSHemplacement aux règles d'entrée pour le groupe de EC2 sécurité Amazon.
"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, soit à partir du AWS Management Console comme expliqué dans, Mise à jour de l'application soit à l'aide de la AWS commande update-stack.
Modification des ressources de la pile
Les besoins des applications peuvent changer au fil du temps, ce qui vous CloudFormation permet de modifier l'ensemble des ressources qui composent 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.
Cela créera une PHP application simple à instance unique utilisant une adresse IP élastique. 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'EC2instance du modèle en une 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" -
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 DNS nom de l'Elastic Load Balancer comme 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. Vous pouvez désormais l'utiliser CloudFormation pour augmenter ou améliorer vos stocks en fonction de l'évolution de vos besoins.
{ "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 apportées aux propriétés des ressources, telles que la modification des propriétés AMI sur une EC2 instance Amazon, ne sont pas prises en charge par les services sous-jacents. Dans le cas de modifications modifiables, le type Update ou Modify CloudFormation sera utilisé APIs 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 une PHP application « Hello World ». La bibliothèque de modèles contient également un ElastiCache exemple de modèle Amazon qui montre comment intégrer une PHP application à l' ElasticCache aide de cfn-hup et cfn-init pour répondre aux modifications de la configuration du cluster Amazon ElastiCache Cache, toutes ces opérations pouvant être effectuées par Update Stack.