

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à.

# Aggiornare uno CloudFormation stack
<a name="updating.stacks.walkthrough"></a>

**Nota**  
Questo tutorial si basa sui concetti del [Implementa le applicazioni su Amazon EC2](deploying.applications.md) tutorial. Se non hai completato il tutorial, ti consigliamo di farlo prima per capire come funziona il EC2 bootstrap con. CloudFormation

Questo argomento illustra una semplice progressione degli aggiornamenti a uno stack in esecuzione. Verranno descritte le fasi seguenti:

1. **Crea lo stack iniziale**: crea uno stack utilizzando un'AMI Amazon Linux 2 di base, installando Apache Web Server e una semplice applicazione PHP utilizzando gli CloudFormation script di supporto.

1. **Aggiorna l'applicazione**: aggiorna uno dei file dell'applicazione e distribuisci il software utilizzando. CloudFormation

1. **Aggiungi una coppia di chiavi**: aggiungi una coppia di EC2 chiavi Amazon all'istanza, quindi aggiorna il gruppo di sicurezza per consentire l'accesso SSH all'istanza.

1. **Aggiorna il tipo di istanza**: modifica il tipo di istanza dell' EC2 istanza Amazon sottostante.

1. **Aggiorna l'AMI**: modifica l'Amazon Machine Image (AMI) per l' EC2 istanza Amazon nel tuo stack.

