Статьи

Как уведомить / отправить электронное письмо, когда экземпляр EC2 завершается

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

Для того, чтобы мои спины были восстановлены как можно скорее, я хотел бы получать уведомления, когда они прекращаются.

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

Но у этого подхода есть пара проблем.

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

Во-вторых, не так просто написать хук отключения в Linux.

Итак, вот решение для обеих этих проблем.

Проблема с электронной почтой

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

Таким образом, решение представляет собой другую службу Amazon, называемую SNS (простая служба уведомлений), которая позволит вам инициировать событие, которое можно настроить для отправки вам электронного письма. Итак, мы собираемся написать скрипт, который скажет SNS отправить нам письмо.

(SNS бесплатен для запросов ~ 200 000 в месяц, поэтому, если вы не планируете делать что-то сумасшедшее, этот подход не должен иметь предельных затрат.)

Для этого вам нужно сначала создать «тему» ​​в SNS. Перейдите на панель инструментов SNS и

1) нажмите «создать тему».
2) Создайте тему под названием «instance_down» или как вам нравится.
3) Нажмите на тему и нажмите «создать подписку».
4) Выберите протокол «электронная почта» и введите свой адрес электронной почты в качестве конечной точки.

Чтобы использовать SNS в скрипте, нам нужны инструменты командной строки AWS .

Если у вас уже есть установленный pip, просто

    pip install awscli

Потом:

    touch ~/.awsconfig
    emacs ~/.awsconfig

Заставь это сказать:

[default]
AWS_ACCESS_KEY_ID=« YOUR AWS ID»
AWS_SECRET_ACCESS_KEY=« YOUR AWS SECRET KEY»
region=« YOUR REGION »

Создайте скрипт init.d:

    sudo emacs /etc/init.d/ec2-shutdown

Заставь это сказать:

    #! /bin/sh
    ### BEGIN INIT INFO
    # Provides: ec2-terminate
    # Required-Start: $network $syslog
    # Required-Stop:
    # Default-Start:
    # Default-Stop:
    # Short-Description: restart
    # Description: send termination email
    ### END INIT INFO
    #

    export AWS_CONFIG_FILE={{ YOUR CONFIG FILE }}
    export AWS_DEFAULT_REGION={{ YOUR REGION }} # config file not picking up region for some reason
    sudo -E aws sns publish —topic-arn {{ YOUR SNS ARN }} —message “ec2 ser\
    ver {{ YOUR IDENTIFIER }} went down at $(date)”
    sleep 3 # make sure the message has time to send

    exit 0

Этот скрипт сообщит SNS, чтобы он отправил вам электронное письмо с сообщением о том, что ваш сервер не работает, и указывает время. Вы можете настроить сообщение, как вам нравится.

Проблема с сценарием выключения

Итак, как мы можем сделать это при отключении?

Мы собираемся использовать сценарии init.d. Мне понадобилось немного времени, чтобы понять, как это работает, но в двух словах …

В Linux есть понятие «runstates», которое включает в себя такие вещи, как «завершение работы» и «вход в систему». Вы можете указать Ubuntu запускать сценарии оболочки, когда он превращается в состояние выполнения, помещая сценарии в определенные папки рядом с / etc. Два состояния, которые нас интересуют, это rc0 и rc6, то есть «выключение» и «перезагрузка», которые соответствуют папкам /etc/rc0.d и /etc/rc6.d соответственно.

В Ubuntu есть инструмент командной строки, update-rc.d, который автоматически вставит сценарии символической ссылки в соответствующие папки в зависимости от передаваемых им параметров CL. Это все немного сложно, но все, что вам нужно сделать здесь:

    sudo update-rc.d ec2-shutdown start 10 0 6 .

(Это говорит о запуске сценария при входе в состояния выполнения 0 и 6, выключении и перезагрузке. И поместите его на 10-е место в списке действий)

И это должно сделать это! Теперь ваш экземпляр должен отправлять вам электронное письмо всякий раз, когда он выключается, завершается или перезагружается. Я не уверен, как ограничить только EC2 прекращение, но, пожалуйста, прокомментируйте, если знаете!

Если у вас возникли проблемы, оставьте комментарий.

И если вы найдете это полезным, рассмотрите возможность подписаться на меня в Twitter .