¿Cómo configuro las instancias lanzadas a través de EC2 Auto Scaling para que tengan varias interfaces de redes elásticas con cada interfaz en diferentes subredes?

Última actualización: 27-06-2022

Cuando Amazon Elastic Compute Cloud (Amazon EC2) Auto Scaling lanza una nueva instancia, quiero que una segunda interfaz de red elástica en una subred diferente se adjunte a ella automáticamente. También quiero que EC2 Auto Scaling elimine la interfaz de red elástica al terminar la instancia. ¿Cómo puedo hacerlo?

Descripción corta

EC2 Auto Scaling permite adjuntar automáticamente una segunda interfaz de red elástica cuando Auto Scaling genera una nueva instancia. Sin embargo, ambas interfaces de redes elásticas adjuntas a la instancia están en la misma subred.

Con esta solución, puede colocar las instancias lanzadas por EC2 Auto Scaling en dos subredes diferentes de su elección. Por ejemplo, puede tener una interfaz de red elástica en una subred pública y la otra en una subred privada.

Nota: Esta solución también admite grupos de calentamiento y el retorno a estos grupos.

Para evitar agotar las direcciones IP privadas de la subred, las interfaces de redes elásticas adjuntas a la instancia se eliminan al terminar las instancias. Esto ayuda a evitar que se alcance el límite de interfaz de red elástica de su cuenta.

Para ello:

  1. Cree una función de AWS Lambda que adjunte la segunda interfaz de red elástica a la instancia cuando la instancia esté en el estado Pending:wait (Pendiente:espere). Asegúrese de que la segunda interfaz de red elástica esté en una subred diferente de la subred de la primera interfaz de red elástica.
  2. Cree un enlace de ciclo de vida para el lanzamiento de instancia.
  3. Configure una regla de Amazon EventBridge o un tema de Amazon Simple Notification Service (Amazon SNS) para activar la función de Lambda. La acción de ciclo de vida para el lanzamiento de instancia de EC2 invocará la regla o el tema de SNS cuando Auto Scaling lance una nueva instancia

Nota: La siguiente resolución es para un grupo de escalado automático habilitado en una o varias zonas de disponibilidad con dos subredes en cada zona de disponibilidad.

Resolución

Crear una función de Lambda

Cree una función de Lambda que haga lo siguiente:

  • Comprueba la subred de la primera interfaz de red que está adjunta a la instancia lanzada.
  • Adjunta una segunda interfaz de red elástica a la instancia de la otra subred configurada en esa zona de disponibilidad en el grupo de Auto Scaling.

Para crear la función de Lambda, haga lo siguiente:

1.    Abra la consola de Lambda.

2.    Elija Create function (Crear función).

3.    Elija Author from scratch (Crear desde cero).

4.    Ingrese un nombre para la función de Lambda en el campo para el nombre Function (Función) y, a continuación, elija Python 3.8 para Runtime (Tiempo de ejecución).

5.    Expanda Permissions (Permisos) al seleccionar la flecha desplegable para cambiar la función de ejecución predeterminada de la función de Lambda. Puede elegir usar un rol de AWS Identity and Access Management (IAM) existente o crear un rol personalizado en la consola de IAM. La función del rol debe tener los siguientes permisos:

{
    "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.    Elija Create function (Crear función).

7.    Descargue el script Python del grupo de Auto Scaling para múltiples ENI. A continuación, copie el código en el campo Function code (Código de función).

8.    Seleccione la pestaña Deploy (Implementar) para asegurarse de que los cambios se han guardado.

Cree un enlace de ciclo de vida

Cree un enlace de ciclo de vida para activar su evento desde la consola de administración de AWS. Para obtener instrucciones, consulte Agregar enlaces de ciclo de vida (consola). O utilice el siguiente comando de la interfaz de la línea de comandos de AWS (AWS CLI):

Nota: Para este caso de uso, establezca el parámetro Heartbeat timeout (Tiempo de espera de latido) en 300 segundos y el parámetro Default result (Resultado predeterminado) como 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: Si recibe errores mientras ejecuta los comandos de AWS CLI, asegúrese de que está utilizando la versión más reciente de AWS CLI.

Desencadenar la función de Lambda

Puede activar la función de Lambda mediante Amazon EventBridge o Amazon Simple Notification Service (Amazon SNS)

Cree una regla de EventBridge para desencadenar la función de Lambda.

1.    Abra la consola de EventBridge.

2.    En el panel de navegación izquierdo, elija Rules (Reglas).

Nota: Para Event bus (bus de eventos), seleccione AWS default event bus (Bus de eventos predeterminado de AWS). Cuando un servicio de AWS de su cuenta emite un evento, siempre va al bus de eventos predeterminado de su cuenta.

3.    Elija Create rule (Crear regla).

4.    Complete los campos Name (Nombre) y Description (Descripción) para la regla.

5.    En Rule type (Tipo de regla), seleccione Rule with an event pattern (Regla con un patrón de eventos) y, a continuación, elija Next (Siguiente).

6.    Elija Other (Otro) en Event Source (Origen de eventos), añada lo siguiente a la sección Event pattern (Patrón de eventos) y, a continuación, elija Next (Siguiente).

Nota: En el siguiente ejemplo, cambie AutoScalingGroupName por el nombre del grupo de Auto Scaling y LifecycleHookName por el nombre del enlace de ciclo de vida.

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

7.    Para Target types (Tipos de objetivo), elija AWS service (Servicio de AWS).

8.    Para Select a target (Seleccionar un objetivo), elija Lambda function (Función de Lambda) en el menú desplegable y, a continuación, seleccione la función de Lambda que creó anteriormente.

9.    Elija Next (Siguiente).

10.    (Opcional) Ingrese una o más etiquetas para la regla.

11.    Seleccione Next (Siguiente).

12.    Revise los detalles de la regla y elija Create rule (Crear regla).

Create an Amazon SNS topic to trigger the Lambda function (Crear un tema de SNS para desencadenar la función de Lambda)

Para usar un tema de SNS, haga lo siguiente:

1.    Ejecute el siguiente comando para crear un enlace de ciclo de vida que envíe una notificación al tema de SNS mediante el comando 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.    Configure este tema de SNS para desencadenar la función de Lambda.

Ahora, cuando Auto Scaling lanza una nueva instancia, se crea una segunda interfaz de red elástica en una subred diferente y se adjunta a la instancia.

Nota: Las plantillas de lanzamiento que no utilizan la AMI de Amazon Linux pueden necesitar opciones adicionales configuradas en el nivel del sistema operativo para crear la interfaz adicional.


¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?