Aggiornamento di uno stack - AWS CloudFormation

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Aggiornamento di uno stack

Con CloudFormation, puoi aggiornare le proprietà delle risorse negli stack esistenti. Queste modifiche possono variare da semplici modifiche alla configurazione, come l'aggiornamento della soglia di allarme di un CloudWatch allarme, a modifiche più complesse, come l'aggiornamento dell'Amazon Machine Image (AMI) in esecuzione su un' EC2 istanza Amazon. Molte AWS risorse di un modello possono essere aggiornate e continuiamo ad aggiungere il supporto per altre.

Questa sezione descrive in dettaglio una semplice progressione di aggiornamenti di uno stack in esecuzione. Mostra come l'uso dei modelli consenta di utilizzare un sistema di controllo delle versioni per la configurazione dell' AWS infrastruttura, proprio come si utilizza il controllo della versione per il software in esecuzione. Verranno descritte le fasi seguenti:

  1. Creazione dello stack iniziale: creare uno stack utilizzando un'AMI Amazon Linux di base, installando il Web Server Apache e una semplice applicazione PHP tramite gli script helper CloudFormation.

  2. Aggiornamento dell'applicazione— aggiorna uno dei file dell'applicazione e distribuisci il software utilizzando CloudFormation.

  3. Aggiornamento del tipo di istanza— modificare il tipo di istanza dell' EC2 istanza Amazon sottostante.

  4. Aggiorna l'AMI su un' EC2istanza Amazon— modifica l'Amazon Machine Image (AMI) per l' EC2 istanza Amazon nel tuo stack.

  5. Aggiunta di una coppia di chiavi a un'istanza— aggiungere una coppia di EC2 chiavi Amazon all'istanza, quindi aggiornare il gruppo di sicurezza per consentire l'accesso SSH all'istanza.

  6. Modifica delle risorse dello stack: aggiungere e rimuovere risorse dallo stack e convertirlo in un'applicazione con load balancer e dimensionamento automatico, tramite l'aggiornamento del modello.

Un'applicazione semplice

Inizieremo creando uno stack che potremo utilizzare in tutto il resto di questa sezione. Abbiamo fornito un semplice modello che avvia un'applicazione Web PHP a istanza singola ospitata sul Web Server Apache e in esecuzione su un AMI Amazon Linux.

Il Web Server Apache, PHP e la semplice applicazione PHP vengono tutti installati dagli script helper di CloudFormation , installati per impostazione predefinita nell'AMI Amazon Linux. Il seguente frammento di modello mostra i metadati che descrivono i pacchetti e i file da installare, in questo caso il Web Server Apache e l'infrastruttura PHP dal repository Yum dell'AMI Amazon Linux. Il frammento mostra inoltre la sezione Services, che assicura che il Web Server Apache sia in esecuzione. Nella sezione Properties della definizione dell' EC2 istanza Amazon, la UserData proprietà contiene lo CloudInit script che chiama cfn-init per installare i pacchetti e i file.

"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'applicazione in sé è un esempio di due righe, "Hello World", completamente definito all'interno del modello. Per un'applicazione reale, i file possono essere archiviati su Amazon S3 GitHub o su un altro repository e referenziati dal modello. CloudFormation può scaricare pacchetti (come RPMs o RubyGems) e fare riferimento a singoli file ed espandere .zip e .tar file per creare gli artefatti dell'applicazione sull'istanza Amazon EC2.

Il modello abilita e configura il demone cfn-hup per ascoltare le modifiche alla configurazione definita nei metadati per l'istanza Amazon. EC2 Utilizzando il demone cfn-hup, puoi aggiornare il software applicativo, come la versione di Apache o PHP, oppure puoi aggiornare il file dell'applicazione PHP stesso. CloudFormation Il seguente frammento della stessa EC2 risorsa Amazon nel modello mostra le parti necessarie per configurare cfn-hup per chiamare cfn-init per aggiornare il software se vengono rilevate modifiche ai metadati:

"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", : ]]}} } },

Per completare lo stack, il modello crea un gruppo EC2 di sicurezza 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" ]}]] } } } }

Questo esempio utilizza una singola EC2 istanza Amazon, ma puoi utilizzare gli stessi meccanismi su soluzioni più complesse che utilizzano Elastic Load Balancing e Amazon EC2 Auto Scaling gruppi per gestire una raccolta di server di applicazioni. Ci sono, tuttavia, alcune considerazioni particolari per i gruppi Auto Scaling. Per ulteriori informazioni, consulta Aggiornamento dei gruppi Auto Scaling.

