目次


IBM OpenWhisk で簡単にアクションをプロビジョニングして起動するにはどのようにするのか

このサーバーレス・コンピューティング・プラットフォームを簡単に使いこなせるようにする小さな新しい Python ライブラリー、openWhiskLib.py の紹介

Comments

IBM OpenWhisk は、着信 REST リクエストに応答して、コードのさまざまな部分をオンデマンドで迅速に起動して実行する、シンプルなオープンソース・サービスです。このリンク先のページで、IBM Bluemix 上に提供されているベータ版 OpenWhisk について説明してあります。このチュートリアルでは、OpenWhisk コマンドを手作業で発行するにはどのようにするのかを説明してから、OpenWhisk コマンドをさらに簡単に発行できるようにするために私が作成した Python ライブラリーの使用方法を説明します。

私が進んで OpenWhisk を試してみたかったわけは、このプラットフォームのプロビジョニングは実に簡単であり、長時間稼働するマシン上でアプリを実行するよりも費用を抑えられるという大きな 2 つの利点を耳にしたからです。私は OpenWhisk をどのように使うかを理解した後、以下のタスク (下の図の左側に示されています) を単純化する openWhiskLib.py という小さな Python ライブラリーを作成して公開しました。

  • OpenWhisk 内での JavaScript アクションのプロビジョニング
  • アクションの起動

Bluemix 上の OpenWhisk を試すGitHub から openWhiskLib.py を入手する

OpenWhisk の 2 つのアクションを示す図
OpenWhisk の 2 つのアクションを示す図

このチュートリアルに従うために必要なもの

  • Bluemix アカウント (無料のトライアル・アカウントを登録するか、アカウントを登録済みの場合は、そのアカウントを使用して Bluemix にログインします)。
  • Ubuntu Linux 14.04 を稼働する VM (このチュートリアルの手順では Ubuntu Linux マシンを参照していますが、他のオペレーティング・システムを使用する場合でも手順は同様です)。
1

OpenWhisk クライアント・マシンをセットアップする

Ubuntu Linux 14.04 を稼働する VM を起動し、root としてサインインした後、最新の更新を適用します。

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

これで、このマシンを使用して、ステップ 3 の説明に従って「Hello world」アプリを OpenWhisk にアップロードできるようになりました。

2

OpenWhisk クライアントをインストールして構成し、テストする

  1. Bluemix にサインインして、OpenWhisk CLI にアクセスします。画面上に、3 つのステップと、使用中の Bluemix アカウント用にカスタマイズされたパラメーターが表示されます。
  2. 画面上に表示された 3 つのステップを OpenWhisk クライアント・マシン上で実行します。
    • ステップ 1: OpenWhisk CLI をダウンロードしてファイルを解凍し、実行可能 wsk をパスに追加します。
    • ステップ 2: コマンド wsk property set... を実行します。

      このコマンドにより、OpenWhisk クライアント・マシン上の隠しファイルに Bluemix 資格情報が書き込まれます。私のマシンの場合は、.wskprops という名前の隠しファイルがホーム・ディレクトリー内に作成されました。

      ヒント: この隠しファイルを保存してください。このチュートリアルの後半で、Python ライブラリーの環境変数に、このファイル内のパラメーターの一部を使用します。

    • ステップ 3: コマンド wsk action invoke... を実行します。

      このコマンドは、Bluemix の OpenWhisk サービスと通信し、資格情報が有効であるかどうかを確認します。数秒後に、wsk が「hello」という単語を格納した JSON 構造体によって応答を返せば成功です。

      試しに、メッセージ文字列を「hello」以外のものに変えて手順を繰り返してみてください。応答には新しい文字列が含まれているはずです。

ヒント: 詳細モード

どの wsk コマンドの場合でも -v パラメーターを追加することで、サーバーに送信された HTTP リクエストを確認できます。デバッグの際や、REST リクエストを発行するために必要なパラメーターを調べる際は、この機能が非常に役立つと思います (詳細については、このリンク先の Stack Overflow コミュニティーのページを参照してください)。

3

アクション・ファイルを Bluemix 上の OpenWhisk サービスにアップロードする

このリンク先の Bluemix 上の OpenWhisk チュートリアルで、アクション・ファイルの単純な JavaScript スニペットを参照できます。

  1. チュートリアルに記載されている wsk コマンドを発行して、アクション・ファイルを作成、使用、削除します。
  2. -v 詳細オプションを追加してコマンドを繰り返します。これにより、コマンド・ラインからコマンドを発行する際に必要な REST リクエストとパラメーターが表示されます。

    以下に、一例を示します。

    OpenWhisk クライアント・マシン上で「hello.js」という名前のファイルを作成します。

    function main() {
    return {payload: 'hello'};
    }
  3. hello.js をアップロードするための wsk コマンドを発行します。以下に、私が使用したコマンドを示します (ユーザー名と資格情報はプライバシーのために難読化しています)。
    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 内に保管されている文字列とは異なります (base64 を使用してエンコードされているはずです)。
  • hello.js の内容は 1 行の長い文字列として、リクエスト本体の 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 にアップロードして実行するためのサンプルを記載しました。また、アプリに簡単にアクセスして OpenWhisk にデプロイできるようにする、新しい Python ライブラリーも紹介しました。この openWhiskLib.py を利用して、独自にライブラリーを拡張し、役立ててください。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Cloud computing, Web development
ArticleID=1041315
ArticleTitle=IBM OpenWhisk で簡単にアクションをプロビジョニングして起動するにはどのようにするのか
publish-date=01122017