Рубрики
Без рубрики

Перемещение работы вашего Cron в облако с функциями Google Cloud

В этом посте я покажу вам, как сделать обычную работу CRON и принести его с вашего сервера в облако с облачными функциями и планировщиком облака. Помечено Python, CloudFunctions, Serverless, CloudScheduler.

А крон Работа – это способ запуска программы на сервере с указанным интервалом. Это часто небольшой скрипт, который делает некоторую повторяющуюся задачу, например, собирать метрики, проверять здоровье обслуживания, состоится снимка какого-то набора данных и т. Д.

Утилита CRON имеет очень настраиваемый формат, называемый файлом Crontab, который позволяет нам работать по существу любую команду на любой интервал, который мы хотим. Вы можете провести свой скрипт так часто, как раз в минуту, а как нечасто как раз в год.

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

Джобс Cron есть Лот Из применений: по сути все, что вы хотите произойти в повторяемом способом, можно превратить в работу CRON.

Одна вещь, которую я люблю использовать Cron Jobs для того, чтобы следить за веб-сайтами, которые я вижу нечасто. Например, я хотел бы увидеть статьи, размещенные в Hacker News О Serverless, но у меня нет времени, чтобы проверить это каждый день и посмотреть на звание каждого поста, чтобы увидеть, если речь идет о Python.

Вместо этого я могу написать работу Cron, чтобы сделать это для меня. Шаги будут примерно следующими:

  • Раз в день получите лучшие истории от API;
  • Итайте за каждую историю;
  • Если какой-либо из их названий совпадает «Serverless»:
    • Отправить письмо со ссылками

Вот сценарий:

#!/usr/bin/python

import requests
from utils import send_email

api_url = 'https://hacker-news.firebaseio.com/v0/'
top_stories_url = api_url + 'topstories.json'
item_url = api_url + 'item/{}.json'

def scan_hacker_news()
    # Make a request to the API
    top_stories = requests.get(top_stories_url).json()
    serverless_stories = []

    # Iterate over every story
    for story_id in top_stories:
        story = requests.get(item_url.format(story_id)).json()
        if 'serverless' in story['title'].lower():
            serverless_stories.append(story)

    # If there are any, send an email
    if serverless_stories:
        send_email(serverless_stories)

Это делает запрос на API, итерацию за каждую историю, фильтрует истории, которые имеют «безверенно» в заголовке, и отправляет мне электронное письмо (мы оставим эту функцию как упражнение для читателя).

Если бы я хотел настроить эту работу в качестве работы на моем машине Linux, я бы сохранил его в файл ( send_me_pythons.py ), сделайте его исполняемым ( chmod 755 send_me_pythons.py ) и положить его В моем местном bin ( /usr/local/bin/send_me_pythons.py ).

Затем я редактирую свой Crontab ( /etc/crontab ) и добавьте следующую строку:

0 0 * * * /usr/local/bin/send_me_pythons.py

Это запускает сценарий один раз в день в полночь. Мне нравится использовать https://crontab.guru/ Чтобы убедиться, что мой Crontab правильно, прежде чем установить его. Вот диаграмма каждого поля:

# 0 0 * * * /usr/local/bin/send_me_pythons.py
# │ │ │ │ │ └── run this script
# │ │ │ │ └──── every year
# │ │ │ └────── every month
# │ │ └──────── every day
# │ └────────── at hour zero
# └──────────── at minute zero

Как только Crontab установлен, моя машина заберет на новой задании CRON и запустить ее так часто, как я уже указывал.

Это здорово, но у него есть один огромный недостаток: теперь я должен держать свой сервер и запустить, чтобы убедиться, что электронные письма отправляются, в противном случае я буду вести ценный контент без сердечности. И это еще более осложняется тем, что либо я должен использовать этот сервер для других вещей, кроме того, что раз в день выполнял этот маленький скрипт один раз в день, или мне нужно держать весь сервер и запустить только для этого маленького сценария! Не идеально.

Вместо этого давайте возьмем эту функцию в облако. Во-первых, мы превратим его в Функция Google Cloud Отказ Мы уничтожим весь наш существующий скрипт в функции Python и поместите его в файл под названием main.py :

import requests
from utils import send_email

api_url = 'https://hacker-news.firebaseio.com/v0/'
top_stories_url = api_url + 'topstories.json'
item_url = api_url + 'item/{}.json'

def send_pythons(request):
    # Make a request to the API
    top_stories = requests.get(top_stories_url).json()
    serverless_stories = []

    # Iterate over every story
    for story_id in top_stories:
        story = requests.get(item_url.format(story_id)).json()
        if 'serverless' in story['title'].lower():
            serverless_stories.append(story)

    # If there are any, send an email
    if serverless_stories:
        send_email(serverless_stories)

Примечание: Только линии, которые должны случиться каждый раз, функция называется фактически должна быть в send_pythons функция. Операторы импорта необходимо выполнить только один раз, когда функция загружается, и можно оставить вне функции.

Далее мы определим наши зависимости. Мы используем Запросы поэтому нам нужно поставить его в нашу требования .txt :

requests==2.20.0

Затем мы можем развернуть это с gcloud Инструмент командной строки:

$ gcloud beta functions deploy test --runtime python37 --trigger-http

Это даст нам конечную точку, что-то вроде:

https://us-central1-[PROJECT_ID].cloudfunctions.net/send_pythons

И сделать http Получить Запрос на эту конечную точку приведет к запуску нашей функции.

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

$ gcloud beta scheduler jobs create http send_pythons_job \
    --schedule="0 0 * * *" \
    --uri=https://us-central1-[PROJECT_ID].cloudfunctions.net/send_pythons

Это указывает имя для нашей работы send_pythons_job , который является уникальным в рамках проекта. Он также указывает график Crontab, который мы установили выше, и указывает на работу нашей функции HTTP, которую мы создали.

Мы можем перечислить нашу работу:

$ gcloud beta scheduler jobs list --project=$PROJECT
ID                LOCATION     SCHEDULE (TZ)        TARGET_TYPE  STATE
send_pythons_job  us-central1  0 0 * * * (Etc/UTC)  HTTP         ENABLED

И если мы хотим запустить нашу работу вне расписания, мы можем сделать это из командной строки:

$ gcloud beta scheduler jobs run send_pythons_job

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

Все код © Google W/Apache 2 лицензия

Оригинал: “https://dev.to/googlecloud/moving-your-cron-job-to-the-cloud-with-google-cloud-functions-1ecp”