Creazione dello stack iniziale

Ai fini di questo esempio, utilizzeremo il AWS Management Console per creare uno stack iniziale dal modello di esempio.

avvertimento

Il completamento di questa procedura implementerà i servizi live AWS . Ti verranno addebitate le tariffe standard di utilizzo fintanto che questi servizi sono in esecuzione.

Per creare lo stack dalla AWS Management Console
  1. Copiare il modello precedente e salvarlo localmente nel sistema come file di testo. Annotare il percorso perché sarà necessario utilizzare il file in una fase successiva.

  2. Accedi alla CloudFormation console all'indirizzo https://console.aws.amazon.com/cloudformation.

  3. Selezionare Create new stack (Crea nuovo stack).

  4. Nella procedura guidata Create New Stack (Crea nuovo stack), nella schermata Select Template (Seleziona modello) digitare UpdateTutorial nel campo Name (Nome). Nella stessa pagina, selezionare Upload a template to Amazon S3 (Carica un modello in Amazon S3) e individuare il file scaricato nella prima fase, quindi selezionare Next (Avanti).

  5. Nella schermata Specify Parameters (Specifica parametri), nella casella Instance Type (Tipo di istanza) digitare t1.micro. Quindi scegli Successivo.

  6. Nella schermata Options (Opzioni) selezionare Next (Avanti).

  7. Nella schermata Review (Rivedi) verificare che tutte le impostazioni siano quelle desiderate, quindi fare clic su Create (Crea).

Quando lo stato dello stack è CREATE_COMPLETE, la scheda di output mostra l'URL del tuo sito Web. Facendo clic sul valore dell'output WebsiteURL, si vedrà la nuova applicazione PHP funzionante.

Aggiornamento dell'applicazione

Una volta distribuito lo stack, è il momento di aggiornare l'applicazione. Apporteremo una semplice modifica al testo visualizzato dall'applicazione. Per farlo, aggiungeremo un comando echo al file index.php come illustrato in questo frammento di modello:

"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" }, : } },

Utilizza un editor di testo per modificare manualmente il file del modello salvato in locale.

A questo punto aggiorneremo lo stack.

Per aggiornare lo stack dal AWS Management Console
  1. Accedi alla CloudFormation console, all'indirizzo: https://console.aws.amazon.com/cloudformazione.

  2. Nella CloudFormation dashboard, scegli lo stack che hai creato in precedenza, quindi scegli Update Stack.

  3. Nella procedura guidata Update Stack (Aggiorna stack), nella schermata Select Template (Seleziona modello) selezionare Upload a template to Amazon S3 (Carica un modello in Amazon S3), selezionare il modello modificato, quindi selezionare Next (Avanti).

  4. Nella schermata Options (Opzioni) selezionare Next (Avanti).

  5. Selezionare Next (Avanti) perché lo stack non dispone di una policy di stack. Tutte le risorse possono essere aggiornate senza una policy di sostituzione.

  6. Nella schermata Review (Rivedi) verificare che tutte le impostazioni siano quelle desiderate, quindi selezionare Update (Aggiorna).

Se aggiorni lo stack da AWS Management Console, noterai che i parametri utilizzati per creare lo stack iniziale sono precompilati nella pagina Parametri della procedura guidata Update Stack. Se utilizzi il comando update-stack, assicurati di digitare gli stessi valori dei parametri che hai utilizzato originariamente per creare lo stack.

Quando lo stack si trova nello stato UPDATE_COMPLETE, puoi selezionare nuovamente il valore di output WebsiteURL per verificare che le modifiche all'applicazione abbiano avuto effetto. Per impostazione predefinita, il daemon cfn-hup viene eseguito ogni 15 minuti, pertanto potrebbero essere necessari fino a 15 minuti prima che l'applicazione venga modificata dopo l'aggiornamento dello stack.

Per vedere il set di risorse che sono state aggiornate, vai alla console. CloudFormation Nella scheda Events (Eventi) controlla gli eventi dello stack. In questo caso particolare, i metadati per l' EC2 istanza Amazon sono WebServerInstance stati aggiornati, il che ha CloudFormation comportato anche una rivalutazione delle altre risorse (WebServerSecurityGroup) per garantire che non vi fossero altre modifiche. Nessuna delle altre risorse dello stack è stata modificata. CloudFormation aggiornerà solo le risorse dello stack che sono interessate da eventuali modifiche allo stack. Tali modifiche possono essere dirette, ad esempio modifiche alle proprietà o ai metadati, oppure possono essere dovute a dipendenze o flussi di dati tramite Ref o ad altre funzioni GetAtt intrinseche del modello. Per ulteriori informazioni, vedere Riferimento alla funzione intrinseca.

