Comment configurer des instances lancées via EC2 Auto Scaling pour disposer de plusieurs interfaces réseau Elastic avec chaque interface dans différents sous-réseaux ?

Dernière mise à jour : 27/06/2022

Lorsque Amazon Elastic Compute Cloud (Amazon EC2) Auto Scaling lance une nouvelle instance, je souhaite qu'une deuxième interface réseau Elastic située dans un sous-réseau différent s'y attache automatiquement. Je souhaite également que EC2 Auto Scaling supprime l'interface réseau Elastic lors de la résiliation de l'instance. Comment procéder ?

Brève description

EC2 Auto Scaling prend automatiquement en charge l'attachement d'une seconde interface réseau Elastic lorsque Auto Scaling fait tourner une nouvelle instance. Toutefois, les deux interfaces réseau Elastic attachées à l'instance se trouvent dans le même sous-réseau.

Grâce à cette solution, vous pouvez placer des instances lancées par EC2 Auto Scaling dans deux sous-réseaux différents de votre choix. Par exemple, vous pouvez avoir une interface réseau Elastic dans un sous-réseau public et l'autre dans un sous-réseau privé.

Remarque : cette solution prend également en charge les groupes chauds et la mise à l'échelle vers les groupes chauds.

Pour éviter d'épuiser les adresses IP privées dans le sous-réseau, les interfaces réseau Elastic attachées à l'instance sont supprimées lors de la résiliation des instances. Cela permet d'éviter d'atteindre la limite de l'interface réseau Elastic de votre compte.

Pour ce faire :

  1. Créez une fonction AWS Lambda qui attache la deuxième interface réseau Elastic à l'instance lorsque celle-ci est dans l'état Pending:Wait. Assurez-vous que la seconde interface réseau Elastic se trouve dans un sous-réseau différent de celui de la première interface réseau Elastic.
  2. Créez un Hook de cycle de vie pour le lancement de l'instance.
  3. Configurez une règle Amazon EventBridge ou une rubrique Amazon Simple Notification Service (Amazon SNS) pour déclencher la fonction Lambda. La règle ou la rubrique SNS sera invoquée par EC2 Instance-Launch Lifecycle Action (Action de cycle de vie au lancement de l’instance EC2) lorsque Auto Scaling lance une nouvelle instance

Remarque : la résolution suivante concerne un groupe Auto Scaling activé dans une ou plusieurs zones de disponibilité avec deux sous-réseaux dans chaque zone de disponibilité.

Solution

Créer une fonction Lambda

Créez une fonction Lambda qui effectue les opérations suivantes :

  • Vérifie le sous-réseau de la première interface réseau attachée à l'instance lancée.
  • Attache une seconde interface réseau Elastic à l'instance de l'autre sous-réseau configuré dans cette zone de disponibilité du groupe Auto Scaling.

Pour créer la fonction Lambda, procédez comme suit :

1.    Ouvrez la console Lambda.

2.    Sélectionnez Créer une fonction.

3.    Choisissez Author from scratch (Créer à partir de zéro).

4.    Entrez un nom pour la fonction Lambda dans le champ nom de la Fonction, puis choisissez Python 3.8 for Runtime (Python 3.8 pour l’exécution).

5.    Développez Permissions en sélectionnant la flèche déroulante pour modifier le rôle d'exécution par défaut pour la fonction Lambda. Vous pouvez choisir d'utiliser un rôle AWS Identity et Access Management (IAM) existant ou de créer un rôle personnalisé sur la console IAM. Le rôle de fonction doit disposer des autorisations suivantes :

