Check! OpenWhisk on Microsoft Azure !

  • 8
    Like
  • 0
    Comment

こんにちは、 @dz_ こと大平かづみです。

Prologue - はじめに

OpenWhisk Advent Calendar 11日目の記事です。 まだまだ枠空いているので、ご参加お待ちしています!

さて、 Advent Calendar ネタを探していると、タイムリーにもマルチクラウドで OpenWhisk をデプロイできるよ!という記事を見つけたので、便乗して OpenWhisk on Azure をやってみます!ヾ(・ω・oU三Uo・ω・)ノ゙

なお、上記のうち、上段の記事はいくつか誤りがあったので、下段の README_DISTRIBUTED.md も参考にするとよいです。また、今回は Azure に構築していますが、単なる Ubuntu インスタンスなので、AWS やほかの環境でもほぼ同等の手順となります。和訳記事としてご参考になれば幸いです!

作業環境

用途 台数 説明
ブートストラップ用 1 bootstrapper machine. セットアップのため、稼働用インスタンスにSSH接続できるマシン。上記記事に従い、Ubuntu 14.04 を利用。お手元のマシンでも可能。
OpenWhisk 稼働用 8 OpenWisk を稼働させるインスタンス。 Ubuntu ベースで、それぞれ役割が異なる。

Azure Virtual Machine に OpenWhisk をセットアップする

ブートストラップ用マシンのセットアップ

ブートストラップ用マシンとして、Azure に、 HHD, A1 Basic で Ubuntu Server 14.04 LTS のインスタンスを用意しました。

てはじめに、 OpenWhisk のリポジトリをクローンし、ブートストラップ用のセットアップを行います。

# Clone openwhisk repository
$ sudo apt-get install git
$ git clone git@github.com:openwhisk/openwhisk.git

# Change current directory to openwhisk
$ ch openwhisk

# Install all required software
(cd tools/ubuntu-setup && source all.sh)

次に、Ansible に OpenWhisk 稼働用インスタンスにログインするための SSH の設定を行います。

# sshキー作成
$ ssh-keygen -t rsa -b 4096
$  eval $(ssh-agent -s)
$  ssh-add ~/.ssh/id_rsa

# 公開鍵を表示して、コピーし控えておいてください(のちに OpenWhisk 稼働用インスタンス作成時に指定します。)
$ cat ~/.ssh/id_rsa.pub

# Ansible.cfg ファイルを編集する
$ vi ansible/Ansible.cfg

openwhisk/Ansible/Ansible.cfgremote_user を指定します。このユーザー名は、のちに OpenWhisk 稼働用インスタンス作成時に指定します。

openwhisk/ansible/ansible.cfg
 [defaults]
+remote_user = <login user>

なお、当初は 16.04 でも試しましたが、下記の @tokida さんの記事のような事象に出くわします。2016年12月の段階では、 14.04 をお勧めします。

ネットワークセキュリティグループの準備

OpenWhisk 稼働用インスタンスの作成前に、ネットワーク セキュリティ グループを用意しておきます。

AWS の場合はデフォルトのセキュリティーグループ(同一セキュリティグループでのインバウンドは全許可)とのことなので、Azure では、同一仮想ネットワーク内のインバウンドを許可したネットワーク セキュリティ グループを作成します。また、便宜上、自マシンからのみ SSH も開けておきました。

OpenWhisk 稼働用インスタンスの準備

さて、 8台の仮想マシンインスタンスを作成します。Azure ではテンプレートを使うと楽に量産できるのですが、プログラマの私は慣れてないので、泥臭くポータルから作ります…!

AWS での推奨スペックは m3.large とのことなので、CPUとメモリで候補を挙げてみました。だがしかし、懐への負担が大きいため A1 にします!検証終わったら、すぐ落とすよ…!

クラウド インスタンスタイプ/仮想マシンサイズ vCPU/CPU メモリ 1 台分の価格 8 台分の価格
AWS m3.large 2 7.5 GiB 約 16,290 円/月 約 130,317 円/月
Azure A2 v2 2 4.00 GB 約 8,576 円/月 約 68,608 円/月
Azure A4 v2 4 8.00 GB 約 18,062 円/月 約 144,496 円/月

Virtual Machine インスタンス作成の細かな手順に関しては割愛しますが、以下の 2 点をご対応ください。

SSH 公開キーの指定

「1. 基本 基本設定の構成」では、「認証の種類」を「SSH 公開キー」とし、先ほど控えた SSH 公開キーを指定してください。それ以外は任意で構いません。

ネットワーク セキュリティ グループについて

「3. 設定 オプション機能の設定」では、先ほど作成した ネットワーク セキュリティ グループを指定しましょう。それ以外は任意で構いません。

なお、今回は検証であるため、上記以外のセキュリティについて考慮しません。ご了承ください。

Ansible のデプロイ先を更新

openwhisk/ansible/environments/distributed/hosts に、実際の IPアドレスを反映します。

私の環境ではこうなりました。

openwhisk/ansible/environments/distributed/hosts
; the first parameter in a host is the inventory_hostname which has to be
; either an ip
; or a resolvable hostname

