Блог Слёрм

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


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

Шаг пятый

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

# 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

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

Шаг третий

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


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

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

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

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

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

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


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


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

Шаг второй


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


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

Шаг третий

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

  • смотрим работающие функции:
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, часть 2
Бессерверные вычисления на основе OpenWhisk, часть 3
Бессерверные вычисления на основе OpenWhisk, часть 4
DevOps