Статьи

Создайте Cron Job на AWS Lambda

Задания Cron являются действительно полезными инструментами в любых Linux или Unix-подобных операционных системах. Они позволяют нам планировать выполнение сценариев периодически. Их гибкость делает их идеальными для повторяющихся задач, таких как резервное копирование и очистка системы, а также для извлечения и обработки данных.

Несмотря на все то хорошее, что они предлагают, у cron-вакансий также есть свои минусы. Основным из них является то, что вам нужен выделенный сервер или компьютер, работающий почти круглосуточно. У большинства из нас нет такой роскоши. Для тех из нас, у кого нет доступа к такой машине, AWS Lambda является идеальным решением.

AWS Lambda — это управляемая событиями, серверная вычислительная платформа, входящая в состав Amazon Web Services. Это вычислительная служба, которая запускает код в ответ на события и автоматически управляет вычислительными ресурсами, необходимыми для этого кода. Он не только доступен для выполнения наших работ 24/7, но также автоматически распределяет ресурсы, необходимые для них.

Настройка Lambda в AWS включает в себя нечто большее, чем просто реализация нескольких функций и надежда на их периодическую работу. Чтобы запустить их, необходимо сначала настроить несколько служб и работать вместе. В этом уроке мы сначала пройдемся по всем службам, которые нам нужно будет настроить, а затем внедрим работу cron, которая будет получать обновленные цены на криптовалюту.

Понимание основ

Как мы уже говорили ранее, некоторые сервисы AWS должны работать вместе, чтобы наша функция Lambda работала как задание cron. Давайте посмотрим на каждого из них и поймем их роль в инфраструктуре.

S3 Bucket

Amazon S3 Bucket — это общедоступный облачный ресурс хранения, доступный в Amazon Storage Services (AWS) Simple Storage Service (S3), предлагающем хранилище объектов. В корзинах Amazon S3, похожих на папки с файлами, хранятся объекты, состоящие из данных и их описательных метаданных. TechTarget

Каждая функция Lambda должна быть подготовлена ​​как «пакет развертывания». Пакет развертывания представляет собой файл .zip Этот файл .zip

Роль IAM

Роль IAM — это идентификатор IAM, который вы можете создать в своей учетной записи с определенными разрешениями. Роль IAM похожа на пользователя IAM в том смысле, что это идентификационная информация AWS с политиками разрешений, которые определяют, что идентификационная информация может и не может делать в AWS. Амазонка

Нам нужно будет управлять разрешениями для нашей функции Lambda с помощью IAM. По крайней мере, он должен иметь возможность писать журналы, поэтому ему необходим доступ к журналам CloudWatch. Это минимальный минимум, и для нашей функции Lambda могут потребоваться другие разрешения. Для получения дополнительной информации на странице разрешений AWS Lambda есть вся необходимая информация.

Правило событий CloudWatch

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

Лямбда Разрешение

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

Это строительные блоки нашей работы AWS Lambda cron. Теперь, когда у нас есть представление обо всех движущихся частях нашей работы, давайте посмотрим, как мы можем реализовать это в AWS.

Внедрение Cron Job в AWS

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

Лямбда-функция

Во-первых, давайте начнем с реализации очень простой лямбда-функции. На панели инструментов AWS используйте функцию поиска служб для поиска по lambda В лямбда-консоли выберите Create a function На данный момент мы должны быть в Лямбда > Функции > reate Function .

Чтобы начать, давайте начнем со статического сообщения журнала. Наш сервис будет только функцией печати. Для этого мы будем использовать Node.js 10x в качестве языка выполнения. Присвойте ему имя функции, и в разделе «Роль выполнения » остановимся на разделе « Создать новую роль с базовыми разрешениями для лямбды» . Это базовый набор разрешений для IAM, который позволит нам загружать журналы в журналы Amazon CloudWatch. Нажмите Создать функцию .

Создать новую лямбда-функцию

Наша функция теперь создана с ролью IAM. В поле кода замените код по умолчанию следующим:

 exports.handler = async (event) => {
    console.log("Hello Sitepoint Reader!");
    return {};
};

Чтобы проверить, правильно ли выполняется код, мы можем использовать функцию Test . После присвоения имени нашему тесту, он выполнит код и покажет свой вывод в поле Результат выполнения чуть ниже нашего кода.

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

правила

Следующим шагом в создании Cron является создание повторяющихся триггеров CloudWatch. Это обеспечит повторное выполнение нашей лямбда-функции.

