287.35
Rating
Southbridge
Обеспечиваем стабильную работу highload-проектов
26 November 2019

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

Southbridge corporate blogSystem administrationDevOps
Translation
Tutorial
Original author: Priti Desai


Эта статья продолжает цикл переводных заметок об 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

Tags:serverlessбессерверные вычисленияopenwhisktriggerwebhookslack
Hubs: Southbridge corporate blog System administration DevOps
+12
1.4k 22
Leave a comment
DevOps-инженер
from 100,000 to 180,000 ₽SouthbridgeRemote job
Information
Founded

22 March 2008

Location

Россия

Employees

31–50 employees

Registered

15 November 2012