Wie stelle ich fest, dass über EC2 Auto Scaling gestartete Instances mehrere Elastic-Network-Schnittstellen mit jeder Schnittstelle in verschiedenen Subnetzen haben?

Letzte Aktualisierung: 27.06.2022

Wenn Amazon Elastic Compute Cloud (Amazon EC2) Auto Scaling eine neue Instance startet, möchte ich, dass eine zweite Elastic-Network-Schnittstelle in einem anderen Subnetz automatisch mit ihr verbunden wird. Ich möchte auch, dass EC2 Auto Scaling die Elastic-Network-Schnittstelle beim Beenden der Instance löscht. Wie kann ich vorgehen?

Kurzbeschreibung

EC2 Auto Scaling unterstützt das automatische Anfügen einer zweiten Elastic-Network-Schnittstelle, wenn Auto Scaling eine neue Instance hochfährt. Beide an die Instance angeschlossenen Elastic-Network-Schnittstellen befinden sich jedoch im selben Subnetz.

Mit dieser Lösung können Sie von EC2 Auto Scaling gestartete Instances in zwei verschiedenen Subnetzen Ihrer Wahl platzieren. Sie können beispielsweise eine Elastic-Network-Schnittstelle in einem öffentlichen Subnetz und die andere in einem privaten Subnetz haben.

Hinweis: Diese Lösung unterstützt auch warme Pools und das Skalieren in warme Pools.

Um zu vermeiden, dass es zu wenige private IP-Adressen im Subnetz gibt, werden die mit der Instance verbundenen Elastic-Network-Schnittstellen beim Beenden der Instances gelöscht. Dies verhindert, dass das Limit für die Elastic-Network-Schnittstelle in Ihrem Konto erreicht wird.

Gehen Sie dazu wie folgt vor:

  1. Erstellen Sie eine AWS-Lambda-Funktion, die die zweite Elastic-Network-Schnittstelle an die Instance anhängt, wenn sich die Instance im Zustand Pending:wait befindet. Stellen Sie sicher, dass sich die zweite Elastic-Network-Schnittstelle in einem anderen Subnetz als das Subnetz der ersten Elastic-Network-Schnittstelle befindet.
  2. Erstellen Sie einen Lebenszyklus-Hook für die Instance.
  3. Konfigurieren Sie eine Amazon EventBridge-Regel oder ein Amazon Simple Notification Service (Amazon SNS)-Thema, um die Lambda-Funktion auszulösen. Die Regel oder das SNS-Thema werden von EC2 Instance Launch Lifecycle Action aufgerufen, wenn Auto Scaling eine neue Instance startet.

Hinweis: Die folgende Auflösung gilt für eine Auto-Scaling-Gruppe, die in einzelnen oder mehreren Availability Zones mit zwei Subnetzen in jeder Availability Zone aktiviert ist.

Lösung

Erstellen einer Lambda-Funktion

Erstellen Sie eine Lambda-Funktion, die Folgendes erledigt:

  • Überprüft das Subnetz der ersten Netzwerkschnittstelle, die an die gestartete Instance angehängt ist.
  • Fügt eine zweite Elastic-Network-Schnittstelle an die Instance in dem anderen Subnetz an, das in dieser Availability Zone in der Auto-Scaling-Gruppe konfiguriert ist.

Gehen Sie wie folgt vor, um die Lambda-Funktion zu erstellen:

1.    Öffnen Sie die Lambda-Konsole.

2.    Wählen Sie Funktion erstellen.

3.    Wählen Sie Von Grund auf neu verfassen.

4.    Geben Sie im Feld Funktionsname einen Namen für die Lambda-Funktion ein und wählen Sie dann Python 3.8 für Laufzeit.

5.    Erweitern Sie Berechtigungen, indem Sie den Dropdown-Pfeil auswählen, um die Standardausführung für die Lambda-Funktion zu ändern. Sie können eine vorhandene AWS Identity and Access Management (IAM)-Rolle verwenden oder eine benutzerdefinierte Rolle in der IAM-Konsole erstellen. Die Funktionsrolle muss über die folgenden Berechtigungen verfügen:

