Iniciar automaticamente uma instância do AWS EC2 a partir da solicitação de rede (wake-on-LAN)

3

Gostaria de iniciar uma instância do EC2 sob demanda e desativá-la quando ela estiver ociosa por algum período de tempo (por exemplo, nenhuma atividade de rede para > = 1 hora), mas não posso dizer o que uma forma padrão de fazer isso na AWS parece, já que a AWS não suporta wake-on-LAN.

O serviço que pretendo executar exigirá uma conexão de rede persistente, por exemplo, ssh.

A experiência do usuário que estou buscando é mais ou menos assim:

  • Se o serviço estiver ativo quando o usuário tentar se conectar, o usuário terá acesso imediato ao serviço.
  • Se o serviço estiver inativo quando o usuário tentar se conectar, o usuário receberá uma resposta "serviço está iniciando" (e a conexão será fechada). O usuário tenta novamente após alguns minutos e se conecta com êxito (ou recebe a mensagem "inicial" novamente se tentar novamente muito cedo). O serviço permanece ativo por até uma hora após o último usuário se desconectar.

Minha motivação aqui é principalmente economia de custos. A demanda será altamente imprevisível (portanto, as instâncias agendadas não são adequadas), provavelmente menos de 12 horas / dia ativas, e os usuários estão dispostos a aguardar alguns minutos para que o serviço seja iniciado. E eu não quero ficar preso a um ano ou mais com um preço de instância reservado.

Eu também tenho algumas facadas loucas de como eu poderia conseguir isso e gostaria de receber feedback sobre como elas são plausíveis / sensatas:

  1. Use um grupo de escalonamento automático que "dimensione" o serviço de 0 a um máximo de 1 instâncias. Mas não sei como seria possível emitir a resposta "serviço está iniciando" se não houver instâncias em execução.
  2. Execute uma instância t2.micro quando o serviço estiver inativo, cuja única finalidade é capturar uma tentativa de conexão, emitir a resposta "inicial", acionar o início da instância real do serviço e, em seguida, morrer. Quando a instância do serviço ficar inativa devido à inatividade, será necessário iniciar a instância t2.micro novamente.

Obrigado!

    
por koschei 22.03.2016 / 12:31

2 respostas

3

O Lambda funciona um pouco assim, embora, em vez disso, o usuário aguarde enquanto gira um aplicativo. No Lambda, você não tem uma instância para administrar - tudo é feito sob o capô.

Eu também verificaria se você poderia fazer algo envolvendo o Lambda e uma verificação de failover do Route53, de modo que os usuários atingissem o Lambda se a instância estivesse inativa e a instância estivesse ativa. Isso pode não funcionar, mas o Lambda requer um cabeçalho de host específico.

Ou use o failover R53 novamente para executar uma instância reservada t2.nano para fazer a 'sala de espera' e, em seguida, proxy ou redirecione para outra instância quando ela estiver ativa.

    
por 22.03.2016 / 15:45
1

Você pode fazer algo assim sem usar outros serviços:

import boto3
import json

def lambda_handler(event, context):

    ec2 = boto3.resource('ec2')
    instance = ec2.Instance(event['instance_id'])

    if instance.state['Code'] == 16:
        # Instance is running, do what you want
    elif instance.state['Code'] == 80:
        # Instance is stopped, start it
        instance.start()
        return { 'status': 'instance-unavailable' }
    else
        # Instance is in another state

Nesse caso, o instance_id é recebido por parâmetro, mas é claro, você pode codificá-lo.

    
por 13.10.2016 / 21:03