Comment arrêter ou reconstruire mon environnement AWS Elastic Beanstalk lorsqu'il est impossible de supprimer AWSEBSecurityGroup ?

Date de la dernière mise à jour : 07/06/2019

Lorsque j'essaie d'arrêter ou de reconstruire mon environnement AWS Elastic Beanstalk, je reçois le message d'erreur « Stack deletion failed: The following resource(s) failed to delete: [AWSEBSecurityGroup] » (Échec de la suppression de la pile : la ou les ressources suivantes n'ont pas pu être supprimées : [AWSEBSecurityGroup]).

Comment résoudre ce problème ?

Brève description

AWSEBSecurityGroup est un groupe de sécurité Amazon Elastic Compute Cloud (Amazon EC2) créé par la pile sous-jacente AWS CloudFormation via Elastic Beanstalk. Si AWSEBSecurityGroup est utilisé par une interface réseau Elastic (ENI) ou que les groupes de sécurité ont été créés en dehors de votre environnement Elastic Beanstalk, l'arrêt ou la reconstruction de l'environnement peut échouer et renvoyer une erreur.

Remarque : il est préférable de gérer les ressources créées par Elastic Beanstalk à l'aide de la console Elastic Beanstalk, de l'interface de ligne de commande Elastic Beanstalk (CLI EB), ou de l'interface de ligne de commande AWS (CLI AWS).

Résolution

Pour éliminer cette erreur, choisissez l'une des options suivantes :

  • (Option A) Dans la console AWS CloudFormation ou l'interface de ligne de commande AWS (CLI AWS), supprimez la pile AWS CloudFormation créée par l'environnement Elastic Beanstalk, puis arrêtez l'environnement Elastic Beanstalk.
  • (Option B) Supprimez les objets dépendants de votre groupe de sécurité Elastic Beanstalk, puis arrêtez l'environnement Elastic Beanstalk.

Important : veillez à saisir les valeurs correctes pour le nom de pile, le nom de l'environnement, la région AWS et les autres variables d'environnement dans l'interface de ligne de commande AWS (CLI AWS).

(Option A) Supprimer la pile à partir de la console AWS CloudFormation

Vous pouvez supprimer la pile à partir de la console AWS CloudFormation ou de l'interface de ligne de commande AWS (CLI AWS).

Console AWS CloudFormation :

1.    Ouvrez la console AWS CloudFormation.

2.    Dans la colonne Stack Name (Nom de la pile), choisissez la pile que vous ne parvenez pas à supprimer.

Remarque : la colonne Status (Statut) de la pile doit indiquer DELETE_FAILED.

3.    Dans le menu Actions, choisissez Delete Stack (Supprimer la pile).

4.    Dans la fenêtre Delete Stack (Supprimer la pile), choisissez AWSEBSecurityGroup, puis Yes, Delete (Oui, supprimer).

Important : veillez à supprimer le groupe de sécurité. AWSEBSecurityGroup n'est pas supprimé automatiquement lorsque vous supprimez la pile. Si l'arrêt de l'environnement échoue en raison d'une autre ressource dépendante, choisissez la ressource appropriée dans l'état DELETE_FAILED dans la fenêtre contextuelle Delete Stack (Supprimer la pile). Ensuite, choisissez Yes, Delete (Oui, supprimer).

5.    Arrêtez ou reconstruisez l'environnement Elastic Beanstalk.

CLI AWS :

1.    Pour supprimer la pile AWS CloudFormation, exécutez la commande suivante :

aws cloudformation delete-stack --stack-name awseb-e-ztrauxujck-stack --retain-resources "AWSEBSecurityGroup" --region us-east-1

2.    Pour arrêter l'environnement Elastic Beanstalk, exécutez la commande suivante :

aws elasticbeanstalk terminate-environment --environment-name my-env --region us-east-1

3.    Pour reconstruire l'environnement Elastic Beanstalk, exécutez la commande suivante :

aws elasticbeanstalk rebuild-environment --environment-name my-env --region us-east-1

(Option B) Rechercher et supprimer les objets dépendants pour le groupe de sécurité Elastic Beanstalk

Pour rechercher une interface réseau Elastic dépendante ou un groupe de sécurité dépendant qui empêche la suppression d'AWSEBSecurityGroup, procédez comme suit avec la console Amazon EC2 ou l'interface de ligne de commande AWS (CLI AWS).

Console Amazon EC2 :

1.    Recherchez l'ID de groupe de sécurité de AWSEBSecurityGroup dans le message d'erreur dans le flux d'événements Elastic Beanstalk.

2.    Ouvrez la console Amazon EC2.

3.    Dans le volet de navigation, choisissez Security Groups (Groupes de sécurité), puis l'ID AWSEBSecurityGroup que vous avez obtenu dans l'étape 1.

4.    Choisissez Actions, puis Delete Security Group (Supprimer le groupe de sécurité) pour rechercher les dépendances sur AWSEBSecurityGroup.

