IBM OpenWhisk是一个简单的开源服务,可以响应传入的REST请求而按需快速启动和运行代码花絮。 查看IBM Bluemix上的OpenWhisk beta产品 。 在本教程中,我首先向您展示如何手动发布OpenWhisk命令。 然后,我向您展示如何使用我创建的Python库来使发出这些命令更加容易。
我很想尝试OpenWhisk,因为我听说它有两个很大的优点:设置非常容易,而且计费比在长寿机器上运行应用程序便宜。 在弄清楚如何使用OpenWhisk之后 ,我创建并发布了一个微型Python库openWhiskLib.py来简化这些任务(如下图左侧所示):
- 在OpenWhisk中配置JavaScript操作
- 调用动作
在 Bluemix上 尝试 OpenWhisk在GitHub 上 获取openWhiskLib.py
本教程需要什么
- 一个Bluemix帐户。 (注册您的免费试用帐户,或者如果已经拥有一个帐户,则登录到Bluemix 。)
- 使用Ubuntu Linux 14.04的VM。 (本教程中的步骤引用的是Ubuntu Linux计算机,但其他操作系统应该相似。)
设置一个OpenWhisk客户端计算机
使用Ubuntu Linux 14.04引导VM,以root用户身份登录,并应用其最新更新:
apt-get -y update ; apt-get -y dist-upgrade
现在,您可以使用此计算机将“ Hello world”应用程序上传到OpenWhisk,如下面的步骤3所述。
安装,配置和测试OpenWhisk客户端
- 登录到Bluemix并访问OpenWhisk CLI 。 现在,在屏幕上,您将看到三个步骤,并为您的Bluemix帐户定制了参数。
- 在您的OpenWhisk客户端计算机上执行三个步骤:
- 步骤1:下载OpenWhisk CLI,解压缩文件,然后将可执行文件
wsk
添加到您的路径。 - 步骤2:
wsk property set...
该命令将您的Bluemix凭据写入OpenWhisk客户机上的隐藏文件中。 对我来说,它在我的主目录中创建了这个隐藏文件:.wskprops
提示:保存此隐藏文件。 我们将在本教程后面的部分中为Python库的环境变量使用一些参数。
- 步骤3:
wsk action invoke...
该命令与Bluemix上的OpenWhisk服务进行通信,以确认您的凭证有效。 几秒钟后,wsk响应一个包含单词“ hello”的JSON结构。 成功!
为了娱乐,将消息字符串从“ hello”更改为其他内容并重复。 响应中应包含您的新字符串。
- 步骤1:下载OpenWhisk CLI,解压缩文件,然后将可执行文件
提示:详细模式
如果将-v
参数添加到任何wsk
命令,它将显示它发送到服务器的HTTP请求。 我发现此功能对于调试和发现发出REST请求所需的参数非常有用。 (更多详细信息在此Stack Overflow交换中 。)
将操作文件上传到Bluemix上的OpenWhisk服务
Bluemix上的OpenWhisk教程中提供了一个用于操作文件的简单JavaScript代码段。
- 发出教程中显示的
wsk
命令以创建,使用和删除操作文件。 - 使用
-v
verbose选项重复命令。 这显示了REST请求和从命令行发出命令所需的参数。这是一个例子:
在您的OpenWhisk客户端计算机上创建一个名为“ hello.js”的文件:
function main() { return {payload: 'hello'}; }
- 现在发出
wsk
命令来上传hello.js。 这是我的命令(对用户名和凭据进行了模糊处理以保护隐私):wsk -v action create hello hello.js {'apihost': 'openwhisk.ng.bluemix.net', 'namespace': 'user@example.com_dev', 'clibuild': '2016- 05-24T09:54:44-05:00', 'apiversion': 'v1'} ======== REQUEST: PUT https://openwhisk.ng.bluemix.net/api/v1/namespaces/user %40example.com_dev/actions/hello Headers sent: { "Authorization": "Basic S3sjGo6dKeKSIIRENS135xOsT3jEs7IiS3sjGo6dKeKSIIRENS135xOsT3jEs7Ii", "Content-Type": "application/json" } Body sent: {"exec": {"kind": "nodejs", "code": "function main() {\n return {payload: 'hello'};\n}\n"}}
笔记:
- 请求标头中的
Auth
字符串与.wskprops中存储的字符串不同。 (我相信它是基于64位编码的。) - hello.js的内容以一个长字符串形式包含在请求主体中的可变
code
中。
测试动作
创建动作后,通过发出wsk action invoke
命令对其进行测试:
wsk -v action invoke /whisk.system/samples/echo -p message hello --blocking --result
{'apihost': 'openwhisk.ng.bluemix.net', 'namespace': 'user@example.com_dev', 'clibuild': '2016-
05-24T09:54:44-05:00', 'apiversion': 'v1'}
========
REQUEST:
POST
https://openwhisk.ng.bluemix.net/api/v1/namespaces/whisk.system/actions/samples/echo?
blocking=true&result=true
Headers sent:
{
"Authorization": "Basic
S3sjGo6dKeKSIIRENS135xOsT3jEs7IiS3sjGo6dKeKSIIRENS135xOsT3jEs7Ii",
"Content-Type": "application/json"
}
Body sent:
{"message": "hello"}
--------
RESPONSE:
Got response with code 200
Body received:
{
"message": "hello"
}
========
{
"message": "hello"
}
介绍openWhiskLib.py
既然您已经学会了手动发出所有命令,请尝试使用新的Python脚本简化发出命令的过程。
迄今为止,已经开发并测试了以下功能:
- createAction(文件名,操作)
- deleteAction(动作)
- invokeAction(动作)
- invokeEcho(消息)
- listActions()
- listNamespaces()
openWhiskLib项目在GitHub上公开可用。
要在计算机上使用openWhiskLib,请首先定义三个环境变量:
-
OPENWHISK_APIHOST
- 从文件.wskprops获取此值 OPENWHISK_NAMESPACE
- 从文件.wskprops获取此值 OPENWHISK_TOKEN
-
通过发出任何详细的wsk命令来获取此值,例如:
wsk -v action invoke /whisk.system/samples/echo -p message hello --blocking --result
例如,在您的Linux笔记本电脑上,您可以像我一样设置值(出于保密目的,我的个人数据被遮盖了):
export OPENWHISK_APIHOST="openwhisk.ng.bluemix.net"
export OPENWHISK_NAMESPACE="username@example.com_dev"
export
OPENWHISK_TOKEN="S3sjGo6dKeKSIIRENS135xOsT3jEs7IiS3sjGo6dKeKSIIRENS135xOsT3j
Es7Ii"
为了方便起见,您可以在bash脚本中定义值。 您可以在GitHub项目中复制和编辑此示例:bin / setenv.sh
使用openWhiskLib.py创建动作
要创建动作,请首先在计算机上创建一个文件,其中包含要上传和执行JavaScript代码的片段。 例如,您可以使用类似于上面列出的相同示例的代码:goodday.js:
function main() {
return {payload: 'good day'};
}
然后从您的Python解释器调用openWhiskLib函数createAction()
。 例如:
定义环境变量(带点):
. setenv.sh
调用Python
python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from openwhisklib import *
>>> createAction( 'goodday.js', 'goodday')
Issuing put request:
url=https://openwhisk.ng.bluemix.net/api/v1/namespaces/user@example.com_dev/actions/goodday
payload: {'exec': {'kind': 'nodejs', 'code': "function main() {\n return {payload: 'good day'};\n}\n"}}
headers={'content-type': 'application/json', 'Authorization': 'Basic
S3sjGo6dKeKSIIRENS135xOsT3jEs7IiS3sjGo6dKeKSIIRENS135xOsT3jEs7Ii'}
Response status_code=200
{
"name": "goodday",
"publish": false,
"annotations": [],
"version": "0.0.1",
"exec": {
"kind": "nodejs",
"code": "function main() {\n return {payload: 'good day'};\n}\n"
},
"parameters": [],
limits": {
"timeout": 60000,
"memory": 256
},
"namespace": "user@example.com_dev"
}
<Response [200]>
>>>
使用openWhiskLib.py调用动作
最后,使用openWhiskLib.py从Bluemix的OpenWhisk调用代码片段:
>>>
>>> invokeAction('goodday')
Issuing request:
url=https://openwhisk.ng.bluemix.net/api/v1/namespaces/user@example.com_dev/actions/goodday?
blocking=true&result=false payload={} headers={'content-type': 'application/json', 'Authorization':
'Basic S3sjGo6dKeKSIIRENS135xOsT3jEs7IiS3sjGo6dKeKSIIRENS135xOsT3jEs7Ii'}
Response status_code=200
{
"name": "goodday",
"subject": "user@example.com",
"activationId": "f81398a389734d018f4c92fbf59e2dbe",
"publish": false,
"annotations": [],
"version": "0.0.1",
"response": {
"result": {
"payload": "good day"
},
"success": true,
"status": "success"
},
"end": 1466083636776,
"logs": [],
"start": 1466083636724,
"namespace": "user@example.com"
}
<Response [200]>
>>>
>>>
测试用例和示例代码
GitHub上的openWhiskLib项目中的简单测试用例(tests / openwhisklib.tests.py)演示了openWhiskLib.py中的每个函数,显示了输入和输出。 您可以使用它们来验证OpenWhisk是否可以使用您的凭据。
结论
本教程为您提供了OpenWhisk的高级概述,以及在IBM Bluemix上载和运行您自己的代码的示例。 您还看到了一个新的Python库,该库简化了将应用程序访问和部署到OpenWhisk的过程。 我希望您可以使用openWhiskLib.py。 接受它,对其进行增强,对其进行变形并将其制成自己的。
翻译自: https://www.ibm.com/developerworks/cloud/library/cl-python-openwhisk-bluemix-trs/index.html