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à.
Spiegazione passo per passo: 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'istanza Amazon EC2. 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:
-
Creazione dello stack iniziale— creare uno stack utilizzando un'AMI Amazon Linux di base, installando l'Apache Web Server e una semplice applicazione PHP utilizzando gli CloudFormation script di supporto.
-
Aggiornamento dell'applicazione— aggiorna uno dei file dell'applicazione e distribuisci il software utilizzando. CloudFormation
-
Aggiornamento del tipo di istanza: cambiare il tipo di istanza Amazon EC2 sottostante.
-
Aggiornamento dell'AMI in un'istanza Amazon EC2: cambiare l'Amazon Machine Image (AMI) per l'istanza Amazon EC2 nello stack.
-
Aggiunta di una coppia di chiavi a un'istanza: aggiungere una coppia di chiavi Amazon EC2 all'istanza, quindi aggiornare il gruppo di sicurezza per consentire l'accesso SSH all'istanza.
-
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 server Web Apache, PHP e la semplice applicazione PHP sono tutti installati dagli script di CloudFormation supporto installati di default sull'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'istanza Amazon EC2, 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 RPM 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 daemon cfn-hup per l'ascolto di modifiche alla configurazione definita nei metadati per l'istanza Amazon EC2. Utilizzando il demone cfn-hup, è possibile aggiornare il software applicativo, ad esempio la versione di Apache o PHP, oppure è possibile aggiornare il file dell'applicazione PHP stesso. CloudFormation Il frammento seguente della stessa risorsa Amazon EC2 nel modello mostra le parti necessarie per configurare cfn-hup in modo da 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 di sicurezza Amazon EC2.
{ "AWSTemplateFormatVersion" : "2010-09-09", "Description" : "AWS CloudFormation Sample Template: Sample template that can be used to test EC2 updates. **WARNING** This template creates an Amazon Ec2 Instance. You will be billed for the AWS resources used if you create a stack from this template.", "Parameters" : { "InstanceType" : { "Description" : "WebServer EC2 instance type", "Type" : "String", "Default" : "t2.small", "AllowedValues" : [ "t1.micro", "t2.nano", "t2.micro", "t2.small", "t2.medium", "t2.large", "m1.small", "m1.medium", "m1.large", "m1.xlarge", "m2.xlarge", "m2.2xlarge", "m2.4xlarge", "m3.medium", "m3.large", "m3.xlarge", "m3.2xlarge", "m4.large", "m4.xlarge", "m4.2xlarge", "m4.4xlarge", "m4.10xlarge", "c1.medium", "c1.xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "c4.large", "c4.xlarge", "c4.2xlarge", "c4.4xlarge", "c4.8xlarge", "g2.2xlarge", "g2.8xlarge", "r3.large", "r3.xlarge", "r3.2xlarge", "r3.4xlarge", "r3.8xlarge", "i2.xlarge", "i2.2xlarge", "i2.4xlarge", "i2.8xlarge", "d2.xlarge", "d2.2xlarge", "d2.4xlarge", "d2.8xlarge", "hi1.4xlarge", "hs1.8xlarge", "cr1.8xlarge", "cc2.8xlarge", "cg1.4xlarge" ], "ConstraintDescription" : "must be a valid EC2 instance type." } }, "Mappings" : { "AWSInstanceType2Arch" : { "t1.micro" : { "Arch" : "HVM64" }, "t2.nano" : { "Arch" : "HVM64" }, "t2.micro" : { "Arch" : "HVM64" }, "t2.small" : { "Arch" : "HVM64" }, "t2.medium" : { "Arch" : "HVM64" }, "t2.large" : { "Arch" : "HVM64" }, "m1.small" : { "Arch" : "HVM64" }, "m1.medium" : { "Arch" : "HVM64" }, "m1.large" : { "Arch" : "HVM64" }, "m1.xlarge" : { "Arch" : "HVM64" }, "m2.xlarge" : { "Arch" : "HVM64" }, "m2.2xlarge" : { "Arch" : "HVM64" }, "m2.4xlarge" : { "Arch" : "HVM64" }, "m3.medium" : { "Arch" : "HVM64" }, "m3.large" : { "Arch" : "HVM64" }, "m3.xlarge" : { "Arch" : "HVM64" }, "m3.2xlarge" : { "Arch" : "HVM64" }, "m4.large" : { "Arch" : "HVM64" }, "m4.xlarge" : { "Arch" : "HVM64" }, "m4.2xlarge" : { "Arch" : "HVM64" }, "m4.4xlarge" : { "Arch" : "HVM64" }, "m4.10xlarge" : { "Arch" : "HVM64" }, "c1.medium" : { "Arch" : "HVM64" }, "c1.xlarge" : { "Arch" : "HVM64" }, "c3.large" : { "Arch" : "HVM64" }, "c3.xlarge" : { "Arch" : "HVM64" }, "c3.2xlarge" : { "Arch" : "HVM64" }, "c3.4xlarge" : { "Arch" : "HVM64" }, "c3.8xlarge" : { "Arch" : "HVM64" }, "c4.large" : { "Arch" : "HVM64" }, "c4.xlarge" : { "Arch" : "HVM64" }, "c4.2xlarge" : { "Arch" : "HVM64" }, "c4.4xlarge" : { "Arch" : "HVM64" }, "c4.8xlarge" : { "Arch" : "HVM64" }, "g2.2xlarge" : { "Arch" : "HVMG2" }, "g2.8xlarge" : { "Arch" : "HVMG2" }, "r3.large" : { "Arch" : "HVM64" }, "r3.xlarge" : { "Arch" : "HVM64" }, "r3.2xlarge" : { "Arch" : "HVM64" }, "r3.4xlarge" : { "Arch" : "HVM64" }, "r3.8xlarge" : { "Arch" : "HVM64" }, "i2.xlarge" : { "Arch" : "HVM64" }, "i2.2xlarge" : { "Arch" : "HVM64" }, "i2.4xlarge" : { "Arch" : "HVM64" }, "i2.8xlarge" : { "Arch" : "HVM64" }, "d2.xlarge" : { "Arch" : "HVM64" }, "d2.2xlarge" : { "Arch" : "HVM64" }, "d2.4xlarge" : { "Arch" : "HVM64" }, "d2.8xlarge" : { "Arch" : "HVM64" }, "hi1.4xlarge" : { "Arch" : "HVM64" }, "hs1.8xlarge" : { "Arch" : "HVM64" }, "cr1.8xlarge" : { "Arch" : "HVM64" }, "cc2.8xlarge" : { "Arch" : "HVM64" } }, "AWSRegionArch2AMI" : { "us-east-1" : {"HVM64" : "ami-0ff8a91507f77f867", "HVMG2" : "ami-0a584ac55a7631c0c"}, "us-west-2" : {"HVM64" : "ami-a0cfeed8", "HVMG2" : "ami-0e09505bc235aa82d"}, "us-west-1" : {"HVM64" : "ami-0bdb828fd58c52235", "HVMG2" : "ami-066ee5fd4a9ef77f1"}, "eu-west-1" : {"HVM64" : "ami-047bb4163c506cd98", "HVMG2" : "ami-0a7c483d527806435"}, "eu-west-2" : {"HVM64" : "ami-f976839e", "HVMG2" : "NOT_SUPPORTED"}, "eu-west-3" : {"HVM64" : "ami-0ebc281c20e89ba4b", "HVMG2" : "NOT_SUPPORTED"}, "eu-central-1" : {"HVM64" : "ami-0233214e13e500f77", "HVMG2" : "ami-06223d46a6d0661c7"}, "ap-northeast-1" : {"HVM64" : "ami-06cd52961ce9f0d85", "HVMG2" : "ami-053cdd503598e4a9d"}, "ap-northeast-2" : {"HVM64" : "ami-0a10b2721688ce9d2", "HVMG2" : "NOT_SUPPORTED"}, "ap-northeast-3" : {"HVM64" : "ami-0d98120a9fb693f07", "HVMG2" : "NOT_SUPPORTED"}, "ap-southeast-1" : {"HVM64" : "ami-08569b978cc4dfa10", "HVMG2" : "ami-0be9df32ae9f92309"}, "ap-southeast-2" : {"HVM64" : "ami-09b42976632b27e9b", "HVMG2" : "ami-0a9ce9fecc3d1daf8"}, "ap-south-1" : {"HVM64" : "ami-0912f71e06545ad88", "HVMG2" : "ami-097b15e89dbdcfcf4"}, "us-east-2" : {"HVM64" : "ami-0b59bfac6be064b78", "HVMG2" : "NOT_SUPPORTED"}, "ca-central-1" : {"HVM64" : "ami-0b18956f", "HVMG2" : "NOT_SUPPORTED"}, "sa-east-1" : {"HVM64" : "ami-07b14488da8ea02a0", "HVMG2" : "NOT_SUPPORTED"}, "cn-north-1" : {"HVM64" : "ami-0a4eaf6c4454eda75", "HVMG2" : "NOT_SUPPORTED"}, "cn-northwest-1" : {"HVM64" : "ami-6b6a7d09", "HVMG2" : "NOT_SUPPORTED"} } }, "Resources" : { "WebServerInstance": { "Type" : "AWS::EC2::Instance", "Metadata" : { "Comment" : "Install a simple PHP application", "AWS::CloudFormation::Init" : { "config" : { "packages" : { "yum" : { "httpd" : [], "php" : [] } }, "files" : { "/var/www/html/index.php" : { "content" : { "Fn::Join" : ["", [ "<?php\n", "echo '<h1>AWS CloudFormation sample PHP application</h1>';\n", "?>\n" ]]}, "mode" : "000644", "owner" : "apache", "group" : "apache" }, "/etc/cfn/cfn-hup.conf" : { "content" : { "Fn::Join" : ["", [ "[main]\n", "stack=", { "Ref" : "AWS::StackId" }, "\n", "region=", { "Ref" : "AWS::Region" }, "\n" ]]}, "mode" : "000400", "owner" : "root", "group" : "root" }, "/etc/cfn/hooks.d/cfn-auto-reloader.conf" : { "content": { "Fn::Join" : ["", [ "[cfn-auto-reloader-hook]\n", "triggers=post.update\n", "path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init\n", "action=/opt/aws/bin/cfn-init -s ", { "Ref" : "AWS::StackId" }, " -r WebServerInstance ", " --region ", { "Ref" : "AWS::Region" }, "\n", "runas=root\n" ]]} } }, "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" }, "cfn-hup" : { "enabled" : "true", "ensureRunning" : "true", "files" : ["/etc/cfn/cfn-hup.conf", "/etc/cfn/hooks.d/cfn-auto-reloader.conf"]} } } } } }, "Properties": { "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" }, { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] }, "InstanceType" : { "Ref" : "InstanceType" }, "SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ], "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash -xe\n", "yum install -y aws-cfn-bootstrap\n", "# Install the files and packages from the metadata\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServerInstance ", " --region ", { "Ref" : "AWS::Region" }, "\n", "# Start up the cfn-hup daemon to listen for changes to the Web Server metadata\n", "/opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup'\n", "# Signal the status from cfn-init\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServerInstance ", " --region ", { "Ref" : "AWS::Region" }, "\n" ]]}} }, "CreationPolicy" : { "ResourceSignal" : { "Timeout" : "PT5M" } } }, "WebServerSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP access via port 80", "SecurityGroupIngress" : [ {"IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0"} ] } } }, "Outputs" : { "WebsiteURL" : { "Description" : "Application URL", "Value" : { "Fn::Join" : ["", ["http://", { "Fn::GetAtt" : [ "WebServerInstance", "PublicDnsName" ]}]] } } } }
Questo esempio utilizza una singola istanza Amazon EC2, ma puoi utilizzare gli stessi meccanismi su soluzioni più complesse che utilizzano Elastic Load Balancing Amazon EC2 Auto Scaling e 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 partendo da AWS Management Console
-
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.
-
Accedere alla CloudFormation console all'indirizzo https://console.aws.amazon.com/cloudformation
. -
Selezionare Create new stack (Crea nuovo stack).
-
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). -
Nella schermata Specify Parameters (Specifica parametri), nella casella Instance Type (Tipo di istanza) digitare
t1.micro
. Quindi scegli Successivo. -
Nella schermata Options (Opzioni) selezionare Next (Avanti).
-
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
-
Accedere alla CloudFormation console all'indirizzo: https://console.aws.amazon.com/cloudformation
. -
Nella CloudFormation dashboard, scegli lo stack che hai creato in precedenza, quindi scegli Update Stack.
-
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).
-
Nella schermata Options (Opzioni) selezionare Next (Avanti).
-
Selezionare Next (Avanti) perché lo stack non dispone di una policy di stack. Tutte le risorse possono essere aggiornate senza una policy di sostituzione.
-
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 aws cloudformation 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' WebServerInstance istanza Amazon EC2 sono stati aggiornati, il che CloudFormation ha 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.
Questo semplice aggiornamento illustra il processo; tuttavia, puoi apportare modifiche molto più complesse a file e 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": { : } }
È possibile aggiornare i CloudFormation metadati per aggiornarli a 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 i gruppi Auto Scaling nel tuo modello, anziché le risorse delle istanze Amazon EC2, l'aggiornamento dell'applicazione funzionerà esattamente nello stesso modo; tuttavia CloudFormation , non fornisce alcuna sincronizzazione o serializzazione tra le istanze Amazon EC2 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 di cfn-hup vengono eseguite su tutte le istanze Amazon EC2 del gruppo Auto Scaling nello stesso momento, 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
La stack sviluppato finora utilizza un'istanza Amazon EC2 t1.micro. Supponiamo che il sito Web appena creato riceva più traffico rispetto al volume che un'istanza t1.micro sia in grado di gestire e che quindi ora tu voglia passare a un tipo di istanza Amazon EC2 m1.small. Se l'architettura del tipo di istanza cambia, l'istanza verrà creata con un'altra AMI. Se verifichi le mappature nel modello, vedrai che t1.micro e m1.small sono la stessa architettura e utilizzano le stesse AMI Amazon Linux.
"Mappings" : { "AWSInstanceType2Arch" : { "t1.micro" : { "Arch" : "HVM64" }, "t2.nano" : { "Arch" : "HVM64" }, "t2.micro" : { "Arch" : "HVM64" }, "t2.small" : { "Arch" : "HVM64" }, "t2.medium" : { "Arch" : "HVM64" }, "t2.large" : { "Arch" : "HVM64" }, "m1.small" : { "Arch" : "HVM64" }, "m1.medium" : { "Arch" : "HVM64" }, "m1.large" : { "Arch" : "HVM64" }, "m1.xlarge" : { "Arch" : "HVM64" }, "m2.xlarge" : { "Arch" : "HVM64" }, "m2.2xlarge" : { "Arch" : "HVM64" }, "m2.4xlarge" : { "Arch" : "HVM64" }, "m3.medium" : { "Arch" : "HVM64" }, "m3.large" : { "Arch" : "HVM64" }, "m3.xlarge" : { "Arch" : "HVM64" }, "m3.2xlarge" : { "Arch" : "HVM64" }, "m4.large" : { "Arch" : "HVM64" }, "m4.xlarge" : { "Arch" : "HVM64" }, "m4.2xlarge" : { "Arch" : "HVM64" }, "m4.4xlarge" : { "Arch" : "HVM64" }, "m4.10xlarge" : { "Arch" : "HVM64" }, "c1.medium" : { "Arch" : "HVM64" }, "c1.xlarge" : { "Arch" : "HVM64" }, "c3.large" : { "Arch" : "HVM64" }, "c3.xlarge" : { "Arch" : "HVM64" }, "c3.2xlarge" : { "Arch" : "HVM64" }, "c3.4xlarge" : { "Arch" : "HVM64" }, "c3.8xlarge" : { "Arch" : "HVM64" }, "c4.large" : { "Arch" : "HVM64" }, "c4.xlarge" : { "Arch" : "HVM64" }, "c4.2xlarge" : { "Arch" : "HVM64" }, "c4.4xlarge" : { "Arch" : "HVM64" }, "c4.8xlarge" : { "Arch" : "HVM64" }, "g2.2xlarge" : { "Arch" : "HVMG2" }, "g2.8xlarge" : { "Arch" : "HVMG2" }, "r3.large" : { "Arch" : "HVM64" }, "r3.xlarge" : { "Arch" : "HVM64" }, "r3.2xlarge" : { "Arch" : "HVM64" }, "r3.4xlarge" : { "Arch" : "HVM64" }, "r3.8xlarge" : { "Arch" : "HVM64" }, "i2.xlarge" : { "Arch" : "HVM64" }, "i2.2xlarge" : { "Arch" : "HVM64" }, "i2.4xlarge" : { "Arch" : "HVM64" }, "i2.8xlarge" : { "Arch" : "HVM64" }, "d2.xlarge" : { "Arch" : "HVM64" }, "d2.2xlarge" : { "Arch" : "HVM64" }, "d2.4xlarge" : { "Arch" : "HVM64" }, "d2.8xlarge" : { "Arch" : "HVM64" }, "hi1.4xlarge" : { "Arch" : "HVM64" }, "hs1.8xlarge" : { "Arch" : "HVM64" }, "cr1.8xlarge" : { "Arch" : "HVM64" }, "cc2.8xlarge" : { "Arch" : "HVM64" } }, "AWSRegionArch2AMI" : { "us-east-1" : {"HVM64" : "ami-0ff8a91507f77f867", "HVMG2" : "ami-0a584ac55a7631c0c"}, "us-west-2" : {"HVM64" : "ami-a0cfeed8", "HVMG2" : "ami-0e09505bc235aa82d"}, "us-west-1" : {"HVM64" : "ami-0bdb828fd58c52235", "HVMG2" : "ami-066ee5fd4a9ef77f1"}, "eu-west-1" : {"HVM64" : "ami-047bb4163c506cd98", "HVMG2" : "ami-0a7c483d527806435"}, "eu-west-2" : {"HVM64" : "ami-f976839e", "HVMG2" : "NOT_SUPPORTED"}, "eu-west-3" : {"HVM64" : "ami-0ebc281c20e89ba4b", "HVMG2" : "NOT_SUPPORTED"}, "eu-central-1" : {"HVM64" : "ami-0233214e13e500f77", "HVMG2" : "ami-06223d46a6d0661c7"}, "ap-northeast-1" : {"HVM64" : "ami-06cd52961ce9f0d85", "HVMG2" : "ami-053cdd503598e4a9d"}, "ap-northeast-2" : {"HVM64" : "ami-0a10b2721688ce9d2", "HVMG2" : "NOT_SUPPORTED"}, "ap-northeast-3" : {"HVM64" : "ami-0d98120a9fb693f07", "HVMG2" : "NOT_SUPPORTED"}, "ap-southeast-1" : {"HVM64" : "ami-08569b978cc4dfa10", "HVMG2" : "ami-0be9df32ae9f92309"}, "ap-southeast-2" : {"HVM64" : "ami-09b42976632b27e9b", "HVMG2" : "ami-0a9ce9fecc3d1daf8"}, "ap-south-1" : {"HVM64" : "ami-0912f71e06545ad88", "HVMG2" : "ami-097b15e89dbdcfcf4"}, "us-east-2" : {"HVM64" : "ami-0b59bfac6be064b78", "HVMG2" : "NOT_SUPPORTED"}, "ca-central-1" : {"HVM64" : "ami-0b18956f", "HVMG2" : "NOT_SUPPORTED"}, "sa-east-1" : {"HVM64" : "ami-07b14488da8ea02a0", "HVMG2" : "NOT_SUPPORTED"}, "cn-north-1" : {"HVM64" : "ami-0a4eaf6c4454eda75", "HVMG2" : "NOT_SUPPORTED"}, "cn-northwest-1" : {"HVM64" : "ami-6b6a7d09", "HVMG2" : "NOT_SUPPORTED"} }
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 di aggiornamento dello stack, nella pagina Specificare i parametri.
Per aggiornare lo stack dalla AWS Management Console
-
Nella CloudFormation dashboard, scegli lo stack che hai creato in precedenza, quindi scegli Update Stack.
-
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).
-
Modifica il valore della casella di InstanceTypetesto da a
t1.micro
.m1.small
Quindi, seleziona Next (Successivo). -
Nella schermata Options (Opzioni) selezionare Next (Avanti).
-
Selezionare Next (Avanti) perché lo stack non dispone di una policy di stack. Tutte le risorse possono essere aggiornate senza una policy di sostituzione.
-
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 Amazon EC2 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 console Amazon EC2 e individua l'istanza lì.
Aggiornamento dell'AMI in un'istanza Amazon EC2
Vediamo ora in che modo è possibile modificare l'Amazon Machine Image (AMI) in esecuzione nell'istanza. Inizieremo la modifica dell'AMI aggiornando lo stack in modo da utilizzare un nuovo tipo di istanza Amazon EC2, ad esempio 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 fermare l'istanza per modificare l'AMI; la CloudFormation considera una modifica a una proprietà immutabile della risorsa. Per apportare una modifica a una proprietà immutabile, è CloudFormation necessario avviare una risorsa sostitutiva, in questo caso una nuova istanza Amazon EC2 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
-
Creare le nuove AMI contenenti le modifiche all'applicazione o al sistema operativo. Per ulteriori informazioni, consulta la sezione Creazione delle proprie AMI nella Guida per l'utente di Amazon EC2.
-
Aggiornare il modello per incorporare i nuovi ID AMI.
-
Aggiorna lo stack, AWS Management Console come spiegato in Aggiornamento dell'applicazione o utilizzando il comando. AWS
aws cloudformation 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.
Aggiornamento della configurazione di avvio Amazon EC2 per un gruppo Auto Scaling
Se utilizzi gruppi Auto Scaling invece di istanze Amazon EC2, il processo di aggiornamento delle istanze in esecuzione è leggermente diverso. Con le risorse Auto Scaling la configurazione delle istanze Amazon EC2, come il tipo di istanza o l'ID AMI, è incorporata nella configurazione di avvio di Auto Scaling. Puoi apportare modifiche alla configurazione di avvio nello stesso modo in cui abbiamo modificato le risorse delle istanze Amazon EC2 nelle sezioni precedenti. Tuttavia, la modifica della configurazione di avvio non influisce sulle istanze Amazon EC2 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 questo caso, aggiungeremo una coppia di chiavi Amazon EC2 a un'istanza EC2 esistente e quindi apriremo la porta 22 nel gruppo di sicurezza Amazon EC2 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
-
Aggiungere al modello due ulteriori parametri per passare il nome di una coppia di chiavi Amazon EC2 e il percorso 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." } : },
-
Aggiungi la KeyName proprietà all'istanza Amazon EC2.
"WebServerInstance": { "Type" : "AWS::EC2::Instance", : "Properties": { :
"KeyName" : { "Ref" : "KeyName" },
: } }, -
Aggiungere la porta 22 e il percorso SSH alle regole di ingresso del gruppo di sicurezza Amazon EC2.
"WebServerSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP and SSH", "SecurityGroupIngress" : [ {"IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : { "Ref" : "SSHLocation"}}, {"IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0"} ] } },
-
Aggiorna lo stack, AWS Management Console come spiegato in Aggiornamento dell'applicazione o utilizzando il AWS comando.
aws cloudformation 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.
-
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" } } }
-
Convertire l'istanza EC2 nel modello in una configurazione di avvio di 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" -
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" } } }
-
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"}} ] } }
-
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. Puoi CloudFormation utilizzarlo per aggiornare qualsiasi proprietà; tuttavia, prima di apportare modifiche, dovresti considerare queste domande:
-
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.
-
La modifica è modificabile o non modificabile? Alcune modifiche alle proprietà delle risorse, ad esempio la modifica dell'AMI in un'istanza Amazon EC2, non sono supportate dai servizi sottostanti. In caso di modifiche modificabili, CloudFormation utilizzerà le API di tipo Update o Modify 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.