5.    Dans la fenêtre contextuelle Delete Security Groups (Supprimer les groupes de sécurité), choisissez View your associated instance (Afficher votre instance associée).
Sélectionnez Actions, puis Networking (Mise en réseau).
Choisissez Change Security Group (Changer le groupe de sécurité).
Désélectionnez les cases à cocher AWSEBSecurityGroup ID (ID AWSEBSecurityGroup) et Assign Security Groups (Attribuer des groupes de sécurité).

6.    Revenez dans la fenêtre contextuelle Delete Security Groups (Supprimer les groupes de sécurité), puis choisissez View your referencing security groups (Afficher vos groupes de sécurité de référencement).
Pour supprimer l'association de l'ID AWSEBSecurityGroup, choisissez Actions, puis Edit inbound rules (Modifier les règles de trafic entrant) ou Edit outbound rules (Modifier les règles de trafic sortant) en fonction de vos besoins.

7.    Arrêtez ou reconstruisez l'environnement Elastic Beanstalk.

CLI AWS :

L'interface de ligne de commande AWS (CLI AWS) est nécessaire pour exécuter les opérations suivantes.

1.    Recherchez l'ID de groupe de sécurité de AWSEBSecurityGroup dans le message d'erreur dans le flux d'événements Elastic Beanstalk.

2.    Enregistrez le script bash suivant sous sg_dependency.sh:

#!/bin/bash
SecurityGroupID=$1
Region=$2
DependentENI=$(aws ec2 describe-network-interfaces --filters Name=group-id,Values=[$SecurityGroupID] --region $Region | jq '.NetworkInterfaces[].NetworkInterfaceId')
DependentSGingress=$(aws ec2 describe-security-groups --filters Name=ip-permission.group-id,Values=[$SecurityGroupID] --region $Region | jq '.SecurityGroups[] .GroupId')
DependentSGegress=$(aws ec2 describe-security-groups --filters Name=egress.ip-permission.group-id,Values=[$SecurityGroupID] --region $Region | jq '.SecurityGroups[] .GroupId')
echo "The dependent ENI is $DependentENI"
echo "The security group id with a dependency in ingress rule : $DependentSGingress"
echo "The security group id with a dependency in egress rule :  $DependentSGegress"

3.    Installez l'utilitaire jq.

4.    Pour obtenir votre ID d'interface réseau Elastic, votre ID de groupe de sécurité, ou les deux, exécutez la commande suivante :

./sg_dependency.sh sg-111aaa22 us-east-1

Remarque : remplacez sg-111aaa22 par votre ID AWSEBSecurityGroup. Remplacez us-east-1 par votre région AWS.

5.    Pour rechercher les groupes de sécurité associés à l'ID d'interface réseau Elastic que vous avez obtenu dans l'étape 4, exécutez la commande describe-network-interface-attribute :

aws ec2 describe-network-interface-attribute --network-interface-id eni-1099d901 --attribute groupSet

6.    Pour détacher l'ID AWSEBSecurityGroup, exécutez la commande modify-network-interface-attribute.

Important : veillez à exclure l'ID AWSEBSecurityGroup dans cette commande et à inclure les autres ID de groupe de sécurité qui doivent rester associés à l'interface réseau.

aws ec2 modify-network-interface-attribute --network-interface-id eni-1099d901 --groups sg-030644d6c95b6470a sg-d34a33a8 sg-059c081ab30c3e38e sg-0e4eabc747368e6c9

Important : si le résultat de la commande renvoie l'erreur « An error occurred (AuthFailure) when calling the ModifyNetworkInterfaceAttribute operation: You don't have permission to access the specified resource » (Une erreur s'est produite (AuthFailure) lors de l'appel de l'opération ModifyNetworkInterfaceAttribute : vous n'êtes pas autorisé à accéder à la ressource spécifiée), supprimez AWSEBSecurityGroup du service AWS qui a créé cette interface réseau Elastic.

7.    Exécutez la commande describe-security-groups pour répertorier toutes les règles d'entrée et de sortie du groupe de sécurité dépendant que vous avez obtenu à l'étape 4.

8.    Exécutez la commande revoke-security-group-ingress ou revoke-security-group-egress en fonction de la sortie de l'étape 7.

Par exemple, si l'ID AWSEBSecurityGroup est sg-111aaa22 et que la sortie de l'étape 8 contient cet ID de groupe de sécurité dans les règles d'entrée, exécutez la commande suivante :

aws ec2 revoke-security-group-ingress --group-id sg-0018a2fbdcd5797ea --ip-permissions '[{"PrefixListIds":[],"FromPort":0,"IpRanges":[],"ToPort":65535,"IpProtocol":"tcp","UserIdGroupPairs":[{"UserId":"123456789102","GroupId":"sg-111aaa22"}],"Ipv6Ranges":[]}]'

Remarque : UserId est l'ID de compte AWS.

9.    Pour arrêter l'environnement Elastic Beanstalk, exécutez la commande suivante :

aws elasticbeanstalk terminate-environment --environment-name my-env --region us-east-1

10.    Pour reconstruire l'environnement Elastic Beanstalk, exécutez la commande suivante :

aws elasticbeanstalk rebuild-environment --environment-name my-env --region us-east-1

Cet article vous a-t-il été utile ?

Cette page peut-elle être améliorée ?


Vous avez besoin d'aide ?