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

от автора

Это цикл переводных заметок автора Priti Desai. Поскольку сами заметки довольно короткие, то в одной публикации будет собрано сразу несколько. Будут рассмотрены детали развертывания приложений для OpenWhisk с примерами, а в конце цикла — приведена архитектура и код приложения, использующего бессерверные вычисления на основе OpenWhisk.

Автоматизируем развертывание приложения для OpenWhisk

Вы уже поставили OpenWhisk и проверили простую функцию hello.js в работе?

cat hello.js function main() {     return {payload:  'Hello World'}; }

А хотите автоматизировать развертывание этой простейшей функции? Если да, продолжайте читать эту заметку. Я покажу, как использовать openwhisk-wskdeploy для автоматизации развертывания простейшей функции.

Необходимые компоненты

Шаг первый

Создаем файл-манифест (manifest.yaml) с таким содержимым:

packages:     helloworld:         actions:             helloworld:                 location: src/hello.js                 runtime: nodejs:6                 outputs:                     payload:                         type: string                         description: a simple greeting message, Hello World.

Шаг второй

Создаем файл для развертывания (deployment.yaml):

application:     name: SampleHelloWorld     namespace: _     packages:         helloworld:             actions:                 helloworld:

На самом деле этот файл для поставки helloworld не обязателен, достаточно манифеста из первого шага.

Шаг третий

Создаем структуру каталогов. Выглядит она примерно так:

# ls -1R ~/SampleHelloWorldApp/ deployment.yaml manifest.yaml src/  ./src: hello.js

Шаг четвертый

Выполняем развертывание функции HelloWorld:

./wskdeploy -p ~/SampleHelloWorldApp/          ____      ___                   _    _ _     _     _         /\   \    / _ \ _ __   ___ _ __ | |  | | |__ (_)___| | __    /\  /__\   \  | | | | '_ \ / _ \ '_ \| |  | | '_ \| / __| |/ /   /  \____ \  /  | |_| | |_) |  __/ | | | |/\| | | | | \__ \   <   \   \  /  \/    \___/| .__/ \___|_| |_|__/\__|_| |_|_|___/_|\_\    \___\/              |_|  Packages: Name: helloworld   * action: helloworld     bindings:  Triggers:   Rules  Do you really want to deploy this? (y/N): y Deploying pacakge helloworld ... Done! Deploying action helloworld/helloworld ... Done!  Deployment completed successfully.

Шаг пятый

Проверяем работоспособность:

# wsk action invoke --blocking --result helloworld/helloworld {     "payload": "Hello World" }

Шаг шестой

Радуемся!

Развертывание: функция, условие и правило

Давайте посмотрим на дополнительные вещи, необходимые при автоматизации:

Передача параметров в функцию

Модифицируем код:

function main(params) {   return {payload:  'Hello, ' + params.name + ' from ' + params.place}; }

Шаг первый

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

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!

Можно указать значения параметров в файле манифеста и пропустить создание файла для развертывания:

packages:     helloworld:         actions:             helloworld:                 location: src/hello.js                 runtime: nodejs:6             inputs:                     name: Amy                     place: Paris             outputs:                     payload:                         type: string                         description: a simple greeting message, Hello World! 

Шаг второй

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

Выставляем значения по умолчанию, добавляя секцию «inputs», вложенную в функцию «helloworld»:

application:     name: SampleHelloWorld     namespace: _     packages:         helloworld:             actions:                 helloworld:                     inputs:                         name: Amy                         place: Paris

Проверяем, что структура каталогов не изменилась с прошлого раза.

Шаг третий

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

# ./wskdeploy -p ~/SampleHelloWorldApp/          ____      ___                   _    _ _     _     _         /\   \    / _ \ _ __   ___ _ __ | |  | | |__ (_)___| | __    /\  /__\   \  | | | | '_ \ / _ \ '_ \| |  | | '_ \| / __| |/ /   /  \____ \  /  | |_| | |_) |  __/ | | | |/\| | | | | \__ \   <   \   \  /  \/    \___/| .__/ \___|_| |_|__/\__|_| |_|_|___/_|\_\    \___\/              |_| Packages: Name: helloworld   * action: helloworld     bindings:         - name: name value: Amy         - name: place value: Paris Triggers:  Rules Do you really want to deploy this? (y/N): y Deploying pacakge helloworld ... Done! Deploying action helloworld/helloworld ... Done! Deployment completed successfully.

Шаг четвертый

Проверяем работоспособность:

wsk action invoke --blocking --result helloworld/helloworld {     "payload": "Hello, Amy from Paris" }

Переопределяем значения по-умолчанию, передавая значения с помощью параметра —param:

wsk action invoke --blocking --result helloworld/helloworld --param name Mark --param place Barcelona {     "payload": "Hello, Mark from Barcelona" }

Создание условия и правила связывания

Шаг первый

Добавляем две секции в манифест:

packages:     helloworld:         actions:             helloworld:                 location: src/helloworld.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:             locationUpdate:         rules:             helloworldOnLocationUpdate:                 action: helloworld                 trigger: locationUpdate

Шаг второй

Разворачиваем функцию, условие и правило связывания:

./wskdeploy -p ~/SampleHelloWorldApp/          ____      ___                   _    _ _     _     _         /\   \    / _ \ _ __   ___ _ __ | |  | | |__ (_)___| | __    /\  /__\   \  | | | | '_ \ / _ \ '_ \| |  | | '_ \| / __| |/ /   /  \____ \  /  | |_| | |_) |  __/ | | | |/\| | | | | \__ \   <   \   \  /  \/    \___/| .__/ \___|_| |_|__/\__|_| |_|_|___/_|\_\    \___\/              |_| Packages: Name: helloworld   * action: helloworld     bindings:         - name: name value: Amy         - name: place value: Paris Triggers: * trigger: locationUpdate     bindings:  Rules * rule: helloworldOnLocationUpdate     - trigger: locationUpdate     - action: helloworld Do you really want to deploy this? (y/N): y Deploying pacakge helloworld ... Done! Deploying action helloworld/helloworld ... Done! Deploying trigger locationUpdate ... Done! Deploying rule helloworldOnLocationUpdate ... Done! Deployment completed successfully.

Шаг третий

Проверяем работоспособность:

  • смотрим работающие функции:
    wsk activation poll Enter Ctrl-c to exit. Polling for activation logs
  • открываем еще один терминал и вводим команду для активации условного срабатывания:
    wsk trigger fire locationUpdate ok: triggered locationUpdate with id 4c3a8b1792d546a68ac58538c3f5d637
  • смотрим результаты в первом терминале:
    Activation: helloworld (d545c458f3d34d6fbf5c29173be3d29e) [] Activation: locationUpdate (4c3a8b1792d546a68ac58538c3f5d637) [] Activation: helloworldOnLocationUpdate (c099355c1f1f4d6d8d30f54e8dac2b84) []
  • определяем id условного срабатывания и проверяем результаты функции:
    wsk activation get d545c458f3d34d6fbf5c29173be3d29e ok: got activation d545c458f3d34d6fbf5c29173be3d29e { ... "activationId": "d545c458f3d34d6fbf5c29173be3d29e", "start": 1489444142544, "end": 1489444142598, "response": {     "status": "success",     "statusCode": 0,     "success": true,     "result": {         "payload": "Hello, Amy from Paris"     } }, ... }

Анонс

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


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


Комментарии

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

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