Come posso impostare le istanze avviate tramite EC2 Auto Scaling per avere più interfacce di rete elastiche con ciascuna interfaccia in sottoreti differenti?

Ultimo aggiornamento: 27/06/2022

Quando Amazon Elastic Compute Cloud (Amazon EC2) Auto Scaling avvia una nuova istanza, voglio che una seconda interfaccia di rete elastica in una sottorete differente si colleghi automaticamente ad essa. Voglio anche che EC2 Auto Scaling elimini l'interfaccia di rete elastica al termine dell'esecuzione dell'istanza. In che modo posso farlo?

Breve descrizione

EC2 Auto Scaling supporta il collegamento automatico di una seconda interfaccia di rete elastica quando Auto Scaling avvia una nuova istanza. Tuttavia, entrambe le interfacce di rete elastiche collegate all'istanza si trovano nella stessa sottorete.

Utilizzando questa soluzione, puoi posizionare istanze avviate da EC2 Auto Scaling in due diverse sottoreti a scelta. Ad esempio, puoi avere un'interfaccia di rete elastica in una sottorete pubblica e l'altra in una sottorete privata.

Nota: questa soluzione supporta anche i pool caldi e il dimensionamento verticale al pool caldo.

Per evitare di esaurire gli indirizzi IP privati nella sottorete, le interfacce di rete elastiche collegate all'istanza vengono eliminate al termine dell'esecuzione delle istanze. Questo aiuta a evitare di raggiungere il limite dell'interfaccia di rete elastica nel tuo account.

Per fare questo:

  1. Crea una funzione AWS Lambda che colleghi la seconda interfaccia di rete elastica all'istanza quando l'istanza si trova nello stato Pending:wait (In attesa: Aspetta). Assicurati che la seconda interfaccia di rete elastica si trovi in una sottorete differente dalla sottorete della prima interfaccia di rete elastica.
  2. Crea un hook del ciclo di vita per l'avvio dell'istanza.
  3. Configura una regola Amazon EventBridge o un argomento del Servizio di notifica semplice Amazon (Amazon SNS) per attivare la funzione Lambda. La regola o l'argomento SNS verranno richiamato dall'operazione del ciclo di vita Instance-launch EC2 quando Auto Scaling avvia una nuova istanza

Nota: la seguente risoluzione si riferisce a un gruppo con scalabilità automatica abilitato in zone di disponibilità singole o multiple con due sottoreti in ciascuna zona di disponibilità.

Risoluzione

Creazione di una funzione Lambda

Crea una funzione Lambda che effettui le operazioni seguenti:

  • Controlli la sottorete della prima interfaccia di rete collegata all'istanza avviata.
  • Colleghi una seconda interfaccia di rete elastica all'istanza nell'altra sottorete configurata in quella zona di disponibilità nel gruppo Auto Scaling.

Per creare la funzione Lambda, effettua le operazioni seguenti:

1.    Apri la Console Lambda.

2.    Scegli Create function (Crea funzione).

3.    Seleziona Author from scratch (Crea da zero).

4.    Immetti un nome per la funzione Lambda nel campo Function name (Nome funzione), quindi scegli Python 3.8 for Runtime (Python 3.8 per Runtime).

5.    Espandi Permissions (Autorizzazioni) selezionando la freccia a discesa per modificare il ruolo di esecuzione di default per la funzione Lambda. Puoi scegliere di utilizzare un ruolo AWS Identity and Access Management (IAM) esistente o creare un ruolo personalizzato nella console IAM. Il ruolo della funzione deve avere le seguenti autorizzazioni:

{
    "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.    Scegli Create function (Crea funzione).

7.    Scarica lo script Python del gruppo Multiple ENI Auto Scaling. Quindi copia il codice nel campo Function code (Codice funzione).

8.    Seleziona la scheda Deploy (Implementa) per assicurarti che le modifiche siano state salvate.

Creazione di un hook del ciclo di vita

Crea un hook del ciclo di vita per attivare il tuo evento dalla Console di gestione AWS. Per istruzioni, consulta Aggiunta di un hook del ciclo di vita (console). Oppure, utilizza il seguente comando dell'interfaccia della linea di comando AWS (AWS CLI):

Nota: per questo caso d'uso, imposta il parametro Timeout heartbeat su 300 secondi e il parametro Risultato di default su 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

Nota: se ricevi un messaggio di errore durante l'esecuzione dei comandi di AWS CLI, assicurati di utilizzare la versione di AWS CLI più recente.

Attivazione della funzione Lambda

Puoi attivare la funzione Lambda utilizzando Amazon EventBridge o il servizio di notifica semplice Amazon (Amazon SNS).

Creazione di una regola EventBridge per attivare la funzione Lambda

1.    Apri la Console di EventBridge.

2.    Nel riquadro di navigazione sinistro scegli Rules (Regole).

Nota: perEvent bus (Bus di eventi), seleziona (Bus di eventi predefiniti di AWS). Quando un servizio AWS nel tuo account genera un evento, passa sempre al bus degli eventi predefinito del tuo account.

3.    Scegli Create rule (Crea regola).

4.    Specifica un Nome e una Descrizione per la regola.

5.    InRule type (Tipo di regola) seleziona Rule with an event pattern (Regola con un schema di eventi) quindi scegliNext (Avanti).

6.    Scegli Other (Altro) in Event Source (Origine evento), aggiungi quanto segue nella sezione Event pattern (Schema eventi), quindi scegli Next (Avanti).

Nota: nell'esempio seguente, modifica AutoScalingGroupName con il nome del gruppo Auto Scaling e LifecycleHookName con il nome dell'hook del tuo ciclo di vita.

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

7.    Per i Target types (Tipi di destinazione) scegli il servizio AWS.

8.    Per Select a target (Seleziona una destinazione), scegli la funzione Lambda dal menu a discesa, quindi seleziona la funzione Lambda che hai creato in precedenza.

9.    Scegliere Next (Avanti).

10.    (Facoltativo) Immetti uno o più tag per la regola.

11.    Scegliere Next (Avanti).

12.    Esamina i dettagli della regola e scegli Create rule (Crea regola).

Creazione di un argomento Amazon SNS per attivare la funzione Lambda

Per utilizzare un argomento SNS, effettua le seguenti operazioni:

1.    Esegui il comando seguente per creare un hook del ciclo di vita che invii una notifica al tuo argomento SNS utilizzando il comando CLI di AWS:

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.    Configura questo argomento SNS per attivare la funzione Lambda.

Ora, quando Auto Scaling avvia una nuova istanza, viene creata una seconda interfaccia di rete elastica in una sottorete differente e collegata all'istanza.

Nota: i modelli di avvio che non utilizzano l'AMI Amazon Linux potrebbero aver bisogno di opzioni aggiuntive configurate a livello di sistema operativo per creare l'interfaccia aggiuntiva.


Questo articolo è stato utile?


Hai bisogno di supporto tecnico o per la fatturazione?