{
    "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.    Wählen Sie Funktion erstellen.

7.    Laden Sie das Gruppen-Python-Skript Multiple ENI Auto Scaling herunter. Kopieren Sie dann den Code in das Feld Funktionscode.

8.    Wählen Sie die Registerkarte Bereitstellen aus, um sicherzustellen, dass die Änderungen gespeichert wurden.

Erstellen eines Lebenszyklus-Hooks

Erstellen Sie einen Lebenszyklus-Hook, um Ihr Ereignis von der AWS-Managementkonsole auszulösen. Anweisungen finden Sie unter Hinzufügen von Lebenszyklus-Hooks (Konsole). Oder verwenden Sie den folgenden Befehl für das AWS Command Line Interface (AWS CLI):

Hinweis: Stellen Sie für diesen Anwendungsfall den Heartbeat-Timeout-Parameter auf 300 Sekunden und den Standardergebnis-Parameter auf ABANDON ein.

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

Hinweis: Wenn beim Ausführen von AWS-CLI-Befehlen Fehler gemeldet werden, stellen Sie sicher, dass Sie die neueste Version der AWS CLI verwenden.

Auslösen der Lambda-Funktion

Sie können die Lambda-Funktion mithilfe von Amazon EventBridge oder dem Amazon Simple Notification Service (Amazon SNS) auslösen.

Erstellen einer EventBridge-Regel, um die Lambda-Funktion auszulösen

1.    Öffnen Sie die EventBridge-Konsole.

2.    Wählen Sie im linken Navigationsbereich Regeln aus.

Hinweis: Wählen Sie unter Ereignisbus die Option AWS-Standard-Ereignisbus aus. Wenn ein AWS-Service in Ihrem Konto ein Ereignis ausgibt, geht er immer in den Standard-Ereignisbus Ihres Kontos.

3.    Wählen Sie Regel erstellen aus.

4.    Geben Sie einen Namen und eine Beschreibung für die Regel ein.

5.    Wählen Sie unter Regeltyp die Option Regel mit Ereignismuster aus, und klicken Sie dann auf Weiter.

6.    Wählen Sie Andere unter Ereignisquelle aus, fügen Sie dem Abschnitt Ereignismuster Folgendes hinzu, und wählen Sie dann Weiter.

Hinweis: Ändern Sie im folgenden Beispiel AutoScalingGroupName in den Namen Ihrer Auto-Scaling-Gruppe und LifeCycleHookName in den Namen Ihres Lebenszyklus-Hooks.

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

7.    Wählen Sie für Zieltypen die Option AWS-Service.

8.    Wählen Sie unter Ziel auswählen die Option Lambda-Funktion aus dem Dropdown-Menü und wählen Sie dann die Lambda-Funktion aus, die Sie zuvor erstellt haben.

9.    Wählen Sie Weiter.

10.    (Optional) Geben Sie ein oder mehrere Tags für die Regel ein.

11.    Wählen Sie Next (Weiter) aus.

12.    Überprüfen Sie die Details der Regel und wählen Sie Regel erstellen aus.

Erstellen Sie ein Amazon SNS-Thema, um die Lambda-Funktion auszulösen.

Gehen Sie wie folgt vor, um ein SNS-Thema zu verwenden:

1.    Führen Sie den folgenden Befehl aus, um einen Lebenszyklus-Hook zu erstellen, der mithilfe des AWS-CLI-Befehls eine Benachrichtigung an Ihr SNS-Thema sendet:

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.    Konfigurieren Sie dieses SNS-Thema, um die Lambda-Funktion auszulösen.

Wenn Auto Scaling jetzt eine neue Instance startet, wird eine zweite Elastic-Network-Schnittstelle in einem anderen Subnetz erstellt und an die Instance angehängt.

Hinweis: Startvorlagen, die das Amazon Linux AMI nicht verwenden, benötigen möglicherweise zusätzliche Optionen, die auf Betriebssystemebene konfiguriert sind, um die zusätzliche Schnittstelle zu erstellen.


War dieser Artikel hilfreich?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?