Итак, давайте перейдем в меню « Сервисы» и выберите Cloudwatch в разделе « Управление и управление» . Поскольку нам нужно создать новое правило, просто выберите пункт « Правила» в меню слева. Мы можем найти это прямо в разделе « События» . На консоли правил просто нажмите кнопку Новое правило .

Создать новое правило

Если мы посмотрим поближе, прямо под « Источник события» , мы увидим два варианта: « Шаблон события» и « Расписание» . Мы хотим запланировать вызов определенной цели, поэтому давайте выберем опцию Schedule . Теперь мы можем либо ввести фиксированную скорость выполнения, используя форму, либо мы можем ввести правило crontab . Для этого конкретного случая мы будем использовать фиксированную ставку в одну минуту. С нашим выбранным тарифом мы знаем, что нужно выбрать, какой будет наша цель вызова. В правой части, под меню Targets , давайте нажмем Add Target . Выберите Lambda Function в раскрывающемся меню и в раскрывающемся меню Function выберите нашу лямбда-функцию simpleStaticLogMessage

Затем нам нужно нажать « Настроить детали», чтобы добавить имя и описание для нашего вновь созданного правила. Состояние должно быть включено . Наконец, нажмите Создать правило, чтобы создать наше правило.

С нашей функцией Lambda и созданным правилом планирования, давайте, наконец, приведем ее в действие. Давайте вернемся к Lambda-консоли, выберите нашу функцию simpleStaticLogMessageМониторинг» в левом верхнем углу. Эта панель мониторинга имеет множество графических изображений, показывающих использование наших услуг. На этой информационной панели, от вызовов, продолжительности и ошибок до DeadLetterErrors, есть вся информация, необходимая для анализа использования наших сервисов.

Помните, что у этой лямбда-функции нет исходящего трафика, поэтому нам нужно проверить журналы, чтобы убедиться, что она работает. Так что выберите Просмотр журналов в CloudWatch с правой стороны.

Консоль мониторинга

Просто откройте поток журнала для нашей функции, и мы сможем видеть наше сообщение «Hello Sitepoint Reader!» Всплывающим каждую минуту!

Это был очень простой сервис без практического использования, поэтому давайте отключим его, вернувшись в меню « Правила» в консоли CloudWatch , выберите правило и в разделе « Действия» нажмите на опцию удаления.

Наша криптовалютная служба

Теперь, когда мы знаем, как создать задание cron с помощью AWS Lambda, мы можем сосредоточиться на создании службы, которая может принести определенную ценность. Мы будем использовать среду исполнения Python 3.7 для создания функции Lambda, которая будет извлекать текущее значение (в долларах США) трех верхних криптовалют. Затем мы напечатаем их так же, как и для нашего простого примера. Таким образом, каждую минуту у нас будут обновленные значения биткойнов, Ethereum и Litecoin.

Создайте новую функцию Lambda, как мы сделали для статического журнала, и добавьте следующий код:

 import json
from botocore.vendored import requests

def lambda_handler(event, context):

    bitcoin_api_url = 'https://api.coinmarketcap.com/v1/ticker/bitcoin/'
    ethereum_api_url = 'https://api.coinmarketcap.com/v1/ticker/ethereum/'
    litecoin_api_url = 'https://api.coinmarketcap.com/v1/ticker/litecoin/'

    bitcoin_response = requests.get(bitcoin_api_url)
    bitcoin_response_json = bitcoin_response.json()

    ethereum_response = requests.get(ethereum_api_url)
    ethereum_response_json = ethereum_response.json()

    litecoin_response = requests.get(litecoin_api_url)
    litecoin_response_json = litecoin_response.json()

    print("BTC: " + bitcoin_response_json[0]['price_usd'])
    print("ETH: " + ethereum_response_json[0]['price_usd'])
    print("LTC: " + litecoin_response_json[0]['price_usd'])

    return {}

Несколько быстрых заметок о коде выше. Библиотека requests Итак, мы либо устанавливаем его, либо используем from botocore.vendored import requests Затем мы будем использовать библиотеку requests В конце мы печатаем только значения каждой криптовалюты.

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

Вывод

Возможность иметь cron-задания в облаке может иметь огромное значение для бизнеса. Благодаря AWS Lambda нам больше не нужны выделенные машины с ограниченными ресурсами, которые выполняют дорогостоящие вычисления 24/7. Теперь у нас есть доступ к практически неограниченным вычислительным возможностям без необходимости снижения скорости и доступности нашего бизнеса.