Questo semplice aggiornamento illustra il processo; tuttavia, puoi apportare modifiche molto più complesse ai file e ai pacchetti distribuiti nelle tue istanze Amazon EC2 . Ad esempio, puoi decidere di aggiungere MySQL all'istanza, insieme al supporto PHP per MySQL. A tale scopo, è sufficiente aggiungere gli ulteriori pacchetti e file con eventuali altri servizi alla configurazione e quindi aggiornare lo stack per distribuire le modifiche. Nel seguente frammento di modello, le modifiche sono evidenziate in rosso:

"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": { : } }

Puoi aggiornare i CloudFormation metadati per aggiornarli alle nuove versioni dei pacchetti utilizzati dall'applicazione. Negli esempi precedenti, la proprietà della versione per ogni pacchetto è vuota, a indicare che cfn-init deve installare la versione più recente del pacchetto.

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

È possibile specificare una stringa di versione per un pacchetto. Se modifichi la stringa della versione nelle successive chiamate di aggiornamento dello stack, verrà distribuita la nuova versione del pacchetto. Ecco un esempio di utilizzo dei numeri di versione per i RubyGems pacchetti. Qualsiasi pacchetto che supporta il controllo delle versioni può avere versioni specifiche.

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

Aggiornamento dei gruppi Auto Scaling

Se utilizzi gruppi Auto Scaling nel tuo modello, anziché risorse di EC2 istanze Amazon, l'aggiornamento dell'applicazione funzionerà esattamente nello stesso modo; tuttavia, CloudFormation non fornisce alcuna sincronizzazione o serializzazione tra le EC2 istanze Amazon in un gruppo Auto Scaling. Il daemon cfn-hup su ogni host verrà eseguito in modo indipendente e aggiornerà l'applicazione secondo la propria programmazione. Quando utilizzi cfn-hup per aggiornare la configurazione dell'istanza, ogni istanza eseguirà gli hook di cfn-hup in base alla propria programmazione; non è previsto alcun coordinamento tra le istanze nello stack. È opportuno considerare quanto segue:

  • Se le modifiche a cfn-hup vengono eseguite contemporaneamente su tutte le EC2 istanze Amazon nel gruppo Auto Scaling, il servizio potrebbe non essere disponibile durante l'aggiornamento.

  • Se le modifiche di cfn-hup vengono eseguite in momenti diversi, vecchie e nuove versioni del software potrebbero essere in esecuzione nello stesso tempo.

Per evitare questi problemi, valuta di forzare un aggiornamento in sequenza sulle istanze nel gruppo Auto Scaling. Per ulteriori informazioni, consulta Attributo UpdatePolicy.

Modifica delle proprietà delle risorse

Con CloudFormation, puoi modificare le proprietà di una risorsa esistente nello stack. Le seguenti sezioni descrivono vari aggiornamenti che consentono di risolvere problemi specifici; tuttavia, qualsiasi proprietà di qualsiasi risorsa che supporta l'aggiornamento nello stack può essere modificata in base alle esigenze.

Aggiornamento del tipo di istanza

Lo stack che abbiamo creato finora utilizza un'istanza Amazon EC2 t1.micro. Supponiamo che il tuo sito web appena creato stia ricevendo più traffico di quanto possa gestire un'istanza t1.micro e ora desideri passare a un tipo di istanza Amazon m1.small. EC2 Se l'architettura del tipo di istanza cambia, l'istanza verrà creata con un'altra AMI. Se controlli le mappature nel modello, vedrai che sia t1.micro che m1.small hanno le stesse architetture e utilizzano lo stesso 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"} }

Usiamo il modello che abbiamo modificato nella sezione precedente per modificare il tipo di istanza. Poiché InstanceType era un parametro di input per il modello, non è necessario modificare il modello; possiamo modificare il valore del parametro nella procedura guidata Stack Update, nella pagina Specificare i parametri.

