Desidero aggiornare il mio volume Amazon Elastic Block Store (Amazon EBS) in AWS CloudFormation. Tuttavia, non voglio sostituire le mie istanze Amazon Elastic Compute Cloud (Amazon EC2).
Risoluzione
Per evitare la sostituzione di un'istanza, è consigliabile utilizzare il tipo di risorsa AWS::EC2::Volume quando si aggiornano i volumi EBS in CloudFormation.
La sostituzione dell'istanza avviene quando si specificano i volumi nella proprietà BlockDeviceMappings dei tipi di risorsa AAWS::EC2::Instance e AWS::EC2::Template. In questo scenario, devi aggiungere un attributo retain DeletionPolicy.
Importante: se modifichi manualmente il volume, ad esempio da gp2 a gp3, devi modificare anche il volume collegato all'istanza. Verifica che l'istanza non sia nello stato Ottimizzazione o Modifica. Prima di modificare il volume in gp3, assicurati di rispettare i requisiti di modifica del volume.
Per evitare la sostituzione dell'istanza quando modifichi i volumi specificati con la proprietà BlockDeviceMappings, effettua le seguenti operazioni.
Aggiungi un attributo retain DeletionPolicy alla risorsa modello AWS::EC2::Instance di destinazione
Completa i seguenti passaggi:
-
Esegui uno snapshot dei volumi per creare un backup dei carichi di lavoro critici.
-
Imposta DeletionPolicy su Retain nello stack CloudFormation dell'istanza con il volume che desideri aggiornare. Esempio:
AWSTemplateFormatVersion: '2010-09-09'
Resources:
Myinstance:
Type: AWS::EC2::Instance
DeletionPolicy: Retain
Properties:
BlockDeviceMappings:
- DeviceName: /dev/xvda
Ebs:
VolumeType: gp2
VolumeSize: 10
DeleteOnTermination: true
EbsOptimized: false
ImageId: ami-064ff912f78e3e561
InstanceInitiatedShutdownBehavior: stop
InstanceType: t2.micro
Monitoring: false
-
Aggiorna lo stack.
Rimuovi la risorsa dal suo stack CloudFormation e implementa le modifiche
Completa i seguenti passaggi:
- Rimuovi l'istanza dal modello per rimuoverla dallo stack CloudFormation, ma non eliminare la risorsa sottostante. Quindi modifica manualmente l'istanza EC2.
Nota: se nel modello è presente una sola risorsa, è necessario creare una risorsa sostitutiva, ad esempio un'altra istanza. Puoi eliminare la risorsa dal modello dopo aver importato nuovamente nel modello l'istanza EC2.
- Modifica gli attributi del volume EBS.
Importa nuovamente la risorsa nello stack CloudFormation
Completa i seguenti passaggi:
-
Apri la console CloudFormation.
-
Nel pannello di navigazione, scegli Stack.
-
Scegli Operazioni stack, quindi scegli Importa risorse nello stack.
-
Inserisci il modello CloudFormation aggiornato. Esempio:
AWSTemplateFormatVersion: '2010-09-09'
Resources:
Myinstance:
Type: AWS::EC2::Instance
DeletionPolicy: Retain
Properties:
BlockDeviceMappings:
- DeviceName: /dev/xvda
Ebs:
VolumeType: gp3
VolumeSize: 100
DeleteOnTermination: true
EbsOptimized: false
ImageId: ami-064ff912f78e3e561
InstanceInitiatedShutdownBehavior: stop
InstanceType: t2.micro
Monitoring: false
Nota: per importare una risorsa, il modello CloudFormation deve descrivere la risorsa con le sue configurazioni esistenti.
-
In Identificatore, inserisci l'ID dell'istanza.
-
Scegli Import resource (Importa risorsa).
Dopo che CloudFormation ha aggiornato lo stato a IMPORT_COMPLETE, l'istanza fa parte dello stack.
Potresti ricevere il messaggio di errore "There was an error creating this change set. As part of the import operation, you cannot modify or add [Outputs]". Per risolvere il problema, verifica che la sezione Output del modello CloudFormation più recente corrisponda al modello utilizzato dallo stack. Se non sono uguali, aggiorna il modello CloudFormation più recente in modo che corrisponda ai valori nella sezione Output del modello utilizzato dallo stack. Quindi aggiorna nuovamente lo stack.