Como faço para definir as instâncias iniciadas por meio do EC2 Auto Scaling para ter várias interfaces de rede elástica com cada interface em sub-redes diferentes?

Data da última atualização: 27/06/2022

Quando o Amazon Elastic Compute Cloud (Amazon EC2) Auto Scaling inicia uma nova instância, eu gostaria que uma segunda interface de rede elástica em uma sub-rede diferente fosse anexada automaticamente a ela. Também gostaria que o EC2 Auto Scaling excluísse a interface de rede elástica após o encerramento da instância. Como posso fazer isso?

Breve descrição

O EC2 Auto Scaling oferece suporte à anexação automática de uma segunda interface de rede elástica quando o Auto Scaling cria uma nova instância. No entanto, as duas interfaces de rede elástica anexadas à instância estão na mesma sub-rede.

Usando essa solução, você pode colocar instâncias iniciadas pelo EC2 Auto Scaling em duas sub-redes diferentes de sua escolha. Por exemplo, você pode ter uma interface de rede elástica em uma sub-rede pública e a outra em uma sub-rede privada.

Observação: essa solução também oferece suporte a grupos quentes e escalonamanto para grupos quentes.

Para evitar o esgotamento de endereços IP privados na sub-rede, as interfaces de rede elástica anexadas à instância são excluídas no encerramento das instâncias. Isso ajuda a evitar atingir o limite da interface de rede elástica em sua conta.

Para fazer isso:

  1. Crie uma função do AWS Lambda que anexa a segunda interface de rede elástica à instância, quando a instância estiver no estado Pending:wait. Verifique e confirme se a segunda interface de rede elástica está em uma sub-rede diferente da sub-rede da primeira interface de rede elástica.
  2. Crie um gancho do ciclo de vida para a iniciação da instância.
  3. Configure uma regra do Amazon EventBridge ou um tópico do Amazon Simple Notification Service (Amazon SNS) para acionar a função do Lambda. A regra ou o tópico do SNS será invocado pela Ação de ciclo de vida de inicialização de instância do EC2 quando o Auto Scaling iniciar uma nova instância

Observação: a resolução a seguir é para um grupo de Auto Scaling habilitado em uma ou várias zonas de disponibilidade com duas sub-redes em cada zona de disponibilidade.

Resolução

Crie uma função do Lambda

Crie uma função Lambda que faça o seguinte:

  • Verifica a sub-rede da primeira interface de rede anexada à instância iniciada.
  • Anexa uma segunda interface de rede elástica à instância na outra sub-rede configurada nessa zona de disponibilidade no grupo do Auto Scaling.

Para criar a função Lambda, faça o seguinte:

1.    Abra o console do Lambda.

2.    Escolha Create function (Criar função).

3.    Escolha Criar a partir do Scratch.

4.    Insira um nome para a função Lambda no campo nome da Função e escolha Python 3.8 para Runtime.

5.    Expanda Permissions (Permissões) selecionando a seta suspensa para alterar a função de execução padrão para a função do Lambda. Você pode optar por usar um perfil existente do AWS Identity and Access Management (IAM) ou criar um perfil personalizado no console do IAM. O perfil da função deve ter as seguintes permissões:

{
    "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.    Escolha Create function (Criar função).

7.    Baixe o script Python do grupo Multiple ENI Auto Scaling. Em seguida, copie o código para o campo Código da função.

8.    Selecione a guia Implantar para garantir que as alterações sejam salvas.

Criar um gancho de ciclo de vida

Crie um gancho de ciclo de vida para acionar seu evento no Console de Gerenciamento da AWS. Para obter instruções, consulte Adicionar ganchos de ciclo de vida (console). Ou use o seguinte comando da AWS Command Line Interface (AWS CLI):

Observação: para esse caso de uso, defina o parâmetro Heartbeat timeout (Tempo limite de pulsação) como 300 segundos e o parâmetro Default result (Resultado padrão) como ABANDON (Abandonar).

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

Observação: se você receber erros ao executar os comandos da AWS CLI, utilize a versão mais recente da AWS CLI.

Acionar a função do Lambda

Você pode acionar a função do Lambda usando o Amazon EventBridge ou o Amazon Simple Notification Service (Amazon SNS)

Criar uma regra EventBridge para acionar a função do Lambda

1.    Abra o console do EventBridge.

2.    No painel de navegação esquerdo, escolha Regras.

Observação: em Barramento de eventos, selecione Barramento de eventos padrão da AWS. Quando um serviço da AWS em sua conta emite um evento, ele sempre vai para o barramento de eventos padrão da sua conta.

3.    Selecione Create rule (Criar regra).

4.    Insira um Nome e uma Descrição para a regra.

5.    Em Tipo de regra, selecione Regra com um padrão de evento e, em seguida, escolha Avançar.

6.    Escolha Outro em Fonte do evento, adicione o seguinte na seção no Padrão de evento e, em seguida, escolha Próximo.

Observação: no exemplo a seguir, altere AutoScalingGroupName para o nome do seu grupo do Auto Scaling e LifecycleHookName para o nome do gancho do ciclo de vida.

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

7.    Para os Tipos de destino, escolha Serviço da AWS.

8.    Para Selecionar um destino, escolha Função Lambda no menu suspenso e, em seguida, selecione a função Lambda que você criou anteriormente.

9.    Escolha Next (Avançar).

10.    (Opcional) Insira uma ou mais etiquetas para a regra.

11.    Selecione Next (Próximo).

12.    Analise os detalhes da regra e escolha Create rule (Criar regra).

Criar um tópico do Amazon SNS para acionar a função do Lambda

Para usar um tópico do SNS, faça o seguinte:

1.    Execute o comando a seguir para criar um gancho do ciclo de vida que envia uma notificação para o tópico do SNS usando o comando da 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 tópico do SNS para acionar a função do Lambda.

Agora, quando o Auto Scaling iniciar uma nova instância, uma segunda interface de rede elástica será criada em uma sub-rede diferente e anexada à instância.

Observação: os modelos de iniciação que não estão usando o Amazon Linux AMI podem precisar de opções adicionais configuradas no nível do sistema operacional para criar a interface adicional.