Je souhaite mettre à jour mon volume Amazon Elastic Block Store (Amazon EBS) dans AWS CloudFormation. Cependant, je ne souhaite pas remplacer mes instances Amazon Elastic Compute Cloud (Amazon EC2).
Résolution
Pour empêcher le remplacement d'instance, il est recommandé d'utiliser le type de ressource AWS::EC2::Volume lorsque vous mettez à 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 ressource AWS::EC2::Instance et AWS::EC2::Template. Dans ce scénario, vous devez ajouter un attribut DeletionPolicy retain.
Important : Si vous modifiez manuellement le volume, par exemple de gp2 à gp3, vous devez également modifier le volume attaché à l'instance. Vérifiez que l'instance n'est pas à l’état Optimisation ou Modification. Avant de modifier le volume en gp3, assurez-vous de respecter les exigences de modification du volume.
Pour éviter le remplacement d'instance lorsque vous modifiez des volumes que vous spécifiez à l'aide de la propriété BlockDeviceMappings, procédez comme suit.
Ajouter un attribut DeletionPolicy retain à la ressource de modèle AWS::EC2::Instance cible
Procédez comme suit :
-
Prenez un instantané des volumes pour créer une sauvegarde des charges de travail critiques.
-
Définissez l’attribut DeletionPolicy sur Retain dans la pile CloudFormation de l'instance contenant le volume que vous souhaitez mettre à jour. Exemple :
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
-
Mettez à jour la pile.
Supprimer la ressource de sa pile CloudFormation et implémenter vos modifications
Procédez comme suit :
- Supprimez l'instance du modèle pour la supprimer de la pile CloudFormation, mais ne supprimez pas la ressource sous-jacente. Modifiez ensuite manuellement l'instance EC2.
Remarque : Si votre modèle ne contient qu'une seule ressource, vous devez créer une ressource suppléante, telle qu'une autre instance. Vous pouvez supprimer la ressource du modèle après avoir réimporté l'instance EC2 dans le modèle.
- Modifiez les attributs du volume EBS.
Réimporter la ressource dans votre pile CloudFormation
Procédez comme suit :
-
Ouvrez la console CloudFormation.
-
Dans le panneau de navigation, sélectionnez Pile.
-
Choisissez Actions de pile, puis choisissez Importer les ressources dans la pile.
-
Entrez le modèle CloudFormation mis à jour. Exemple :
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
Remarque : Pour importer une ressource, le modèle CloudFormation doit décrire la ressource avec ses configurations existantes.
-
Dans Identifiant, entrez l'ID de l'instance.
-
Choisissez Importer une ressource.
Une fois que CloudFormation a mis à jour le statut sur IMPORT_COMPLETE, l'instance fait partie de la pile.
Le message « There was an error creating this change set. As part of the import operation, you cannot modify or and [Outputs] » (Une erreur s'est produite lors de la création de cet ensemble de modifications. Dans le cas de l’opération d’importation, vous ne pouvez pas modifier ou/et [Outputs]) peut s’afficher. Pour résoudre ce problème, vérifiez que la section Sorties du dernier modèle CloudFormation correspond au modèle utilisé par votre pile. S'ils ne sont pas identiques, mettez à jour le dernier modèle CloudFormation afin qu'il corresponde aux valeurs de la section Sorties du modèle utilisé par votre pile. Ensuite, mettez à jour à nouveau la pile.