Саморозривний екземпляр AWS EC2?


78

Чи є спосіб, що екземпляри Amazon Web Services EC2 можуть самостійно припинятися? Чи є у Amazon щось, що дозволяє екземпляру самозавершитись ("Хара-Кірі") після запуску більше, ніж, скажімо, години? Я міг би змінити сценарії на запущеному екземплярі, щоб зробити це сам, але це може не вдатися, і я не хочу редагувати зображення, тому я хотів би, щоб Amazon вбив екземпляр.


2
Тільки для уточнення, мені потрібен аварійний вимикач, якщо екземпляр триває більше X годин. Моїм випадком є ​​те, що я використовую Amazon EC2 для швидкого обертання екземпляра, запуску деякого процесу в Ubuntu (це займає близько 5 хвилин), а потім самозавершення. Цим керує програма для робочого столу Windows. Здебільшого це працює як шарм, однак, іноді користувач закриває ноутбук і їде у відпустку на тиждень, і вгадайте, що, у мене нараховується AWS за 168 годин, які мені не потрібні. Якщо хтось хоче отримати більше деталей, я можу вам про це все розповісти. Steve
Steve3p0

Відповіді:


98

Щоб примірник завершився сам, виконайте обидва ці кроки:

  1. Запустіть екземпляр з --instance-initiated-shutdown-behavior terminateабо еквівалентом на консолі AWS або виклику API.
  2. Запустити shutdown -h nowяк root. На Ubuntu ви можете налаштувати це на 55 хвилин, використовуючи:

    echo "sudo halt" | at now + 55 minutes
    

Я вже давно писав статтю про інші варіанти досягнення тієї самої цілі "закінчити за годину":

Автоматичне припинення тимчасових екземплярів на Amazon EC2
http://alestic.com/2010/09/ec2-instance-termination

Спочатку стаття була написана до того, як instance-initiated-shutdown-behaviorбула доступною, але ви знайдете оновлення та інші дорогоцінні камені в коментарях.


Ерік, дякую, але я не бачу, де я можу зробити No1 на консолі AWS. Я бачу параметр "Поведінка вимкнення" в "Майстрі запитів на екземпляри", але єдиними параметрами є "Припинити" та "Зупинити". Це насправді не планує зупинки екземпляра за годину. Я збираюся перевірити API AWS .NET, який я використовую для запуску екземпляра, чи можу я зробити щось подібне.
Steve3p0

6
Ви встановлюєте "поведінку вимкнення" на "завершення", а потім виконуєте "зупинку" або "вимкнення -h зараз" на екземплярі, коли ви хочете, щоб воно закінчилося. Заплануйте заздалегідь, використовуючи "на". (1) та (2) є необхідними кроками в одному процесі, а не альтернативними підходами.
Ерік Хаммонд,

2
Будь-яка причина робити "shutdown -h now" на відміну від "shutdown -P now"?
Дастін Босуелл,