; used for local actions only
ansible ansible_connection=local
[registry]
10.0.0.5
[edge]
10.0.0.6
[controllers]
10.0.0.7
[kafka]
10.0.0.9
[consul_servers]
10.0.0.10
[invokers]
10.0.0.11
10.0.0.12
[db]
10.0.0.8

疎通確認は、以下のコマンドを実行します。

$ cd ansible
$ ansible all -i environments/distributed/hosts -m ping

ansible | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
10.0.0.9 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
10.0.0.12 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
10.0.0.5 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
10.0.0.8 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
10.0.0.11 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
10.0.0.6 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
10.0.0.10 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
10.0.0.7 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

registry インスタンスの準備

registry のインスタンスにログインし、以下のように git をインストールしておきます。

$ sudo apt-get update
$ sudo apt-get install git

Ansible 実行して OpenWhisk 環境をデプロイ

それでは、準備が整ったので、 Ansible でセットアップを流していきましょう!

# config を生成する
$ ansible-playbook -i environments/distributed/hosts setup.yml
# 各インスタンスの環境をセットアップする
$ ansible-playbook -i environments/distributed/hosts prereq_build.yml

ここで、もし以下のように UNREACHABLE で失敗してしまっても、再度 prereq_build.yml を実施することで未完だった部分を実施することができます。

fatal: [10.0.0.5]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh.", "unreachable": true}

次に、いよいよ OpenWhisk のビルドとデプロイを行います。

# レジストリをデプロイする
$ ansible-playbook -i environments/distributed/hosts registry.yml

# Docker イメージを配布する (root 権限で実行)
$ sudo -i

cd <path-to-openwhisk>

./gradlew distDocker -PdockerHost=<registry_vm_ip>:4243 -PdockerRegistry=<registry_vm_ip>:5000

exit # root から抜ける

registry_vm_ip には、 registry のインスタンスの IP を指定してください。なお、この ./gradlew distDocker は時間がかかります。スペックをケチったので、なおさらかかってる模様です…!

BUILD SUCCESSFUL

Total time: 1 hrs 32 mins 51.646 secs

やっとビルド終わったー!

さて、次に CouchDB のセットアップをします。

# CouchDB をセットアップする
$ cd ansible
$ ansible-playbook -i environments/distributed/hosts couchdb.yml
$ ansible-playbook -i environments/distributed/hosts initdb.yml
$ ansible-playbook -i environments/distributed/hosts wipe.yml
$ ansible-playbook -i environments/distributed/hosts openwhisk.yml
$ ansible-playbook -i environments/distributed/hosts postdeploy.yml

動作確認!

最後に、ちゃんと構築できたか確認してみましょう!

<edge_url> には edge のインスタンスの IP を指定してください。

# OpenWhisk にプロパティを設定する
$ ../bin/wsk property set --auth $(cat files/auth.whisk.system) --apihost <edge_url>

ok: whisk auth set to 789c46b1-71f6-4ed5-8c54-816aa4f8c502:abczO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwP
ok: whisk API host set to <edge_url>
# OpenWhisk のアクションを実行する
$ ../bin/wsk -i -v action invoke /whisk.system/samples/helloWorld --blocking --result

REQUEST:
[POST]  https://<edge_url>/api/v1/namespaces/whisk.system/actions/samples/helloWorld?blocking=true
Req Headers
{
  "Authorization": [
    "Basic XXXXXXXXYjEtNzFmNi00ZWQ1LThjNTQtODE2YWE0ZjhjNTAyOmFiY3pPM3haQ0xyTU42djJCS0sxZFhZRnBYbFBrY2NPRnFtMTJDZEFzTWdSVTRWck5aOWx5R1ZDR3VNREdJd1A="
  ]
}RESPONSE:Got response with code 200
Response body size is 559 bytes
Response body received:
{
  "duration": 2266,
  "name": "helloWorld",
  "subject": "whisk.system",
  "activationId": "9b6c16fe9bc84d7c80dd2276e5807907",
  "publish": false,
  "annotations": [{
    "key": "limits",
    "value": {
      "timeout": 60000,
      "memory": 256,
      "logs": 10
    }
  }, {
    "key": "path",
    "value": "whisk.system/samples/helloWorld"
  }],
  "version": "0.0.1",
  "response": {
    "result": {

    },
    "success": true,
    "status": "success"
  },
  "end": 1481497829558,
  "logs": [],
  "start": 1481497827292,
  "namespace": "whisk.system"
}
{}

うごいたーーーー!!!!!! (*ノωノ)

うおーーーーー!!!

Epilogue - おわりに

ということで、 Ubuntu 16.04 で挑戦して挫折したり、普段は使わない IaaS でしり込みしてましたが、OSSのソース読んだりデバッグするスキルがついてきて、解決することができました!

仮想マシン、思いのほかすんなり使えたので、普段 AWS 触ってる人も似た感覚で使えるんだなーっと感心しました。

This post is the No.11 article of OpenWhisk Advent Calendar 2016