Назад | Перейти на главную страницу

Автоматический запуск экземпляра AWS EC2 из сетевого запроса (wake-on-LAN)

Я хотел бы запустить экземпляр EC2 по требованию и отключить его, когда он простаивает в течение некоторого периода времени (например, отсутствие сетевой активности в течение> = 1 часа), но я не могу сказать, что это за стандартный способ выполнение этого в AWS выглядит так, учитывая, что AWS не поддерживает wake-on-LAN.

Службе, которую я собираюсь запустить, потребуется постоянное сетевое соединение, например ssh.

Пользовательский опыт, к которому я стремлюсь, выглядит примерно так:

Моя мотивация здесь в первую очередь - экономия средств. Спрос будет очень непредсказуемым (поэтому запланированные экземпляры не подходят), вероятно, менее 12 активных часов в день, и пользователи готовы подождать несколько минут, пока служба запустится. И я не хочу быть привязанным к сроку более 1 года с ценой на зарезервированные инстансы.

У меня также есть несколько безумных попыток сделать это, и я буду признателен за отзывы о том, насколько они правдоподобны / разумны:

  1. Используйте группу автоматического масштабирования, которая «масштабирует» службу от 0 до максимум 1 экземпляров. Но я не знаю, как я смогу выдать ответ «служба запускается», если нет запущенных экземпляров.
  2. Запустите экземпляр t2.micro, когда служба не работает, единственная цель которой - поймать попытку подключения, выдать ответ «запуск», запустить фактический экземпляр службы и затем умереть. Когда экземпляр службы выходит из строя из-за бездействия, ему необходимо снова запустить экземпляр t2.micro.

Спасибо!

Lambda работает примерно так, хотя вместо этого заставляет пользователя ждать, пока запускает приложение. Хотя в Lambda у вас нет экземпляра для управления - все делается под капотом.

Я также проверю, можете ли вы сделать что-то, связанное с Lambda и проверкой отказа Route53, чтобы пользователи нажимали Lambda, если экземпляр не работает, и экземпляр, если он работает. Это может не работать, потому что Lambda требует определенного заголовка Host.

Или снова используйте отработку отказа R53 для запуска зарезервированного экземпляра t2.nano для выполнения «комнаты ожидания», а затем прокси или перенаправления на другой экземпляр, когда он будет запущен.

Вы можете сделать что-то подобное без использования других сервисов:

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

В этом случае instance_id принимается параметром, но, конечно, вы можете жестко его запрограммировать.