Per aggiornare lo stack dalla AWS Management Console
  1. Accedi alla CloudFormation console all'indirizzo https://console.aws.amazon.com /cloudformation.

  2. Nella CloudFormation dashboard, scegli lo stack che hai creato in precedenza, quindi scegli Update Stack.

  3. Nella procedura guidata Update Stack (Aggiorna stack), nella schermata Select Template (Seleziona modello) selezionare Use current template (Utilizza modello corrente), quindi selezionare Next (Avanti).

    Viene visualizzata la pagina Specify Details (Specifica dettagli) con i parametri utilizzati per creare lo stack iniziale precompilati nella sezione Specify Parameters (Specifica parametri).

  4. Modifica il valore della casella di InstanceTypetesto da at1.micro. m1.small Quindi, seleziona Next (Successivo).

  5. Nella schermata Options (Opzioni) selezionare Next (Avanti).

  6. Selezionare Next (Avanti) perché lo stack non dispone di una policy di stack. Tutte le risorse possono essere aggiornate senza una policy di sostituzione.

  7. Nella schermata Review (Rivedi) verificare che tutte le impostazioni siano quelle desiderate, quindi selezionare Update (Aggiorna).

Puoi modificare dinamicamente il tipo di istanza di un'istanza EC2 Amazon supportata da EBS avviando e arrestando l'istanza. CloudFormation tenta di ottimizzare la modifica aggiornando il tipo di istanza e riavviando l'istanza, in modo che l'ID dell'istanza non cambi. Quando l'istanza viene riavviata, tuttavia, l'indirizzo IP pubblico dell'istanza cambia. Per garantire che l'indirizzo IP elastico sia associato correttamente dopo la modifica, CloudFormation aggiornerà anche l'indirizzo IP elastico. Puoi vedere le modifiche nella CloudFormation console nella scheda Eventi.

Per verificare il tipo di istanza da AWS Management Console, apri la EC2 console Amazon e individua l'istanza lì.

Aggiorna l'AMI su un' EC2 istanza Amazon

Vediamo ora in che modo è possibile modificare l'Amazon Machine Image (AMI) in esecuzione nell'istanza. Inizieremo la modifica dell'AMI aggiornando lo stack per utilizzare un nuovo tipo di EC2 istanza Amazon, come t2.medium, che è un tipo di istanza. HVM64

Come nella sezione precedente, utilizzeremo il modello esistente per cambiare il tipo di istanza utilizzato dallo stack di esempio. Nella pagina Specify Parameters (Specifica parametri) della procedura guidata di aggiornamento dello stack, modifica il valore del tipo di istanza.

In questo caso, non possiamo semplicemente avviare e arrestare l'istanza per modificare l'AMI; CloudFormation considera questa operazione una modifica a una proprietà non modificabile della risorsa. Per apportare una modifica a una proprietà immutabile, è CloudFormation necessario avviare una risorsa sostitutiva, in questo caso una nuova EC2 istanza Amazon che esegue la nuova AMI.

Dopo l'esecuzione della nuova istanza, CloudFormation aggiorna le altre risorse dello stack in modo che puntino alla nuova risorsa. Quando vengono create tutte le nuove risorse, la vecchia risorsa viene eliminata, un processo noto comeUPDATE_CLEANUP. Questa volta noterai che l'ID istanza e l'URL applicazione dell'istanza nello stack sono cambiati in conseguenza dell'aggiornamento. Gli eventi nella tabella Event (Evento) contengono una descrizione indicante che l'aggiornamento richiesto implicava la modifica di una proprietà non modificabile e pertanto è stata creata una nuova risorsa fisica, con sostituzione della precedente.

Se disponi di codice applicativo scritto nell'AMI e vuoi aggiornarlo, puoi utilizzare lo stesso meccanismo di aggiornamento dello stack per aggiornare l'AMI in modo che carichi la nuova applicazione.

Per aggiornare l'AMI per un'istanza nello stack
  1. Creane una nuova AMIs contenente le modifiche all'applicazione o al sistema operativo. Per ulteriori informazioni, consulta la sezione Creazione di un'AMI supportata da Amazon EBS nella Amazon User Guide. EC2

  2. Aggiorna il modello per incorporare la nuova AMI IDs.

  3. Aggiorna lo stack, AWS Management Console come spiegato in Aggiornamento dell'applicazione o utilizzando il AWS comando update-stack.

Quando aggiorni lo stack, CloudFormation rileva che l'ID AMI è cambiato e quindi attiva un aggiornamento dello stack nello stesso modo in cui abbiamo avviato quello precedente.

Aggiorna la configurazione di EC2 lancio di Amazon per un gruppo Auto Scaling

