Перезапустите экземпляр EC2 при недоступности веб-сайта

У меня есть веб-сайт, размещенный на сервере EC2. Я хочу отслеживать конечную точку веб-сайта и перезапускать экземпляр EC2, если веб-сайт недоступен в течение определенного периода времени (скажем, 60 секунд). Какие инструменты я использую в AWS и как это сделать?

вы хотите перезапустить его вручную или с помощью скрипта?

omurbek 10.08.2018 13:51

перезапустить без вмешательства человека

hoz 10.08.2018 13:53

Вы используете Route 53 для DNS и / или ELB для балансировки нагрузки?

jarmod 10.08.2018 14:32

почему вам нужно перезапускать весь сервер, а не искать процесс или службу, которые отвечают за обеспечение доступности конечной точки веб-сайта?

groobie newbie 10.08.2018 14:32

Нет. Мы не используем Route53 или ELB. У нас есть эластичный IP-адрес, настроенный для сервера. Мы знаем, что проблема требует расследования и устранения основной причины. На это потребуется время. Нам нужно немедленное решение, которое перезапускает сервер.

hoz 10.08.2018 14:39

хорошо. Что вы имеете в виду под перезагрузкой? вам нужна простая команда reboot или stop ec2 instance and start the ec2 instance functionality like doing it in the aws console? Возможно, вы захотите создать дополнительные ресурсы aws, такие как лямбда-сигналы и сигналы облачного наблюдения, чтобы полностью автоматизировать процесс перезапуска без вмешательства человека, если вам нужен более поздний тип перезапуска.

groobie newbie 10.08.2018 14:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
440
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это не рекомендуемый подход.

Во-первых, если веб-сайт недоступен, вы, вероятно, захотите исследовать причину, а не просто перезапустить экземпляр. Ваша цель должна состоять в том, чтобы запустить стабильную систему, устраняя основные причины проблем, а не просто игнорировать проблему путем постоянного перезапуска.

Рекомендуемый дизайн - запуск в конфигурации Высокая доступность с:

  • Приложение, работающее на минимум два сервера, по крайней мере, в двух зонах доступности (в случае отказа зоны доступности). Это не обязательно дороже, потому что каждый сервер может быть меньше одного большого сервера.
  • балансировщик нагрузки перед экземплярами, распределяющий трафик между экземплярами. Балансировщик нагрузки также выполняет непрерывные проверки работоспособности и прекращает отправку запросов на серверы, которые не прошли проверку работоспособности.
  • Группа автоматического масштабирования, который может завершать неработоспособные экземпляры и автоматически запускать заменяющие серверы. Это также хорошо работает, если зона доступности выйдет из строя.

В этой схеме неработоспособным экземпляром будет прекращено (остановлен и уничтожен), а новый экземпляр будет создан с заранее определенным образом диска и сценарием запуска. В качестве альтернативы вы можете удалить плохие экземпляры из группы Auto Scaling для исследования проблемы, запустив новый экземпляр, чтобы занять его место.

Если вашему приложению требуется база данных, база данных должна быть внешней по отношению к экземплярам, чтобы все экземпляры могли подключаться к базе данных и замена экземпляров приложения не вызывала потери данных.

Что касается скорости обнаружения проблем на сервере, балансировщик нагрузки может выполнять проверки каждые несколько секунд. Amazon CloudWatch, с другой стороны, потребуется не менее минуты для обнаружения проблем (возможно, дольше, поскольку метрики рассчитываются за период, а не являются метриками «сейчас»).

Мы бы вовремя внедрили конфигурацию с высокой доступностью. Однако пока нам нужно, чтобы служба работала в текущей конфигурации. Отсюда и это решение перезапуска сервера.

hoz 10.08.2018 14:41

Подход Джона правильный, но самый простой:

  • Напишите лямбда-функцию, которая может запрашивать ваш веб-сайт и видеть, работает он или нет, и если эта лямбда-функция отсутствует, перезапустите экземпляр.
  • Настройте правило события cloudwatch, которое запускается с определенной вами частотой для вызова лямбда-функции.

Я оставлю вам работу по написанию кода, который определяет, работает ли веб-сайт, и перезапуску сервера, но это довольно просто. Вы можете использовать ядро ​​python, java, node, go или .net в своей лямбда-функции - я бы подумал, что python будет самым простым в этом случае, но это мое мнение.

Ответ принят как подходящий

Понятно, что это не лучшая практика в AWS, но может иметь некоторый смысл - например, вы используете небольшой персональный веб-сервер с низким спросом, где доступность - меньшая проблема, чем затраты.

По крайней мере, это была моя причина, по которой я построил для него автоматизацию.

диаграмма

лямбда-код

import json
import os
import boto3
import time

env_vars = [
    'ALARM_NAME',
    'REGION',
    'INSTANCE_ID',
    'OUTPUT_SNS_ARN'
    ]

ENV = {}

for env_var in env_vars:
    ENV[env_var] = os.environ.get(env_var, None)
    if not ENV[env_var]:
        raise Exception(f"Environment variable {env_var} must be set!")


def reboot_instance(instanceID, regionName) -> "instanceID":
    """
    InstanceID
    instanceID - ID of instance
    regionName - name of region

    return InstanceID or False in case of exception
    """
    ec2 = boto3.resource('ec2', region_name=regionName)
    instance = ec2.Instance(instanceID)

    try:
        instance.stop()
        time.sleep(30)
        instance.stop(Force=True)
    except:
        pass

    for i in range(180): # wait 3 minutes
        instance = ec2.Instance(instanceID)
        if instance.state['Code'] == 80:
            break
        time.sleep(1)
    else:
        raise Exception('Unable to stop instance')

    instance.start()
    return instanceID


def notify_about_reboot(instanceID, snsarn) -> True:
    """
    Put SNS message about reboot to snsarn
    """
    client = boto3.client('sns', region_name='us-east-1')
    client.publish(TopicArn=snsarn, Message=f'EC2 instance {instanceID} was rebooted!')
    return True


def lambda_handler(event, context) -> "status about reboot":
    """
    event: see events/event.json 
    """
    print('EVENT:')
    print(event)
    for record in event.get('Records', None):
        sns = record.get('Sns', None)
        message = json.loads(sns.get('Message', None))
        msgalarm =  message.get('AlarmName', None)
        msgstatus = message.get('NewStateValue', None)

        if not all([sns,message,msgalarm,msgstatus]):
            continue

        if (msgalarm == ENV['ALARM_NAME']) and (msgstatus == 'ALARM'):
            notify_about_reboot(reboot_instance(ENV['INSTANCE_ID'], ENV['REGION']), ENV['OUTPUT_SNS_ARN'])
            return 'rebooting'
        else:
            return 'nothing to do'

    return 'no sns record found'

Я выпустил полностью протестированную автоматизацию с шаблоном SAM и инструкциями по установке также на https://github.com/koss822/misc/tree/master/Aws/route53-healthcheck-instance-reboot

Другие вопросы по теме