Help us understand the problem. What is going on with this article?

Check! OpenWhisk on Microsoft Azure !

More than 1 year has passed since last update.

こんにちは、 @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
$ cd 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 触ってる人も似た感覚で使えるんだなーっと感心しました。

dz_
Nice to meet you! :)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away