Бессерверные вычисления на основе 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/


Интересные статьи

Интересные статьи

Застрять в пробке — нет ничего хуже для любого водителя в мире. Движение замедляется до скорости черепахи, зачастую из-за какой-то ерунды или вообще без причины. Мы, инженеры из Netf...
Привет! В этой статье я расскажу, как сделать страницу в Atlassian Confluence с таблицей, данные в которую будут приходить из REST запроса. Мы сделаем страницу в Confluence с та...
Я системный администратор, занимаюсь компьютерами, и сегодня мы поговорим о Kubernetes. Я постараюсь глубже окунуться в тему, рассмотрев, какие проблемы сисадмин может решить с помощь...
Последний год, в котором выходили заметные тайтлы для DOS. Большая часть AAA-проектов уже идёт только под Windows, хотя в некоторых случаях рядом с виндовым экзешником ещё кладут досовский. Но эт...
Холивар. История рунета. Часть 1. Начало: хиппи из Калифорнии, Носик и лихие 90-е Холивар. История рунета. Часть 2. Контркультура: пАдонки, марихуана и Кремль Холивар. История рунета. Часть 3. ...