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