Підручник з лямбда-функцій Cron Job AWS - Як планувати завдання

Завдання Cron зазвичай використовуються для планування команд на певний час. Ви можете використовувати їх для таких завдань, як запуск резервних копій, відстеження стану системи або виконання завдань з обслуговування системи.

Роботи Cron - це корисна утиліта для системних адміністраторів. І коли ви адмініструєте систему в хмарі, завдання cron все ще дуже корисні - вам все одно доведеться виконувати багато адміністративних завдань у своїх системах.

Одним із способів запуску завдань cron у хмарі є використання функції як служби (FaaS), як Лямбда в екосистемі AWS.

Функції виконуються, коли вони ініціюються для цього, і вони запускають код у хмарі без необхідності надавати або підтримувати будь-яку інфраструктуру. Також функції можна налаштувати для запуску в певний час або з певною періодичністю, як традиційні завдання cron.

У цьому дописі в блозі я буду використовувати екосистему AWS, щоб продемонструвати вам конкретний приклад того, як створити роботу cron за допомогою функції в хмарі.

Події Amazon CloudWatch

Для того, щоб використовувати функцію лямбда як завдання cron, нам потрібно зрозуміти події Amazon CloudWatch.

Події Amazon CloudWatch надсилаються, коли в ресурсах AWS відбуваються зміни. Ці події можуть викликати функцію лямбда-сигналу AWS. Коли ваші ресурси AWS змінюють стан, вони автоматично надсилають події CloudWatch до потоку подій.

Отже, ви можете створити правило, яке запускає певну лямбда-функцію, коли щось трапляється. Наприклад, ви можете автоматично викликати функцію лямбда, коли змінюється група автомасштабування.

Крім того, події CloudWatch можуть викликати функцію Лямбда для виконання за звичайним розкладом. І таким чином ви можете мати, наприклад, функцію лямбда, яка вимикає всі ваші екземпляри тестування та розробки EC2 після 18:00, а іншу, яка вмикає їх після 8:00.

Налаштування демонстрації

Я хочу показати вам приклад функції Лямбда, яка може виконувати дії на ваших екземплярах EC2. Я буду використовувати SAM AWS, щоб визначити свою функцію Лямбда як інфраструктуру як код.

Якщо ви хочете спробувати цю демонстраційну версію, вам потрібно мати обліковий запис AWS та один або кілька екземплярів EC2, налаштованих у вашому обліковому записі AWS. Це ті, якими ми будемо маніпулювати за допомогою функцій Лямбда. Екземпляри EC2 - це версія AWS віртуальних машин у хмарі.

Ви можете спробувати демонстрацію на AWS Cloud9 IDE (IDE на основі браузера), оскільки AWS SAM вже налаштовано в цій IDE. Якщо ви хочете знати, як використовувати AWS Cloud9 IDE для роботи лямбда-функцій, ви можете переглянути це відео.

У цьому прикладі ми збираємося запускати та зупиняти екземпляри EC2, використовуючи дві різні лямбди AWS, які спрацьовують у певний час. Ми починаємо екземпляри о 8 ранку щодня і вимикаємо їх о 18 вечора, коли день закінчується.

Для цього ми будемо використовувати подію CloudWatch для запуску лямбди в потрібний час, а також AWS SDK для виконання операцій у екземплярах.

Остаточний код для цього прикладу доступний у цьому сховищі GitHub. Щоб цей код працював в AWS Cloud9 IDE, вам потрібно налаштувати свій обліковий запис GitHub в IDE, щоб мати можливість клонувати проект, а потім клонувати його всередині IDE.

Коли все буде готово, просто запустіть цю команду всередині клонованого каталогу:

$ sam deploy --guided

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

Перше, що вам потрібно визначити - це назва вашого проекту. Потім ви встановите регіон, де він розгортається - виберіть той самий, де знаходяться ваші екземпляри EC2. Далі нам потрібно дати сценарію розгортання список екземплярів, якими ми хочемо маніпулювати. І тоді ми закінчимо - це розгорне проект на нашому обліковому записі AWS.

Визначення функції лямбда-сигналу AWS

Перше, що я хочу вам показати, це те, як ми визначаємо функцію AWS Lambda, яка запускається в певний час за допомогою AWS SAM. Це визначення буде у файлі під назвою "template.yml".

Ось як виглядає функція. Давайте розглянемо важливі рядки:

Перший рядок - це назва функції, в даному випадку “ StartInstanceFunction ”.

Тоді ми маємо визначення “ Властивості ”. Перша властивість - « Обробник ». Тут ми вкажемо модуль (файл), де знаходиться код, який потрібно виконати, а потім метод всередині цього модуля.

І тоді ми маємо “ CodeUri ”, тобто шлях, який показує, де знайти цей файл. У цьому випадку наш код буде знаходитись у каталозі “cron” у файлі “handler.js” та у методі “startInstance”.

Після цього ми маємо визначення “ Runtime ”. Я буду використовувати NodeJS версії 12, але ви можете використовувати Python, Java, Go, C # або що завгодно, що вас радує. Лямбда підтримує декілька часу роботи з коробки, і ви можете принести свій власний час виконання, якщо хочете.

Тоді ми маємо визначення “ Довкілля ”, яке ми будемо використовувати для визначення однієї змінної середовища. Ця змінна дозволить нам надсилати в код динамічно різні ідентифікатори екземплярів, залежно від конфігурації під час розгортання.

Після цього ми маємо розділ під назвою " Політики ", де ми визначаємо дозволи, які матиме ця конкретна функція Лямбда.

Важливо знати, що всі лямбда-функції створюються без будь-яких дозволів. Це означає, що вони не можуть нічого робити на будь-яких інших ресурсах AWS.

Для того, щоб ця лямбда-функція запускала екземпляр EC2, їй потрібні дозволи для здійснення цієї конкретної дії з цим конкретним ресурсом AWS. У цій конкретній політиці ми надаємо дозволи на запуск ВСІХ екземплярів EC2 у цьому обліковому записі AWS. ALL представлено знаком «*» у розділі «ресурси».

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

І нарешті, останній розділ - це розділ “ Події ”. Тут ми визначимо, як ця функція лямбда буде запускатися. Ця функція запускається із запланованою подією CloudWatch, яка запускає лямбду щодня о 8 ранку. В основному о 8 щодня він включатиме всі вказані вами екземпляри EC2.

Існує багато правил для формування цього виразу cron: наприклад, щоб сказати, що ви хотіли б, щоб це працювало лише з понеділка по п’ятницю, напишіть cron (0 8? * ПН-ПТ *). Ви можете знайти більше інформації на сайті документації подій CloudWatch тут: //docs.aws.amazon.com/lambda/latest/dg/services-cloudwatchevents-expressions.html.

Кодування функції лямбда-сигналу AWS

Тепер, коли ми визначили функцію Лямбда, нам потрібно надати їй деякий код. У папці “cron”, у файлі “handler.js”, нам потрібно додати метод “ startInstance ”, який виглядає так:  

Цей метод буде викликаний, коли функція запускається щодня о 8 ранку. Він отримає список екземплярів EC2 із змінної середовища, яку ми передали всі ідентифікатори екземплярів під час розгортання. Тоді він створить їх масив.

Коли це буде, він викличе AWS SDK і надішле масив ідентифікаторів екземплярів як параметр. І якщо є якась помилка, він буде реєструвати її та завершувати. Одразу після завершення виконання цієї лямбди ви можете зайти на свою консоль EC2 і подивитися, як вмикаються ваші екземпляри.

Функція вимкнення екземплярів EC2 дуже схожа з деякими відмінностями. Ви можете знайти код для цієї функції за цим посиланням і перевірити його.

Запуск завдання cron

Щоб запустити цю роботу cron, залишається не так багато роботи. Після розгортання двох функцій у вашому обліковому записі AWS, в тому ж регіоні, що і ваші екземпляри, вони виконуватимуть і виконуватимуть те, що було запрограмовано.

Тепер вам потрібно почекати до 8 ранку чи до 6 вечора, щоб перевірити, чи працюють вони. Або якщо ви хочете перевірити це прямо зараз, змініть час події у визначенні Лямбди на час, який вам підходить. Переконайтеся, що екземпляр увімкнено, якщо ви плануєте їх вимкнути або навпаки, щоб ви могли побачити зміни.

Тепер почекайте і подивіться, що відбувається в консолі EC2. Відразу після встановленого часу ви побачите, як екземпляр вимикається чи вмикається, а потім робить навпаки в інший час, коли ви налаштовуєте. Це триватиме вічно, доки ви не видалите лямбда-функції.

Очищення вашого облікового запису AWS

Після завершення цієї демонстрації я рекомендую вам вимкнути (або видалити екземпляр, який ви створили для тестування) і видалити щойно створені функції лямбда.

Видалити лямбда-функції так само просто, як зайти в службу CloudFormation на консолі керування AWS і видалити стек ресурсів, створених AWS SAM.

Також не забудьте припинити та видалити екземпляри EC2, якщо ви створили їх для цієї демонстрації.

Щоб зробити висновок

Функції AWS Lambda - дуже корисний інструмент для виконання всіх видів завдань у вашому обліковому записі AWS. В основному ви можете отримувати сповіщення про будь-які зміни в ресурсах AWS через події CloudWatch, а потім ви можете отримати доступ майже до всіх служб, використовуючи AWS SDK. Таким чином, ви можете виконувати всі види завдань з технічного обслуговування та автоматизованих завдань над своєю інфраструктурою.

Дякуємо за читання.

Я Марсія Віллалба, адвокат розробника для AWS і ведуча YouTube-каналу під назвою FooBar, де я маю понад 250 відео-посібників з безсерверних, AWS та практик програмного забезпечення.

  • Twitter: //twitter.com/mavi888uy
  • Youtube: //youtube.com/foobar_codes