**Nota**  
CloudFormation è gratuito, ma ti verranno addebitati i costi per le EC2 risorse Amazon che crei. Tuttavia, se sei alle prime armi AWS, puoi sfruttare il [piano gratuito](https://aws.amazon.com/free/) per ridurre al minimo o eliminare i costi durante questo processo di apprendimento.

**Topics**
+ [Fase 1: Creare lo stack iniziale](#update-stack-initial-stack)
+ [Passaggio 2: aggiorna l'applicazione](#update-stack-update-application)
+ [Fase 3: Aggiungere l'accesso SSH con una coppia di key pair](#update-stack-add-key-pair)
+ [Fase 4: Aggiornare il tipo di istanza](#update-stack-update-instance-type)
+ [Fase 5: Aggiornare l'AMI](#update-stack-update-ami)
+ [Considerazioni su disponibilità e impatto](#update.walkthrough.impact)
+ [Risorse correlate](#update.walkthrough.related)

## Fase 1: Creare lo stack iniziale
<a name="update-stack-initial-stack"></a>

Inizieremo creando uno stack che potremo utilizzare nel resto di questo argomento. Abbiamo fornito un modello semplice che avvia un'applicazione Web PHP a istanza singola ospitata su Apache Web Server e in esecuzione su un'AMI Amazon Linux 2.

L'Apache Web Serverapplicazione PHP e la semplice applicazione PHP sono tutte installate dagli script di CloudFormation supporto installati di default sull'AMI Amazon Linux 2. Il seguente frammento di modello mostra i metadati che descrivono i pacchetti e i file da installare, in questo caso l'Apache Web Serverinfrastruttura PHP dal Yum repository per l'AMI Amazon Linux 2. Lo snippet mostra anche la `Services` sezione, che assicura che sia in esecuzione. Apache Web Server 

```
WebServerInstance:
  Type: AWS::EC2::Instance
  Metadata:
    AWS::CloudFormation::Init:
      config:
        packages:
          yum:
            httpd: []
            php: []
        files:
          /var/www/html/index.php:
            content: |
              <?php
              echo '<h1>Hello World!</h1>';
              ?>
            mode: '000644'
            owner: apache
            group: apache
        services:
          systemd:
            httpd:
              enabled: true
              ensureRunning: true
```

L'applicazione stessa è un esempio di «Hello World» interamente 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 `cfn-hup` demone per ascoltare le modifiche alla configurazione definita nei metadati per l'istanza Amazon. EC2 Utilizzando il `cfn-hup` daemon, puoi aggiornare il software applicativo, come la versione di Apache o PHP, oppure puoi aggiornare il file dell'applicazione PHP stesso da. CloudFormation Il seguente frammento della stessa EC2 risorsa Amazon nel modello mostra le parti necessarie per configurare la chiamata `cfn-init` ogni due minuti `cfn-hup` per notificare e applicare gli aggiornamenti ai metadati. Altrimenti, viene eseguito una `cfn-init` sola volta all'avvio.

```
files:
  /etc/cfn/cfn-hup.conf:
    content: !Sub |
      [main]
      stack=${AWS::StackId}
      region=${AWS::Region}
      # The interval used to check for changes to the resource metadata in minutes. Default is 15
      interval=2
    mode: '000400'
    owner: root
    group: root
  /etc/cfn/hooks.d/cfn-auto-reloader.conf:
    content: !Sub |
      [cfn-auto-reloader-hook]
      triggers=post.update
      path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init
      action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region}
      runas=root
services:
  systemd:
    cfn-hup:
      enabled: true
      ensureRunning: true
      files:
        - /etc/cfn/cfn-hup.conf
        - /etc/cfn/hooks.d/cfn-auto-reloader.conf
```

Per completare lo stack, nella `Properties` sezione della definizione dell' EC2 istanza Amazon, la `UserData` proprietà contiene lo `cloud-init` script che chiama `cfn-init` per installare i pacchetti e i file. Per ulteriori informazioni, consulta il [riferimento agli script di CloudFormation supporto](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-helper-scripts-reference.html) nella *CloudFormation Template* Reference Guide. Il modello crea anche un gruppo EC2 di sicurezza Amazon.

```
AWSTemplateFormatVersion: 2010-09-09

Parameters:
  LatestAmiId:
    Description: The latest Amazon Linux 2 AMI from the Parameter Store
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'

  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t3.micro
    AllowedValues:
      - t3.nano
      - t3.micro
      - t3.small
      - t3.medium
      - t3a.nano
      - t3a.micro
      - t3a.small
      - t3a.medium
      - m5.large
      - m5.xlarge
      - m5.2xlarge
      - m5a.large
      - m5a.xlarge
      - m5a.2xlarge
      - c5.large
      - c5.xlarge
      - c5.2xlarge
      - r5.large
      - r5.xlarge
      - r5.2xlarge
      - r5a.large
      - r5a.xlarge
      - r5a.2xlarge
    ConstraintDescription: must be a valid EC2 instance type.
    
Resources:
  WebServerInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: !Ref InstanceType
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          # Get the latest CloudFormation package
          yum update -y aws-cfn-bootstrap
          # Run cfn-init
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region} || error_exit 'Failed to run cfn-init'        
          # Start up the cfn-hup daemon to listen for changes to the EC2 instance metadata
          /opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup'
          # Signal success or failure
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region}
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:
            yum:
              httpd: []
              php: []
          files:
            /var/www/html/index.php:
              content: |
                <?php
                echo "<h1>Hello World!</h1>";
                ?>
              mode: '000644'
              owner: apache
              group: apache
            /etc/cfn/cfn-hup.conf:
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
                # The interval used to check for changes to the resource metadata in minutes. Default is 15
                interval=2
              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Sub |
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region}
                runas=root
          services:
            systemd:
              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
    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:
    Value: !Sub 'http://${WebServerInstance.PublicDnsName}'
    Description: URL of the web application
```

**Per avviare uno stack da questo modello**

1. Copia il modello e salvalo localmente sul tuo sistema come file di testo. Annotare il percorso perché sarà necessario utilizzare il file in una fase successiva.

1. Accedi Console di gestione AWS e apri la CloudFormation console all'indirizzo [https://console.aws.amazon.com/cloudformazione.](https://console.aws.amazon.com/cloudformation/)

1. Scegli **Crea stack, con nuove risorse** (standard).

1. Scegli **Scegli un modello esistente**.

1. In **Specificare modello**, scegli **Carica un file modello** e vai al file che hai creato nel primo passaggio, quindi scegli **Avanti**.

1. Nella pagina **Specificare i dettagli dello stack**, immettete **UpdateTutorial** come nome dello stack.

1. In **Parametri**, mantieni invariati tutti i parametri e scegli **Avanti** due volte.

1. Nella schermata **Rivedi e crea**, scegli **Invia**.

Dopo che lo stato del tuo stack sarà stato raggiunto`CREATE_COMPLETE`, la scheda **Output** mostrerà l'URL del tuo sito web. Se scegli il valore dell'`WebsiteURL`output, vedrai funzionare la tua nuova applicazione PHP.

## Passaggio 2: aggiorna l'applicazione
<a name="update-stack-update-application"></a>

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:

```
files:
  /var/www/html/index.php:
    content: |
      <?php
      echo "<h1>Hello World!</h1>";
      {{echo "<p>This is an updated version of our application.</p>";}}
      ?>
    mode: '000644'
    owner: apache
    group: apache
```

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

Ora aggiorna lo stack.

**Per aggiornare lo stack con il modello aggiornato**

1. Nella CloudFormation console, seleziona il tuo **UpdateTutorial** stack.

1. Scegli **Aggiorna, Effettua un aggiornamento diretto**.

1. Scegli **Sostituisci modello esistente**.

1. In **Specificare modello**, scegli **Carica un file modello** e carica il file modello modificato, quindi scegli **Avanti**.

1. Nella pagina **Specificare i dettagli dello stack**, mantieni invariati tutti i parametri e scegli **Avanti** due volte.

1. Nella pagina **Revisione**, esamina le modifiche. In **Modifiche**, dovresti vedere che CloudFormation aggiornerà la `WebServerInstance` risorsa.

1. Seleziona **Invia**.

Quando lo stack è nello `UPDATE_COMPLETE` stato, puoi scegliere nuovamente il valore `WebsiteURL` di output per verificare che le modifiche all'applicazione abbiano avuto effetto. Il `cfn-hup` demone viene eseguito ogni 2 minuti, quindi potrebbero essere necessari fino a 2 minuti prima che l'applicazione cambi una volta aggiornato lo 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 interessate dalle 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 o ad altre funzioni `Ref` `GetAtt` intrinseche del modello. Per ulteriori informazioni, consulta [Intrinsic function reference](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

Questo semplice aggiornamento illustra il processo. Tuttavia, puoi apportare modifiche molto più complesse ai file e ai pacchetti distribuiti nelle tue EC2 istanze Amazon. 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.

```
packages:
  yum:
    httpd: []
    php: []
    {{mysql: []}}
    {{php-mysql: []}}
    {{mysql-server: []}}
    {{mysql-libs: []}}

  {{...}}

services:
  systemd:
    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}}
```

Puoi aggiornare i CloudFormation metadati per aggiornarli alle nuove versioni dei pacchetti utilizzati dall'applicazione. Negli esempi precedenti, la proprietà version 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 RubyGems i 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"
```

## Fase 3: Aggiungere l'accesso SSH con una coppia di key pair
<a name="update-stack-add-key-pair"></a>

Puoi anche aggiornare una risorsa nel modello per aggiungere proprietà che non erano state originariamente specificate nel modello. Per illustrare ciò, aggiungeremo una coppia di EC2 chiavi Amazon a un' EC2istanza esistente e quindi apriremo la porta 22 nel gruppo di EC2 sicurezza Amazon in modo da poter utilizzare Secure Shell (SSH) per accedere all'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 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 that can be used to SSH to the EC2 instances in CIDR format (e.g. 203.0.113.1/32)
       Type: String
       MinLength: 9
       MaxLength: 18
       Default: 0.0.0.0/0
       AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$'
       ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
   ```

1. Aggiungi la `KeyName` proprietà all' EC2 istanza Amazon.

   ```
   WebServerInstance:
     Type: AWS::EC2::Instance
     Properties:
       ImageId: !Ref LatestAmiId
       InstanceType: !Ref InstanceType
       KeyName: !Ref KeyName
       SecurityGroupIds:
         - !Ref WebServerSecurityGroup
   ```

1. 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 access via port 80 and SSH access via port 22
       SecurityGroupIngress:
         - IpProtocol: tcp
           FromPort: 80
           ToPort: 80
           CidrIp: 0.0.0.0/0
         - IpProtocol: tcp
           FromPort: 22
           ToPort: 22
           CidrIp: !Ref SSHLocation
   ```

1. Aggiorna lo stack seguendo gli stessi passaggi spiegati in. [Passaggio 2: aggiorna l'applicazione](#update-stack-update-application)

## Fase 4: Aggiornare il tipo di istanza
<a name="update-stack-update-instance-type"></a>

Ora dimostriamo come aggiornare l'infrastruttura sottostante modificando il tipo di istanza.

Lo stack che abbiamo creato finora utilizza un'istanza Amazon EC2 t3.micro. Supponiamo che il tuo sito web appena creato stia ricevendo più traffico di quanto possa gestire un'istanza t3.micro e ora desideri passare a un tipo di istanza Amazon m5.large. EC2 Se l'architettura del tipo di istanza cambia, l'istanza deve essere creata con un'AMI diversa. Tuttavia, sia t3.micro che m5.large utilizzano le stesse architetture di CPU ed eseguono Amazon Linux 2 (x86\_64). AMIs Per ulteriori informazioni, consulta la sezione [Compatibilità per la modifica del tipo di istanza](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/resize-limitations.html) nella *Amazon EC2 User Guide*.

Utilizziamo il modello che abbiamo modificato nel passaggio precedente per cambiare 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 pagina **Specificare i dettagli dello stack**.

**Per aggiornare lo stack con un nuovo valore di parametro**

1. Nella CloudFormation console, seleziona il tuo **UpdateTutorial** stack.

1. Scegli **Aggiorna, Effettua un aggiornamento diretto**.

1. Scegli **Usa modello esistente**, quindi scegli **Avanti**.

1. Nella pagina **Specificare i dettagli dello stack**, modifica il valore della casella di **InstanceType**testo da `t3.micro` a`m5.large`. Quindi, scegli **Avanti** due volte.

1. Nella pagina **Revisione**, esamina le modifiche. In **Modifiche**, dovresti vedere che CloudFormation aggiornerà la `WebServerInstance` risorsa.

1. Seleziona **Invia**.

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 Console di gestione AWS, apri la EC2 console Amazon e individua l'istanza lì.

## Fase 5: Aggiornare l'AMI
<a name="update-stack-update-ami"></a>

Ora aggiorniamo il nostro stack per utilizzare Amazon Linux 2023, che è la prossima generazione di Amazon Linux. 

L'aggiornamento dell'AMI è una modifica importante che richiede la sostituzione dell'istanza. 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 EC2 istanza Amazon che esegue la nuova AMI. 

Diamo un'occhiata a come potremmo aggiornare il nostro modello di stack per utilizzare Amazon Linux 2023. Le modifiche principali includono l'aggiornamento del parametro AMI e il passaggio `yum` da un gestore di `dnf` pacchetti.

```
AWSTemplateFormatVersion: 2010-09-09

Parameters:
  LatestAmiId:
    Description: The latest Amazon Linux 2023 AMI from the Parameter Store
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: '/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64'

  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t3.micro
    AllowedValues:
      - t3.nano
      - t3.micro
      - t3.small
      - t3.medium
      - t3a.nano
      - t3a.micro
      - t3a.small
      - t3a.medium
      - m5.large
      - m5.xlarge
      - m5.2xlarge
      - m5a.large
      - m5a.xlarge
      - m5a.2xlarge
      - c5.large
      - c5.xlarge
      - c5.2xlarge
      - r5.large
      - r5.xlarge
      - r5.2xlarge
      - r5a.large
      - r5a.xlarge
      - r5a.2xlarge
    ConstraintDescription: must be a valid EC2 instance type.

  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 that can be used to SSH to the EC2 instances in CIDR format (e.g. 203.0.113.1/32)
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: 0.0.0.0/0
    AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
    
Resources:
  WebServerInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: !Ref InstanceType
      KeyName: !Ref KeyName
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          # Get the latest CloudFormation package
          dnf update -y aws-cfn-bootstrap
          # Run cfn-init
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region} || error_exit 'Failed to run cfn-init'        
          # Start up the cfn-hup daemon to listen for changes to the EC2 instance metadata
          /opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup'
          # Signal success or failure
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region}
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:
            dnf:
              httpd: []
              php: []
          files:
            /var/www/html/index.php:
              content: |
                <?php
                echo "<h1>Hello World!</h1>";
                echo "<p>This is an updated version of our application.</p>";
                echo "<p>Running on Amazon Linux 2023!</p>";
                ?>
              mode: '000644'
              owner: apache
              group: apache
            /etc/cfn/cfn-hup.conf:
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
                # The interval used to check for changes to the resource metadata in minutes. Default is 15
                interval=2
              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Sub |
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region}
                runas=root
          services:
            systemd:
              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
    CreationPolicy:
      ResourceSignal:
        Timeout: PT5M

  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via port 80 and SSH access via port 22
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref SSHLocation

Outputs:
  WebsiteURL:
    Value: !Sub 'http://${WebServerInstance.PublicDnsName}'
    Description: URL of the web application
```

Aggiorna lo stack seguendo gli stessi passaggi spiegati in[Passaggio 2: aggiorna l'applicazione](#update-stack-update-application).

Dopo l'esecuzione della nuova istanza, CloudFormation aggiorna le altre risorse dello stack in modo che puntino alla nuova risorsa. Quando tutte le nuove risorse sono state create, la vecchia risorsa viene eliminata, in un processo noto come `UPDATE_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 Eventi contengono una descrizione «L'aggiornamento richiesto comporta una modifica a una proprietà immutabile e quindi crea una nuova risorsa fisica» per indicare che una risorsa è stata sostituita.**

In alternativa: se hai un codice applicativo scritto nell'AMI che desideri aggiornare, puoi utilizzare lo stesso meccanismo di aggiornamento dello stack per aggiornare l'AMI e caricare la tua nuova applicazione.

**Per aggiornare l'AMI con codice applicativo personalizzato**

1. Crea la tua nuova AMI contenente le modifiche all'applicazione o al sistema operativo. *Per ulteriori informazioni, consulta [Creare un'AMI supportata da Amazon EBS nella](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html) Amazon User Guide. EC2 *

1. Aggiorna il modello per incorporare il nuovo ID AMI.

1. Aggiorna lo stack seguendo gli stessi passaggi spiegati in[Passaggio 2: aggiorna l'applicazione](#update-stack-update-application).

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.

## Considerazioni su disponibilità e impatto
<a name="update.walkthrough.impact"></a>

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.

1. 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
<a name="update.walkthrough.related"></a>

Per ulteriori informazioni sull'utilizzo CloudFormation per avviare le applicazioni e sull'integrazione con altri servizi di configurazione e distribuzione come Puppet eOpscode Chef, consulta i seguenti white paper:
+ [Avvio delle applicazioni tramite CloudFormation](https://s3.amazonaws.com/cloudformation-examples/BoostrappingApplicationsWithAWSCloudFormation.pdf)
+ [Integrazione con CloudFormation Opscode Chef](https://s3.amazonaws.com/cloudformation-examples/IntegratingAWSCloudFormationWithOpscodeChef.pdf)
+ [Integrazione con CloudFormation Puppet](https://s3.amazonaws.com/cloudformation-examples/IntegratingAWSCloudFormationWithPuppet.pdf)