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

от автора

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

GitHub webhook

Функции OpenWhisk могут быть запущены разными событиями (к примеру, push, pull request и т.п.) из репозитория GitHub.
Давайте посмотрим, как можно развернуть функцию для обработки GitHub webhook, используя wskdeploy.

Шаг первый

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

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

packages:     helloworld:         actions:             helloworld:                 location: src/hello.js                 runtime: nodejs:6                 inputs:                     name:                         type: string                         description: name of a person                     place:                         type: string                         description: location of a person                 outputs:                     payload:                         type: string                         description: a simple greeting message, Hello World!         triggers:             GitHubWebhookTrigger:                 feed: /whisk.system/github/webhook         rules:             helloworldOnWebhook:                 action: helloworld                 trigger: GitHubWebhookTrigger

Шаг второй

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

application:     name: SampleHelloWorld     namespace: _     packages:         helloworld:             actions:                 helloworld:                     inputs:                         name: Amy                         place: Paris             triggers:                 GitHubWebhookTrigger:                     inputs:                         username: pritidesai                         repository: pritidesai/helloworld                         accessToken: <accessToken>                         events: push

Шаг третий

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

./wskdeploy -p ~/SampleHelloWorldApp/          ____      ___                   _    _ _     _     _         /\   \    / _ \ _ __   ___ _ __ | |  | | |__ (_)___| | __    /\  /__\   \  | | | | '_ \ / _ \ '_ \| |  | | '_ \| / __| |/ /   /  \____ \  /  | |_| | |_) |  __/ | | | |/\| | | | | \__ \   <   \   \  /  \/    \___/| .__/ \___|_| |_|__/\__|_| |_|_|___/_|\_\    \___\/              |_| Packages: Name: helloworld     bindings:   * action: helloworld     bindings:         - name: name value: Amy         - name: place value: Paris Triggers: * trigger: GitHubWebhookTrigger     bindings:         - name: accessToken value: ****         - name: events value: push         - name: username value: pritidesai         - name: repository value: pritidesai/helloworld     annotations:         - name: feed value: /whisk.system/github/webhook Rules * rule: helloworldOnWebhook     - trigger: GitHubWebhookTrigger     - action: helloworld Do you really want to deploy this? (y/N): y Deploying package helloworld ... Done! Deploying action helloworld/helloworld ... Done! Deploying trigger feed GitHubWebhookTrigger ... Done! Deploying rule helloworldOnWebhook ... Done! Deployment completed successfully.

Мы развернули функцию 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:

"commits" : [   {     "author" : {       "name" : Priti Desai,       "username" : pritidesai     },     "timestamp" : 2017-03-20T12:54:41-07:00,     "removed" : [     ],     "modified" : [       README.md     ],     "added" : [     ],     "message" : Update README.md,     "committer" : {       "name" : GitHub,       "email" : noreply@github.com,       "username" : web-flow     }   } ],

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

Сигналы

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

Шаг первый

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

packages:     helloworld:         actions:             helloworld:                 location: src/hello.js                 runtime: nodejs:6                 inputs:                     name:                         type: string                         description: name of a person                     place:                         type: string                         description: location of a person                 outputs:                     payload:                         type: string                         description: a simple greeting message, Hello World!         triggers:             Every12Hours:                 feed: /whisk.system/alarms/alarm         rules:             hellowroldOnCron:                 action: helloworld                 trigger: Every12Hours

Шаг второй

Создаем файл для развертывания, указываем 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:

application:     name: SampleHelloWorld     namespace: _     packages:         helloworld:             actions:                 helloworld:                     inputs:                         name: Amy                         place: Paris             triggers:                 Every12Hours:                     inputs:                         cron: "0 */12 * * *"

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

application:     name: SampleHelloWorld     namespace: _     packages:         helloworld:             actions:                 helloworld:                     inputs:                         name: Amy                         place: Paris             triggers:                 Every12Hours:                     inputs:                         cron: "0 */12 * * * *"                         trigger_payload: "{\"name\":\"Mark\", \"place\":\"Barcelona\"}"

Шаг третий

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

./wskdeploy -p ~/SampleHelloWorldApp/          ____      ___                   _    _ _     _     _         /\   \    / _ \ _ __   ___ _ __ | |  | | |__ (_)___| | __    /\  /__\   \  | | | | '_ \ / _ \ '_ \| |  | | '_ \| / __| |/ /   /  \____ \  /  | |_| | |_) |  __/ | | | |/\| | | | | \__ \   <   \   \  /  \/    \___/| .__/ \___|_| |_|__/\__|_| |_|_|___/_|\_\    \___\/              |_|  Packages: Name: helloworld     bindings:   * action: helloworld     bindings:         - name: name value: Amy         - name: place value: Paris  Triggers: * trigger: Every12Hours     bindings:         - name: cron value: 0 */12 * * * *     annotations:         - name: feed value: /whisk.system/alarms/alarm   Rules * rule: helloworldEvery12Hours     - trigger: Every12Hours     - action: helloworld  Do you really want to deploy this? (y/N): y Deploying package helloworld ... Done! Deploying action helloworld/helloworld ... Done! Deploying trigger feed Every12Hours ... Done! Deploying rule helloworldEvery12Hours ... Done!  Deployment completed successfully.

С этого момента у ас есть функция 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 каждый час с помощью такого манифеста:

packages:     SlackPackage:         dependencies:             slack-package-to-post-messages:                 location: /whisk.system/slack                 inputs:                     username: $SLACK_USERNAME                     url: $SLACK_URL                     channel: $SLACK_CHANNEL         actions:             post-to-slack:                 function: actions/post-to-slack.js                 runtime: nodejs:6                 inputs:                     message:                         type: string                         description: message to post on slack                     slack_package:                         type: string                         description: slack package name         triggers:             everyhour:                 feed: /whisk.system/alarms/alarm         rules:             post-to-slack-every-hour:                 action: post-to-slack                 trigger: everyhour

Содержимое функции 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 * * *"

Шаг третий

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

./wskdeploy -p ~/AppToPostToSlack/          ____      ___                   _    _ _     _     _         /\   \    / _ \ _ __   ___ _ __ | |  | | |__ (_)___| | __    /\  /__\   \  | | | | '_ \ / _ \ '_ \| |  | | '_ \| / __| |/ /   /  \____ \  /  | |_| | |_) |  __/ | | | |/\| | | | | \__ \   <   \   \  /  \/    \___/| .__/ \___|_| |_|__/\__|_| |_|_|___/_|\_\    \ __\/              |_| Packages: Name: SlackPackage     bindings:   * dependency: slack-package-to-post-messages     location: /whisk.system/slack   * action: post-to-slack   bindings:     - message : "Hello from WskDeploy!"     - slack_package : "slack-package-to-post-messages"   annotations: Triggers: * trigger: everyhour     bindings:         - cron : "0 */1 * * *"     annotations:         - name: feed value: /whisk.system/alarms/alarm Rules * rule: post-to-slack-every-hour     - trigger: everyhour     - action: SlackPackage/post-to-slack Do you really want to deploy this? (y/N): y Deployment completed successfully.

На этом шаге у нас уже есть функция 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, часть 2
Бессерверные вычисления на основе OpenWhisk, часть 3
Бессерверные вычисления на основе OpenWhisk, часть 4


ссылка на оригинал статьи https://habr.com/ru/company/southbridge/blog/477628/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *