0 added
0 removed
Original
2026-01-01
Modified
2026-02-19
1
Это цикл переводных заметок автора <a>Priti Desai</a>. Поскольку сами заметки довольно короткие, то в одной публикации будет собрано сразу несколько. Будут рассмотрены детали развертывания приложений для OpenWhisk с примерами, а в конце цикла - приведена архитектура и код приложения, использующего бессерверные вычисления на основе OpenWhisk.<h2>Автоматизируем развертывание приложения для OpenWhisk</h2>
1
Это цикл переводных заметок автора <a>Priti Desai</a>. Поскольку сами заметки довольно короткие, то в одной публикации будет собрано сразу несколько. Будут рассмотрены детали развертывания приложений для OpenWhisk с примерами, а в конце цикла - приведена архитектура и код приложения, использующего бессерверные вычисления на основе OpenWhisk.<h2>Автоматизируем развертывание приложения для OpenWhisk</h2>
2
Вы уже поставили <a>OpenWhisk</a> и проверили <a>простую функцию hello.js</a> в работе?<blockquote><em>cat hello.js</em></blockquote><blockquote><em>function main() {</em></blockquote><blockquote><em> return {payload: 'Hello World'};</em></blockquote><blockquote><em>}</em></blockquote>А хотите автоматизировать развертывание этой простейшей функции? Если да, продолжайте читать эту заметку. Я покажу, как использовать <a>openwhisk-wskdeploy</a> для автоматизации развертывания простейшей функции.<h2>Необходимые компоненты</h2>
2
Вы уже поставили <a>OpenWhisk</a> и проверили <a>простую функцию hello.js</a> в работе?<blockquote><em>cat hello.js</em></blockquote><blockquote><em>function main() {</em></blockquote><blockquote><em> return {payload: 'Hello World'};</em></blockquote><blockquote><em>}</em></blockquote>А хотите автоматизировать развертывание этой простейшей функции? Если да, продолжайте читать эту заметку. Я покажу, как использовать <a>openwhisk-wskdeploy</a> для автоматизации развертывания простейшей функции.<h2>Необходимые компоненты</h2>
3
<ul><li><a>OpenWhisk CLI</a></li>
3
<ul><li><a>OpenWhisk CLI</a></li>
4
<li><a>Whisk Deploy (wskdeploy)</a></li>
4
<li><a>Whisk Deploy (wskdeploy)</a></li>
5
</ul><h3>Шаг первый</h3>
5
</ul><h3>Шаг первый</h3>
6
Создаем файл-манифест (manifest.yaml) с таким содержимым:<blockquote><em>packages:</em></blockquote><blockquote><em> helloworld:</em></blockquote><blockquote><em> actions:</em></blockquote><blockquote><em> helloworld:</em></blockquote><blockquote><em> location: src/hello.js</em></blockquote><blockquote><em> runtime: nodejs:6</em></blockquote><blockquote><em> outputs:</em></blockquote><blockquote><em> payload:</em></blockquote><blockquote><em> type: string</em></blockquote><blockquote><em> description: a simple greeting message, Hello World.</em></blockquote><h3>Шаг второй</h3>
6
Создаем файл-манифест (manifest.yaml) с таким содержимым:<blockquote><em>packages:</em></blockquote><blockquote><em> helloworld:</em></blockquote><blockquote><em> actions:</em></blockquote><blockquote><em> helloworld:</em></blockquote><blockquote><em> location: src/hello.js</em></blockquote><blockquote><em> runtime: nodejs:6</em></blockquote><blockquote><em> outputs:</em></blockquote><blockquote><em> payload:</em></blockquote><blockquote><em> type: string</em></blockquote><blockquote><em> description: a simple greeting message, Hello World.</em></blockquote><h3>Шаг второй</h3>
7
Создаем файл для развертывания (deployment.yaml):<blockquote><em>application:</em></blockquote><blockquote><em> name: SampleHelloWorld</em></blockquote><blockquote><em> namespace: _</em></blockquote><blockquote><em> packages:</em></blockquote><blockquote><em> helloworld:</em></blockquote><blockquote><em> actions:</em></blockquote><blockquote><em> helloworld:</em></blockquote>На самом деле этот файл для поставки helloworld не обязателен, достаточно манифеста из первого шага.<h3>Шаг третий</h3>
7
Создаем файл для развертывания (deployment.yaml):<blockquote><em>application:</em></blockquote><blockquote><em> name: SampleHelloWorld</em></blockquote><blockquote><em> namespace: _</em></blockquote><blockquote><em> packages:</em></blockquote><blockquote><em> helloworld:</em></blockquote><blockquote><em> actions:</em></blockquote><blockquote><em> helloworld:</em></blockquote>На самом деле этот файл для поставки helloworld не обязателен, достаточно манифеста из первого шага.<h3>Шаг третий</h3>
8
Создаем структуру каталогов. Выглядит она примерно так:<blockquote><em># ls -1R ~/SampleHelloWorldApp/</em></blockquote><blockquote><em>deployment.yaml</em></blockquote><blockquote><em>manifest.yaml</em></blockquote><blockquote><em>src/</em></blockquote><blockquote><em>./src:</em></blockquote><blockquote><em>hello.js</em></blockquote><h3>Шаг четвертый</h3>
8
Создаем структуру каталогов. Выглядит она примерно так:<blockquote><em># ls -1R ~/SampleHelloWorldApp/</em></blockquote><blockquote><em>deployment.yaml</em></blockquote><blockquote><em>manifest.yaml</em></blockquote><blockquote><em>src/</em></blockquote><blockquote><em>./src:</em></blockquote><blockquote><em>hello.js</em></blockquote><h3>Шаг четвертый</h3>
9
Выполняем развертывание функции HelloWorld:<a>Скопировать код</a><h3>Шаг пятый</h3>
9
Выполняем развертывание функции HelloWorld:<a>Скопировать код</a><h3>Шаг пятый</h3>
10
Проверяем работоспособность:<blockquote><em># wsk action invoke --blocking --result helloworld/helloworld</em></blockquote><blockquote><em>{</em></blockquote><blockquote><em> "payload": "Hello World"</em></blockquote><blockquote><em>}</em></blockquote><h3>Шаг шестой</h3>
10
Проверяем работоспособность:<blockquote><em># wsk action invoke --blocking --result helloworld/helloworld</em></blockquote><blockquote><em>{</em></blockquote><blockquote><em> "payload": "Hello World"</em></blockquote><blockquote><em>}</em></blockquote><h3>Шаг шестой</h3>
11
Радуемся!<h2>Развертывание: функция, условие и правило</h2>
11
Радуемся!<h2>Развертывание: функция, условие и правило</h2>
12
Давайте посмотрим на дополнительные вещи, необходимые при автоматизации:<ul><li><a>передача параметров функции</a></li>
12
Давайте посмотрим на дополнительные вещи, необходимые при автоматизации:<ul><li><a>передача параметров функции</a></li>
13
<li><a>установка значений по умолчанию для функции</a></li>
13
<li><a>установка значений по умолчанию для функции</a></li>
14
<li><a>задание условия для срабатывания</a></li>
14
<li><a>задание условия для срабатывания</a></li>
15
<li><a>создание правила для связывания условия и функции</a></li>
15
<li><a>создание правила для связывания условия и функции</a></li>
16
</ul><h2>Передача параметров в функцию</h2>
16
</ul><h2>Передача параметров в функцию</h2>
17
Модифицируем код:<blockquote><em>function main(params) {</em></blockquote><blockquote><em> return {payload: 'Hello, ' + params.name + ' from ' + params.place};</em></blockquote><blockquote><em>}</em></blockquote><h3>Шаг первый</h3>
17
Модифицируем код:<blockquote><em>function main(params) {</em></blockquote><blockquote><em> return {payload: 'Hello, ' + params.name + ' from ' + params.place};</em></blockquote><blockquote><em>}</em></blockquote><h3>Шаг первый</h3>
18
Создаём файл-манифест:<blockquote><em>packages:</em></blockquote><blockquote><em> helloworld:</em></blockquote><blockquote><em> actions:</em></blockquote><blockquote><em> helloworld:</em></blockquote><blockquote><em> location: src/hello.js</em></blockquote><blockquote><em> runtime: nodejs:6</em></blockquote><blockquote><em> inputs: </em></blockquote><blockquote><em> name:</em></blockquote><blockquote><em> type: string</em></blockquote><blockquote><em> description: name of a person</em></blockquote><blockquote><em> place:</em></blockquote><blockquote><em> type: string</em></blockquote><blockquote><em> description: location of a person</em></blockquote><blockquote><em> outputs:</em></blockquote><blockquote><em> payload:</em></blockquote><blockquote><em> type: string</em></blockquote><blockquote><em> description: a simple greeting message, Hello World!</em></blockquote>Можно указать значения параметров в файле манифеста и пропустить создание файла для развертывания:<blockquote><em>packages:</em></blockquote><blockquote><em> helloworld:</em></blockquote><blockquote><em> actions:</em></blockquote><blockquote><em> helloworld:</em></blockquote><blockquote><em> location: src/hello.js</em></blockquote><blockquote><em> runtime: nodejs:6</em></blockquote><blockquote><em> inputs: </em></blockquote><blockquote><em> name: </em><em>Amy</em></blockquote><blockquote><em> place: Paris</em></blockquote><blockquote><em> outputs:</em></blockquote><blockquote><em> payload:</em></blockquote><blockquote><em> type: string</em></blockquote><blockquote><em> description: a simple greeting message, Hello World!</em></blockquote><h3>Шаг второй</h3>
18
Создаём файл-манифест:<blockquote><em>packages:</em></blockquote><blockquote><em> helloworld:</em></blockquote><blockquote><em> actions:</em></blockquote><blockquote><em> helloworld:</em></blockquote><blockquote><em> location: src/hello.js</em></blockquote><blockquote><em> runtime: nodejs:6</em></blockquote><blockquote><em> inputs: </em></blockquote><blockquote><em> name:</em></blockquote><blockquote><em> type: string</em></blockquote><blockquote><em> description: name of a person</em></blockquote><blockquote><em> place:</em></blockquote><blockquote><em> type: string</em></blockquote><blockquote><em> description: location of a person</em></blockquote><blockquote><em> outputs:</em></blockquote><blockquote><em> payload:</em></blockquote><blockquote><em> type: string</em></blockquote><blockquote><em> description: a simple greeting message, Hello World!</em></blockquote>Можно указать значения параметров в файле манифеста и пропустить создание файла для развертывания:<blockquote><em>packages:</em></blockquote><blockquote><em> helloworld:</em></blockquote><blockquote><em> actions:</em></blockquote><blockquote><em> helloworld:</em></blockquote><blockquote><em> location: src/hello.js</em></blockquote><blockquote><em> runtime: nodejs:6</em></blockquote><blockquote><em> inputs: </em></blockquote><blockquote><em> name: </em><em>Amy</em></blockquote><blockquote><em> place: Paris</em></blockquote><blockquote><em> outputs:</em></blockquote><blockquote><em> payload:</em></blockquote><blockquote><em> type: string</em></blockquote><blockquote><em> description: a simple greeting message, Hello World!</em></blockquote><h3>Шаг второй</h3>
19
Создаем файл для развертывания:Выставляем значения по умолчанию, добавляя секцию "inputs", вложенную в функцию "helloworld":<blockquote><em>application:</em></blockquote><blockquote><em> name: SampleHelloWorld</em></blockquote><blockquote><em> namespace: _</em></blockquote><blockquote><em> packages:</em></blockquote><blockquote><em> helloworld:</em></blockquote><blockquote><em> actions:</em></blockquote><blockquote><em> helloworld:</em></blockquote><blockquote><em> inputs:</em></blockquote><blockquote><em> name: Amy</em></blockquote><blockquote><em> place: Paris</em></blockquote>Проверяем, что структура каталогов не изменилась с прошлого раза.<h3>Шаг третий</h3>
19
Создаем файл для развертывания:Выставляем значения по умолчанию, добавляя секцию "inputs", вложенную в функцию "helloworld":<blockquote><em>application:</em></blockquote><blockquote><em> name: SampleHelloWorld</em></blockquote><blockquote><em> namespace: _</em></blockquote><blockquote><em> packages:</em></blockquote><blockquote><em> helloworld:</em></blockquote><blockquote><em> actions:</em></blockquote><blockquote><em> helloworld:</em></blockquote><blockquote><em> inputs:</em></blockquote><blockquote><em> name: Amy</em></blockquote><blockquote><em> place: Paris</em></blockquote>Проверяем, что структура каталогов не изменилась с прошлого раза.<h3>Шаг третий</h3>
20
Разворачиваем функцию:<a>Скопировать код</a><h3>Шаг четвертый</h3>
20
Разворачиваем функцию:<a>Скопировать код</a><h3>Шаг четвертый</h3>
21
Проверяем работоспособность:<blockquote><em>wsk action invoke --blocking --result helloworld/helloworld</em></blockquote><blockquote><em>{</em></blockquote><blockquote><em> "payload": "Hello, Amy from Paris"</em></blockquote><blockquote><em>}</em></blockquote>Переопределяем значения по-умолчанию, передавая значения<a>с помощью параметра --param.</a><h2>Создание условия и правила связывания: шаг первый</h2>
21
Проверяем работоспособность:<blockquote><em>wsk action invoke --blocking --result helloworld/helloworld</em></blockquote><blockquote><em>{</em></blockquote><blockquote><em> "payload": "Hello, Amy from Paris"</em></blockquote><blockquote><em>}</em></blockquote>Переопределяем значения по-умолчанию, передавая значения<a>с помощью параметра --param.</a><h2>Создание условия и правила связывания: шаг первый</h2>
22
Добавляем две секции в манифест:<a>Скопировать код</a><h3>Шаг второй</h3>
22
Добавляем две секции в манифест:<a>Скопировать код</a><h3>Шаг второй</h3>
23
Разворачиваем функцию, условие и правило связывания:<a>Скопировать код</a><h3>Шаг третий</h3>
23
Разворачиваем функцию, условие и правило связывания:<a>Скопировать код</a><h3>Шаг третий</h3>
24
Проверяем работоспособность:<ul><li>смотрим работающие функции:</li>
24
Проверяем работоспособность:<ul><li>смотрим работающие функции:</li>
25
</ul><blockquote><em>wsk activation poll</em></blockquote><blockquote><em>Enter Ctrl-c to exit.</em></blockquote><blockquote><em>Polling for activation logs</em></blockquote><ul><li>открываем еще один терминал и вводим команду для активации условного срабатывания:</li>
25
</ul><blockquote><em>wsk activation poll</em></blockquote><blockquote><em>Enter Ctrl-c to exit.</em></blockquote><blockquote><em>Polling for activation logs</em></blockquote><ul><li>открываем еще один терминал и вводим команду для активации условного срабатывания:</li>
26
</ul><blockquote><em>wsk trigger fire locationUpdate</em></blockquote><blockquote><em>ok: triggered locationUpdate with id 4c3a8b1792d546a68ac58538c3f5d637</em></blockquote><ul><li><em>смотрим результаты в первом терминале:</em></li>
26
</ul><blockquote><em>wsk trigger fire locationUpdate</em></blockquote><blockquote><em>ok: triggered locationUpdate with id 4c3a8b1792d546a68ac58538c3f5d637</em></blockquote><ul><li><em>смотрим результаты в первом терминале:</em></li>
27
</ul><blockquote><em>Activation: helloworld (d545c458f3d34d6fbf5c29173be3d29e)</em></blockquote><blockquote><em>[]</em></blockquote><blockquote><em>Activation: locationUpdate (4c3a8b1792d546a68ac58538c3f5d637)</em></blockquote><blockquote><em>[]</em></blockquote><blockquote><em>Activation: helloworldOnLocationUpdate (c099355c1f1f4d6d8d30f54e8dac2b84)</em></blockquote><blockquote><em>[]</em></blockquote><ul><li>определяем id условного срабатывания и проверяем результаты функции:</li>
27
</ul><blockquote><em>Activation: helloworld (d545c458f3d34d6fbf5c29173be3d29e)</em></blockquote><blockquote><em>[]</em></blockquote><blockquote><em>Activation: locationUpdate (4c3a8b1792d546a68ac58538c3f5d637)</em></blockquote><blockquote><em>[]</em></blockquote><blockquote><em>Activation: helloworldOnLocationUpdate (c099355c1f1f4d6d8d30f54e8dac2b84)</em></blockquote><blockquote><em>[]</em></blockquote><ul><li>определяем id условного срабатывания и проверяем результаты функции:</li>
28
</ul><blockquote><em>wsk activation get d545c458f3d34d6fbf5c29173be3d29e</em></blockquote><blockquote><em>ok: got activation d545c458f3d34d6fbf5c29173be3d29e</em></blockquote><blockquote><em>{</em></blockquote><blockquote><em>...</em></blockquote><blockquote><em>"activationId": "d545c458f3d34d6fbf5c29173be3d29e",</em></blockquote><blockquote><em>"start": 1489444142544,</em></blockquote><blockquote><em>"end": 1489444142598,</em></blockquote><blockquote><em>"response": {</em></blockquote><blockquote><em> "status": "success",</em></blockquote><blockquote><em> "statusCode": 0,</em></blockquote><blockquote><em> "success": true,</em></blockquote><blockquote><em> "result": {</em></blockquote><blockquote><em> "payload": "Hello, Amy from Paris"</em></blockquote><blockquote><em> }</em></blockquote><blockquote><em>},</em></blockquote><blockquote><em>...</em></blockquote><blockquote><em>}</em></blockquote><h3>Ещё по теме</h3>
28
</ul><blockquote><em>wsk activation get d545c458f3d34d6fbf5c29173be3d29e</em></blockquote><blockquote><em>ok: got activation d545c458f3d34d6fbf5c29173be3d29e</em></blockquote><blockquote><em>{</em></blockquote><blockquote><em>...</em></blockquote><blockquote><em>"activationId": "d545c458f3d34d6fbf5c29173be3d29e",</em></blockquote><blockquote><em>"start": 1489444142544,</em></blockquote><blockquote><em>"end": 1489444142598,</em></blockquote><blockquote><em>"response": {</em></blockquote><blockquote><em> "status": "success",</em></blockquote><blockquote><em> "statusCode": 0,</em></blockquote><blockquote><em> "success": true,</em></blockquote><blockquote><em> "result": {</em></blockquote><blockquote><em> "payload": "Hello, Amy from Paris"</em></blockquote><blockquote><em> }</em></blockquote><blockquote><em>},</em></blockquote><blockquote><em>...</em></blockquote><blockquote><em>}</em></blockquote><h3>Ещё по теме</h3>
29
<a>Бессерверные вычисления на основе OpenWhisk, часть 2</a><a>Бессерверные вычисления на основе OpenWhisk, часть 3</a><a>Бессерверные вычисления на основе OpenWhisk, часть 4</a>
29
<a>Бессерверные вычисления на основе OpenWhisk, часть 2</a><a>Бессерверные вычисления на основе OpenWhisk, часть 3</a><a>Бессерверные вычисления на основе OpenWhisk, часть 4</a>