3
@EricHammond Причина, по якій я запитую, полягає в тому, що мої екземпляри не вимикаються приблизно 5% часу (вони застряють у вклиненому стані, де вони працюють, але не припиняються і не можуть бути ssh'd). Просто цікавився, чи це може бути причиною.
Дастін Босуелл

2
@DustinBoswell може бути, що ви використовуєте "зупинка" або "вимкнення -h", що не те саме, що працює, залежно від налаштувань системи. Спробуйте "sudo poweroff" (або "sudo shutdown -P now", але мені подобається "poweroff" за його багатослівність).
AntonioMO

23

Ви можете це зробити

ec2-terminate-instances $(curl -s http://169.254.169.254/latest/meta-data/instance-id)

Ec2 отримає свій поточний ідентифікатор екземпляра та завершить свою роботу.


4
Мені подобається цей метод ... але він вимагає, щоб у вас були встановлені облікові дані для запуску екземплярів terminate. Це не завжди буде так, і ви отримаєте помилку "Client.UnauthorizedOperation".
RaveTheTadpole

3
Ви можете налаштувати профіль екземпляра, який позбавить вас потреби налаштовувати облікові дані.
galva

@RaveTheTadpole, якщо ви хочете, щоб екземпляр припинив свою діяльність, йому потрібен дозвіл на самозавершення. Це неявний стан.
polvoazul

11

Сподіваємось, це спрацює

instanceId=$(curl http://169.254.169.254/latest/meta-data/instance-id/)
region=$(curl http://169.254.169.254/latest/dynamic/instance-identity/document | grep region | awk '{print $3}' | sed  's/"//g'|sed 's/,//g')

/usr/bin/aws ec2 terminate-instances --instance-ids $instanceId --region $region

Сподіваюся, це допоможе вам !!!


Дякую! Я трохи його змінив, не знаю, чи використовуєте ви jq, але вирішив, що поділюся в будь-якому випадку. region = $ (curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region)
D.Fitz

6

Ось мій сценарій саморозриву

$ EC2_INSTANCE_ID="`wget -q -O - http://instance-data/latest/meta-data/instance-id || die \"wget instance-id has failed: $?\"`"
$ echo "ec2-terminate-instances $EC2_INSTANCE_ID" | at now + 55 min || die 'cannot obtain instance-id'

Якщо ви хочете призначити це як Самозупинка на самоперериванні , Ви можете зробити це лише один раз.

У своїй консолі EC2 перейдіть до Налаштування екземпляра , змініть поведінку вимкнення на Зупинити .
Налаштувавши /etc/cloud/cloud.cfg , ви можете звернутися до запуску сценарію завантаження за допомогою cloud-init .
Дотримуйтесь відповіді Еріка Хаммонда , вставте команду у файл і знайдіть її у шляху сценаріїв на завантаження :

$ echo '#!/bin/sh' > per-boot.sh
$ echo 'echo "halt" | at now + 55 min' >> per-boot.sh
$ echo 'echo per-boot: `date` >> /tmp/per-boot.txt' >> per-boot.sh
$ chmod +x per-boot.sh
$ sudo chown -R root per-boot.sh
$ sudo mv -viu per-boot.sh /var/lib/cloud/scripts/per-boot

Перезавантажте примірник, перевірте, чи виконується сценарій:

$ cat /tmp/per-boot.txt 
per-boot: Mon Jul 4 15:35:42 UTC 2016

Якщо так, то на випадок, якщо ви забудете зупинити свій екземпляр, він запевнить вас, що екземпляр сам зробить припинення як зупинку, коли він працює 55 хвилин або будь-який час, який ви встановили в сценарії.

Broadcast message from root@ip-10-0-0-32
        (unknown) at 16:30 ...

The system is going down for halt NOW!

PS: Для всіх хочуть використовувати Вугільні , одне слід зазначити , що не всі види EC2 є самовідновлення при перезапуску. Я рекомендую використовувати EC2-VPC / EBS з графіком увімкнення / вимкнення .


-1

У мене була подібна потреба, коли у мене були веб-програми, що запускали екземпляри EC2. Я не міг довіряти веб-програмі зупиняти / припиняти екземпляри, тому я створив сценарій для запуску в окремому процесі, який називається "фідер". Фідер несе відповідальність за зупинку / припинення екземпляра. Веб-програма повинна періодично вимагати, щоб фідер "годував" екземпляр. Якщо екземпляр "голодує" (не подається протягом періоду очікування), фідер зупинить / припинить його. Дві фідери можна запускати одночасно на різних машинах, щоб захистити від проблем з одним фідерним процесом. Іншими словами, екземпляр працює на реле тиску. Коли тиск скидається, екземпляр зупиняється / припиняється. Це також дозволяє мені ділитися екземпляром між кількома користувачами.

Щодо вихідного питання, фідер, який може працювати в самому екземплярі EC2, позбавляє від необхідності апріорі знати, як довго буде виконуватися завдання, але накладає на додатки тягар для забезпечення періодичних подач. Якщо ноутбук закрито, екземпляр не працює.

Подавач живе тут: https://github.com/alessandrocomodi/fpga-webserver і має дозвільну ліцензію з відкритим кодом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.