Se utilizzi gruppi di Auto Scaling anziché EC2 istanze Amazon, il processo di aggiornamento delle istanze in esecuzione è leggermente diverso. Con le risorse Auto Scaling, la configurazione delle EC2 istanze Amazon, come il tipo di istanza o l'ID AMI, è incapsulata nella configurazione di avvio di Auto Scaling. Puoi apportare modifiche alla configurazione di avvio nello stesso modo in cui abbiamo apportato modifiche alle risorse delle EC2 istanze Amazon nelle sezioni precedenti. Tuttavia, la modifica della configurazione di avvio non ha alcun impatto sulle EC2 istanze Amazon in esecuzione nel gruppo Auto Scaling. Una configurazione di avvio aggiornata si applica solo alle nuove istanze che vengono create dopo l'aggiornamento.

Per propagare le modifiche alla configurazione di avvio a tutte le istanze nel gruppo Auto Scaling, puoi utilizzare un attributo di aggiornamento. Per ulteriori informazioni, consulta Attributo UpdatePolicy.

Aggiunta di proprietà delle risorse

Finora abbiamo esaminato la modifica di proprietà esistenti di una risorsa in un modello. È possibile anche aggiungere proprietà che non sono state originariamente specificate nel modello. Per illustrare ciò, aggiungeremo una coppia di EC2 chiavi Amazon a un' EC2 istanza esistente e quindi apriremo la porta 22 nell'Amazon EC2 Security Group in modo da poter utilizzare Secure Shell (SSH) per accedere all'istanza.

Aggiunta di una coppia di chiavi a un'istanza

Per aggiungere l'accesso SSH a un'istanza Amazon EC2 esistente
  1. Aggiungi due parametri aggiuntivi al modello per inserire il nome di una coppia di EC2 chiavi Amazon esistente e di una posizione SSH.

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

    "WebServerInstance": { "Type" : "AWS::EC2::Instance", : "Properties": { : "KeyName" : { "Ref" : "KeyName" }, : } },
  3. Aggiungi la porta 22 e la posizione SSH alle regole di ingresso per il gruppo di EC2 sicurezza 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"} ] } },
  4. Aggiorna lo stack, AWS Management Console come spiegato in Aggiornamento dell'applicazione o utilizzando il comando. AWS update-stack

Modifica delle risorse dello stack

Le esigenze dell'applicazione possono cambiare nel tempo, CloudFormation consente di modificare l'insieme di risorse che compongono lo stack. Per la dimostrazione utilizzeremo l'applicazione a istanza singola da Aggiunta di proprietà delle risorse e la convertiremo in un'applicazione con load balancer e ridimensionamento automatico tramite l'aggiornamento dello stack.

In questo modo verrà creata un'applicazione PHP semplice, a istanza singola, che utilizza un indirizzo IP elastico. Ora trasformeremo l'applicazione in un'applicazione ad alta disponibilità, con load balancer e ridimensionamento automatico tramite la modifica delle risorse durante un aggiornamento.

  1. Aggiungere una risorsa Elastic Load Balancer.

    "ElasticLoadBalancer" : { "Type" : "AWS::ElasticLoadBalancing::LoadBalancer", "Properties" : { "CrossZone" : "true", "AvailabilityZones" : { "Fn::GetAZs" : "" }, "LBCookieStickinessPolicy" : [ { "PolicyName" : "CookieBasedPolicy", "CookieExpirationPeriod" : "30" } ], "Listeners" : [ { "LoadBalancerPort" : "80", "InstancePort" : "80", "Protocol" : "HTTP", "PolicyNames" : [ "CookieBasedPolicy" ] } ], "HealthCheck" : { "Target" : "HTTP:80/", "HealthyThreshold" : "2", "UnhealthyThreshold" : "5", "Interval" : "10", "Timeout" : "5" } } }
  2. Converti l' EC2 istanza nel modello in una configurazione di avvio con Auto Scaling. Le proprietà sono identiche, perciò è necessario solo cambiare il nome del tipo da:

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

    to:

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

    Per chiarezza nel modello, abbiamo cambiato il nome della risorsa da WebServerInstancea LaunchConfig, quindi dovrai aggiornare il nome della risorsa a cui fanno riferimento cfn-init e cfn-hup (basta cercarlo WebServerInstance e sostituirlo con, ad eccezione di cfn-signal). LaunchConfig Per cfn-signal, dovrai segnalare il gruppo Auto Scaling WebServerGroup () e non l'istanza, come mostrato nel seguente frammento:

    "# Signal the status from cfn-init\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServerGroup ", " --region ", { "Ref" : "AWS::Region" }, "\n"
  3. Aggiungi una risorsa del gruppo con scalabilità automatica.

    "WebServerGroup" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "AvailabilityZones" : { "Fn::GetAZs" : "" }, "LaunchConfigurationName" : { "Ref" : "LaunchConfig" }, "MinSize" : "1", "DesiredCapacity" : "1", "MaxSize" : "5", "LoadBalancerNames" : [ { "Ref" : "ElasticLoadBalancer" } ] }, "CreationPolicy" : { "ResourceSignal" : { "Timeout" : "PT15M" } }, "UpdatePolicy": { "AutoScalingRollingUpdate": { "MinInstancesInService": "1", "MaxBatchSize": "1", "PauseTime" : "PT15M", "WaitOnResourceSignals": "true" } } }
  4. Aggiornare la definizione del gruppo di sicurezza per bloccare il traffico verso le istanze dal load balancer.

    "WebServerSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP access via port 80 locked down to the ELB and SSH access", "SecurityGroupIngress" : [ {"IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "SourceSecurityGroupOwnerId" : {"Fn::GetAtt" : ["ElasticLoadBalancer", "SourceSecurityGroup.OwnerAlias"]}, "SourceSecurityGroupName" : {"Fn::GetAtt" : ["ElasticLoadBalancer", "SourceSecurityGroup.GroupName"]}}, {"IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : { "Ref" : "SSHLocation"}} ] } }
  5. Aggiornare gli output in modo da restituire il nome DNS dell'Elastic Load Balancer come percorso dell'applicazione da:

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

    to:

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