{
    "Statement": [{
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Action": [
                "ec2:CreateNetworkInterface",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DetachNetworkInterface",
                "ec2:DeleteNetworkInterface",
                "ec2:DescribeSubnets",
                "ec2:AttachNetworkInterface",
                "ec2:DescribeInstances",
                "ec2:ModifyNetworkInterfaceAttribute",
                "autoscaling:CompleteLifecycleAction",
                "autoscaling:DescribeAutoScalingGroups"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ],
    "Version": "2012-10-17"
}

6.    Choisissez Créer une fonction.

7.    Téléchargez le script Python du groupe Auto Scaling Multiple ENI. Copiez ensuite le code dans le champ Code de fonction.

8.    Sélectionnez l'onglet Deploy (Déployer) pour vous assurer que les modifications ont été enregistrées.

Créer un Hook de cycle de vie

Créez un Hook de cycle de vie pour déclencher votre événement depuis la console de gestion AWS. Pour obtenir des instructions, voir Ajouter des Hooks de cycle de vie (console). Vous pouvez également exécuter la commande depuis l’interface de la ligne de commande AWS (AWS CLI) suivante :

Remarque : Pour ce cas d'utilisation, définissez le paramètre Heartbeat timeout sur 300 secondes et le paramètre de résultat par défaut sur ABANDON.

aws autoscaling put-lifecycle-hook --lifecycle-hook-name my-lifecycle-launch-hook --auto-scaling-group-name my-asg --lifecycle-transition autoscaling:EC2_INSTANCE_LAUNCHING --heartbeat-timeout 300 --default-result ABANDON

Remarque : si vous recevez des erreurs lors de l'exécution de commandes AWS CLI, vérifiez que vous utilisez la version la plus récente d'AWS CLI.

Déclenchez la fonction Lambda

Vous pouvez déclencher la fonction Lambda à l'aide d'Amazon EventBridge ou d'Amazon Simple Notification Service (Amazon SNS)

Créer une règle EventBridge pour déclencher la fonction Lambda

1.    Ouvrez la console EventBridge.

2.    Depuis le panneau de navigation de gauche, choisissez Rules (Règles).

Remarque : Pour Event bus (Bus d'événements), sélectionnez AWS default event bus (Bus d'événements AWS par défaut). Lorsqu'un service AWS de votre compte émet un événement, il est toujours envoyé au bus d'événements par défaut de votre compte.

3.    Choisissez Créer une règle.

4.    Saisissez un nom et une description pour la règle.

5.    Sous Rule type (Type de règle) sélectionnez Rule with an event pattern (Règle avec un modèle d’évènement), puis Next (Suivant).

6.    Choisissez Other (Autre) sous Event Source (Source de l’évènement), ajoutez ce qui suit dans la section Event pattern (Modèle de l’évènement), puis choisissez Next (Suivant).

Remarque : dans l'exemple suivant, remplacez AutoScalingGroupName par le nom de votre groupe Auto Scaling et LifecycleHookName par le nom de votre hook de cycle de vie.

{
  "source": ["aws.autoscaling"],
  "detail-type": ["EC2 Instance-launch Lifecycle Action"],
  "detail": {
    "AutoScalingGroupName": ["my-asg"],
    "LifecycleHookName": ["my-lifecycle-launch-hook"]
  }
}

7.    Pour Target types (Types de cible), choisissez AWS service (Service AWS).

8.    Pour Select a target (Sélectionner une cible), choisissez Lambda function (Fonction Lambda) dans le menu déroulant, puis sélectionnez la fonction Lambda que vous avez créée précédemment.

9.    Sélectionnez Next (Suivant).

10.    (Facultatif) Saisissez une ou plusieurs identifications pour la règle.

11.    Sélectionnez Suivant.

12.    Passez en revue les détails de la règle et choisissez Create rule (Créer une règle).

Création d'une rubrique Amazon SNS pour déclencher la fonction Lambda

Pour utiliser une rubrique SNS, procédez comme suit :

1.    Exécutez la commande suivante pour créer un hook de cycle de vie qui envoie une notification à votre rubrique SNS à l'aide de la commande AWS CLI :

aws autoscaling put-lifecycle-hook --lifecycle-hook-name my-lifecycle-launch-hook --auto-scaling-group-name my-asg --lifecycle-transition autoscaling:EC2_INSTANCE_LAUNCHING --heartbeat-timeout 300 --default-result ABANDON --notification-target-arn <SNStopicARN>

2.    Configurez cette rubrique SNS pour déclencher la fonction Lambda.

Désormais, lorsque Auto Scaling lance une nouvelle instance, une deuxième interface réseau Elastic est créée dans un sous-réseau différent et attachée à l'instance.

Remarque : les modèles de lancement qui n'utilisent pas l'AMI Amazon Linux peuvent nécessiter des options supplémentaires configurées au niveau du système d'exploitation pour créer l'interface supplémentaire.


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


Avez-vous besoin d'aide pour une question technique ou de facturation ?