内容


一种在 IBM OpenWhisk 中配置和调用操作的简单方法

介绍 openWhiskLib.py,一个小巧的新 Python 库,用于简化这个无服务器计算平台的使用

Comments

IBM OpenWhisk 是一种简单的开源服务,它可以根据需要快速启动和运行代码片段,以响应传入的 REST 请求。查阅 IBM Bluemix 上的 OpenWhisk 公测产品。在本教程中,我首先将介绍如何手动发出 OpenWhisk 命令。然后介绍如何使用我创建的 Python 库让命令执行变得更简单。

我非常渴望试用 OpenWhisk,因为我听说它具有两大优势:配置很容易,费用比在长期运行的机器上运行应用程序还要低。在了解了 如何使用 OpenWhisk 后,我创建并发布了一个微型的 Python 库 openWhiskLib.py,以简化这些任务(如下图左侧所示):

  • 在 OpenWhisk 中准备一个 JavaScript 操作
  • 调用操作

在 Bluemix 上试用 OpenWhisk在 GitHub 上获取 openWhiskLib.py

两个 OpenWhisk 操作的示意图
两个 OpenWhisk 操作的示意图

完成本教程要做的准备工作

  • 一个 Bluemix 帐户。(注册您的 免费试用帐户,如果您已经有一个帐户,请 登录到 Bluemix。)
  • 一个带 Ubuntu Linux 14.04 的虚拟机(本教程中的步骤针对的是一台 Ubuntu Linux 机器,但其他操作系统的步骤应该与此类似。)
1

设置 OpenWhisk 客户端机器

启动一个带 Ubuntu Linux 14.04 的虚拟机,以根用户身份进行登录,并应用最新的更新:

apt-get -y update ; apt-get -y dist-upgrade

您现在可以使用此机器将 “Hello world” 应用程序上传到 OpenWhisk,如下面的第 3 步所示。

2

安装、配置和测试 OpenWhisk 客户端

  1. 注册 Bluemix 并访问 OpenWhisk CLI。在屏幕上,您现在会看到 3 个步骤,以及为您的 Bluemix 帐户自定义的参数。
  2. 在您的 OpenWhisk 客户端机器上执行以下 3 步:
    • 第 1 步:下载 OpenWhisk CLI,解压该文件,并将可执行的 wsk 添加到您的路径。
    • 第 2 步:运行 wsk property set...

      此命令会将您的 Bluemix 凭证写入您的 OpenWhisk 客户端机器上一个隐藏的文件中。对我而言,它在我的主目录中创建了这个隐藏文件:.wskprops

      提示:保存这个隐藏文件。我们将为 Python 库的环境变量使用本教程后面的一些参数。

    • 第 3 步:wsk action invoke...

      此命令与 Bluemix 上的 OpenWhisk 服务通信,确认您的凭证有效。几秒后,wsk 会发回一个包含单词 ‘hello’ 的 JSON 结构作为响应。大功告成!

      为了增加点趣味性,可以将消息字符串从 ‘hello’ 更改为其他文字并重复该操作。响应应包含您的新字符串。

提示:Verbose Mode

如果您将 -v 参数添加到 wsk 命令,则会显示发送到服务器的 HTTP 请求。我发现此功能对调试和发现发出 REST 请求需要的参数非常有用。(堆栈溢出交换 介绍了更多细节。)

3

将此操作文件上传到 Bluemix 上的 OpenWhisk 服务

Bluemix 上的 OpenWhisk 教程 中提供了一个操作文件的简单 JavaScript 代码段。

  1. 发出教程中所示的 wsk 命令,以创建、使用和删除操作文件。
  2. 使用 -v 选项重复执行这些命令。这会显示从命令行发出这些命令所需的 REST 请求和参数。

    以下是一个示例:

    在您的 OpenWhisk 客户端机器上创建一个名为 ‘hello.js’ 的文件:

    function main() {
    return {payload: 'hello'};
    }
  3. 现在发出 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 中存储的字符串。(我认为它采用的是 base 64 编码。)
  • hello.js 的内容以长字符串形式包含在请求主体中的 code 变量中。
4

测试操作

创建操作后,发出 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(filename, action)
  • deleteAction(action)
  • invokeAction(action)
  • invokeEcho(message)
  • listActions()
  • listNamespaces()

openWhiskLib 项目 已在 GitHub 上公开。

要在您的机器上使用 openWhiskLib,首先定义 3 个环境变量:

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

5

使用 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]>
>>>
6

使用 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。下载获取 openWhiskLib.py,增强它,修改它,让它成为您自己的工具。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Cloud computing, Web development, Open source
ArticleID=1041485
ArticleTitle=一种在 IBM OpenWhisk 中配置和调用操作的简单方法
publish-date=12272016