Per riferimento, l'esempio seguente mostra il modello completo. Se utilizzi questo modello per aggiornare lo stack, convertirai la semplice applicazione a istanza singola in un'applicazione ad alta disponibilità, Multi-AZ, con load balancer e dimensionamento automatico. Solo le risorse che devono essere aggiornate verranno modificate, perciò se fossero stati presenti datastore per quest'applicazione, i dati sarebbero rimasti intatti. Ora puoi utilizzarlo CloudFormation per aumentare o migliorare i tuoi stack man mano che le tue esigenze cambiano.

{ "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" ]}]] } } } }

Considerazioni su disponibilità e impatto

Diverse proprietà hanno diverso impatto sulle risorse nello stack. È possibile utilizzare CloudFormation per aggiornare qualsiasi proprietà; tuttavia, prima di apportare modifiche, è opportuno considerare le seguenti domande:

  1. In che modo l'aggiornamento influisce sulla risorsa stessa? Ad esempio, l'aggiornamento di una soglia di allarme renderà l'allarme inattivo durante l'aggiornamento. Come abbiamo visto, la modifica del tipo di istanza richiede l'arresto e il riavvio dell'istanza. CloudFormation utilizza le azioni di aggiornamento o modifica delle risorse sottostanti per apportare modifiche alle risorse. Per comprendere l'impatto degli aggiornamenti, è necessario verificare la documentazione delle risorse specifiche.

  2. La modifica è modificabile o non modificabile? Alcune modifiche alle proprietà delle risorse, come la modifica dell'AMI su un' EC2 istanza Amazon, non sono supportate dai servizi sottostanti. In caso di modifiche modificabili, CloudFormation utilizzerà il tipo Update o Modify APIs per le risorse sottostanti. Per le modifiche immutabili alle proprietà, CloudFormation creerà nuove risorse con le proprietà aggiornate e quindi le collegherà allo stack prima di eliminare le vecchie risorse. Sebbene CloudFormation cerchi di ridurre i tempi di inattività delle risorse dello stack, la sostituzione di una risorsa è un processo in più fasi e richiederà tempo. Durante la riconfigurazione dello stack, l'applicazione non sarà completamente operativa. Ad esempio, potrebbe non essere in grado di servire richieste o accedere a un database.

Risorse correlate

Per ulteriori informazioni sull'utilizzo CloudFormation per avviare le applicazioni e sull'integrazione con altri servizi di configurazione e distribuzione come Puppet e Opscode Chef, consulta i seguenti white paper:

Il modello utilizzato in questa sezione è un'applicazione PHP "Hello World". La libreria di modelli dispone anche di un modello di ElastiCache esempio Amazon che mostra come integrare un'applicazione PHP ElasticCache utilizzando cfn-hup e cfn-init per rispondere alle modifiche nella configurazione di Amazon ElastiCache Cache Cluster, tutte operazioni che possono essere eseguite da Update Stack.