Jeveuxmettre à jour mon volume Amazon Elastic Block Store (Amazon EBS) dans AWS CloudFormation sans que les instances Amazon Elastic Compute Cloud (Amazon EC2) soient remplacées.
Brève description
Comme bonne pratique, utilisez le type de ressource AWS::EC2::Volume pour empêcher le remplacement des instances lors de la mise à jour des volumes EBS dans CloudFormation.
Le remplacement d'instance se produit lorsque vous spécifiez des volumes dans la propriété BlockDeviceMappings des types de ressources AWS::EC2::Instance et AWS::EC2::Template. Dans ce cas, vous devez ajouter un attribut Retain DeletionPolicy.
Prérequis : si vous modifiez le volume de gp2 en gp3, assurez-vous que le volume attaché à l'instance est modifié en gp3. Assurez-vous également que l'instance n'est pas dans les états Optimizing (Optimisation) ou Modifying (Modification). Avant de modifier le volume en gp3, vérifiez quelles sont les limitations.
Important : avant de résoudre le problème, prenez un instantané des volumes pour créer une sauvegarde des charges de travail critiques.
Solution
1. Ajoutez l'attribut Retain DeletionPolicy à la pile CloudFormation pour l'instance dont vous souhaitez mettre à jour le volume, puis mettez à jour la pile :
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. Mettez à nouveau à jour la pile CloudFormation en supprimant l'instance du modèle. Remarque : si vous n'avez qu'une seule ressource dans votre modèle, vous devez créer une ressource de réserve, telle qu'une autre instance. Vous pouvez supprimer la ressource du modèle après avoir terminé.
3. Modifiez les attributs du volume EBS selon vos besoins.
4. Réimportez l'instance dans la pile CloudFormation.
Pour réimporter l'instance dans la pile CloudFormation :
1. Ouvrez la console AWS CloudFormation.
2. Sur la page de la pile, choisissez Stack actions (Actions de pile), puis choisissez Import resources into stack (Importer des ressources dans la pile).
3. Mettez à jour le modèle :
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. Saisissez la valeur de l'ID d'instance dans le champ Identifier (Identifiant).
5. Choisissez Import resource (Importer une ressource).
Une fois que CloudFormation est passé au statut IMPORT_COMPLETE, les instances font à nouveau partie de la pile.
Remarque : il se peut que vous receviez l'erreur « There was an error creating this change set. As part of the import operation, you cannot modify or add [Outputs] » (Une erreur s'est produite lors de la création de ce jeu de modifications. Dans le cadre de l'opération d'importation, vous ne pouvez pas modifier ou ajouter [Outputs]). Pour résoudre ce problème, vérifiez que les sections Outputs (Sorties) du dernier modèle CloudFormation et du modèle que votre pile utilise sont les mêmes. Si ce n'est pas le cas, mettez à jour le dernier modèle CloudFormation pour faire correspondre les valeurs de la section Outputs (Sorties) avec celles du modèle que votre pile utilise. Ensuite, mettez à jour la pile à nouveau.