Блог Слёрм

Бессерверные вычисления на основе OpenWhisk. Часть 2

Эта статья продолжает цикл переводных заметок об OpenWhisk от автора Priti Desai. Сегодня будут рассмотрены примеры развертывания GitHub webhook, периодических сигналов, а также приведено простейшее приложение для отправки сообщений в Slack.

GitHub webhook

Функции OpenWhisk могут быть запущены разными событиями (к примеру, push, pull request и т.п.) из репозитория GitHub.

Давайте посмотрим, как можно развернуть функцию для обработки GitHub webhook, используя wskdeploy.

Шаг первый

Создаем файл-манифест:

Для обработки событий с GitHub надо указать источник событий /whisk.system/github/webhook в качестве условия для срабатывания:


Скопировать код

Шаг второй

Создаем файл для развертывания, в котором выставляем значения входных параметров username, repository, accessToken и events для условной обработки источника событий GitHubWebhookTrigger:


Скопировать код

Шаг третий


Разворачиваем функцию:


Скопировать код

Мы развернули функцию hello world, вызываемую из GitHub каждый раз при обновлении кода в репозитории GitHub, и использовали для этого webhook:


Можем проверить развернутую функцию, создавая новые правки кода в репозитории GitHub. При этом будут возвращаться простые приветственные сообщения. Попробуем использовать полезную нагрузку при обновлении кода, присылаемую от GitHub через POST запрос. Эти данные доступны в качестве параметров функции, например:

function main(params) {
       console.log("GitHub repository is at ", params.repository.url);
       return {commits: params.commits};
}

Здесь фрагмент полезной нагрузки, полученной при обычной правке README.md:


Скопировать код

Можно изучить детализированное описание срабатывания GitHub webhook тут

Сигналы

Функции OpenWhisk могут периодически запускаться по внутреннему сигналу (что-то вроде задач cron). Давайте попробуем добавить условное срабатывание по сигналу через wskdeploy.

Шаг первый

Для обработки сигналов надо указать источник событий /whisk.system/alarms/alarm в качестве условия для срабатывания в манифесте:


Скопировать код

Шаг второй

Создаем файл для развертывания, указываем cron в качестве входного условия, со значением Every12Hours. Можно также использовать оба варианта, используемых в cron, традиционный и улучшенный:

<Minute> <Hour> <Day_of_the_Month> <Month_of_the_Year> <Day_of_the_Week>
или
<Minute> <Hour> <Day_of_the_Month> <Month_of_the_Year> <Day_of_the_Week> <Year>

Содержимое файла deployment.yaml:


Скопировать код

Есть возможность указать полезную нагрузку, передаваемую при срабатывании сигнала (передается в виде параметра функции при каждом срабатывании) в виде параметра trigger_payload:


Скопировать код

Шаг третий

Разворачиваем функцию:


Скопировать код

С этого момента у ас есть функция hello world, запускаемая каждые 12 часов. Можем проверить ее путем активации условия, как это было показано ранее

Пакет для Slack

Для отправки сообщений в Slack предлагается пакет для Slack. Давайте рассмотрим привязку пакета с использованием wskdeploy.

Шаг первый

Создаем файл-манифест с привязкой пакета для Slack. Для этого указываем его в качестве зависимости, задавая в location значение /whisk.system/slack:

packages:
        SlackPackage:
               dependencies:
                       slack-package-to-post-messages:
                             location: /whisk.system/slack
                             inputs:
                                   username: $SLACK_USERNAME
                                   url: $SLACK_URL
                                   channel: $SLACK_CHANNEL

В первую очередь, надо настроить поддержку для входящего webhook в нашем рабочем окружении Slack. Настроить новый webhook для отправки сообщений в канал Slack можно по этой пошаговой инструкции.

Теперь добавляем пакет для Slack в наше приложение для отправки сообщений в канал Slack каждый час с помощью такого манифеста:


Скопировать код

Содержимое функции post-to-slack.js можно глянуть здесь.

Шаг второй


Создаем файл для развертывания:

application:
       name: AppToPostToSlack
       packages:
               SlackPackage:
                     actions:
                           post-to-slack:
                                 inputs:
                                       message: "Hello from WskDeploy!"
                                       slack_package: slack-package-to-post-messages
                     triggers:
                          everyhour:
                                inputs:
                                      cron: "0 */1 * * *"

Шаг третий

Разворачиваем функцию:


Скопировать код

На этом шаге у нас уже есть функция post-to-slack, запускаемая 1 раз за час. Можно ее проверить путем активации условия, как это было показано ранее. После активации мы должны получить новое сообщение на канале Slack:

Activation: post-to-slack (9909dd5229e84526bff9902a2cd860df)
[
      "2017-09-12T23:05:17.17872899Z stdout: Hello from WskDeploy!",
      "2017-09-12T23:05:17.549177677Z stdout: Posted message to slack"
]

Другие статьи цикла

Бессерверные вычисления на основе OpenWhisk, часть 1
Бессерверные вычисления на основе OpenWhisk, часть 3
Бессерверные вычисления на основе OpenWhisk, часть 4
DevOps