Desidero aggiornare il mio volume Amazon Elastic Block Store (Amazon EBS) in AWS CloudFormation senza che le istanze di Amazon Elastic Compute Cloud (Amazon EC2) vengano sostituite.
Breve descrizione
Come best practice, utilizza il tipo di risorsa AWS::EC2::Volume per impedire la sostituzione delle istanze durante l'aggiornamento dei volumi EBS in CloudFormation.
La sostituzione dell'istanza si verifica quando si specificano i volumi nella proprietà BlockDeviceMappings dei tipi di risorse AWS::EC2::Instance e AWS::EC2::Template. In questo caso, è necessario aggiungere un attributo Retain DeletionPolicy.
Prerequisiti: se modifichi il volume da gp2 a gp3, assicurati che il volume allegato all'istanza sia modificato in gp3. Inoltre, assicurati che l'istanza non sia negli stati Optimizing (Ottimizzazione) o Modifying (Modifica). Prima di modificare il volume in gp3, controlla quali sono le limitazioni.
Importante: prima di risolvere il problema, acquisici uno snapshot dei volumi per creare un backup dei carichi di lavoro essenziali.
Risoluzione
1. Aggiungi Retain DeletionPolicy allo stack CloudFormation per l'istanza di cui desideri aggiornare il volume e successivamente aggiorna lo stack:
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
2. Aggiorna nuovamente lo stack CloudFormation rimuovendo l'istanza dal modello. Nota: se nel modello è presente una sola risorsa, è necessario creare una risorsa sostitutiva, ad esempio un'altra istanza. È possibile eliminare la risorsa dal modello dopo aver terminato.
3. Modifica gli attributi del volume EBS in base alle tue esigenze.
4. Importa nuovamente l'istanza nello stack CloudFormation.
Per importare nuovamente l'istanza nello stack CloudFormation:
1. Apri la console di AWS CloudFormation.
2. Nella pagina dello stack, scegli Stack actions (Azioni sullo stack), quindi scegli Import resources into stack (Importa risorse nello stack).
3. Aggiorna il modello:
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
4. Inserisci il valore dell'ID istanza nel campo Identifier (Identificatore).
5. Scegli Import resource (Importa risorsa).
Dopo che CloudFormation passa allo stato IMPORT_COMPLETE, le istanze fanno di nuovo parte dello stack.
Nota: è possibile che venga visualizzato l'errore There was an error creating this change set (Si è verificato un errore durante la creazione di questo set di modifiche). Nell'ambito dell'operazione di importazione, non è possibile modificare o aggiungere [Output]. Per risolvere questo problema, verifica che le sezioni Output del modello CloudFormation più recente e del modello utilizzato dallo stack siano uguali. In caso contrario, aggiorna il modello CloudFormation più recente in modo che corrisponda ai valori nella sezione Output del modello utilizzato dal tuo stack. Successivamente, aggiorna di nuovo lo stack.