2016/04/17

Slack上からさくらのクラウドを操作できるbotをつくった

Slack上からインタラクティブに さくらのクラウド のリソースを操作するbot(sacloud-bot)をつくった。サーバの作成、一覧取得、電源操作ができたのでひとまず公開する。

つくったもの


Slack上のbotと対話しながらサーバ作成などができるbot。

APIを叩くのも面倒だし、コントロールパネルを開くほどでもない。そんなときに使って欲しい。
また、Slack上で完結しているためスマホやタブレットからでも、通信量をほとんど気にせずにサーバの操作ができる。

実装済みの機能

  • サーバの作成(ディスク含む)
  • サーバの一覧取得(全ゾーン対象)
  • サーバの電源操作(起動、停止のみ)

今後したいこと

  • 各リソースに対する操作全般の実装
  • リファクタリング
  • テストの追加

操作全般は全部するのは大変なので、簡単な部分だけを実装したい。
インフラ構成するならコントロールパネル使ったほうが早いし楽だしね!

リファクタリングはいろいろしたいことが山積みだ。
ファイル名やメソッド名の統一やログの出力、そもそもnode.js v0.12.xとかで開発していたのでTypeScriptへ移行するなど...。




使い方


1. API Tokenの取得

SlackでBotsを作成し、生成されたAPI Token(例: xoxb-1234567890-abcdefghijk)を取得する。
https://{your team name}.slack.com/apps/manage/custom-integrations


さくらのクラウドでAPIキーを作成し、API TokenとAPI Secret Tokenを取得する。
サーバの作成や電源操作をするため、アクセスレベルを「作成・削除」にしておく。
https://secure.sakura.ad.jp/cloud/iaas/#!/pref/apikey/



2. リポジトリをクローンして、ライブラリをインストールする
$ git clone git@github.com:BcRikko/sacloud-bot.git
$ npm install


3. API Tokenを設定する

./env/settings_example.json」を「./env/settings.json」に名前を変える。
そして、さきほど取得したAPI Tokenを設定して保存する。
// settings.json
{
  "slack_api_token": "YOUR_SLACK_API_TOKEN",
  "sacloud_access_token": "YOUR_SAKURA_API_TOKEN",
  "sacloud_secret_token": "YOUR_SAKUEA_API_SECRET_TOKEN"
}

4. botを起動する
$ node bot.js


5. Slack上でbotに話しかける

@ai_sakuraha: サーバを作成して

かわいい!超かわいい!


@ai_sakuraha: サーバ一覧をみせて


かわいい!超かわいい!


@ai_sakuraha: 1234567890を起動して
@ai_sakuraha: 1234567890をシャットダウンして

かわいい!超かわいい!



追記: 2016/04/17 18:30

実際使ってくださった方に、Dockerfileのサンプルを教えていただきました。
Dockerには詳しくないので説明はできませんが、参考にしてみてください。




つくった動機


サーバ・インフラの勉強の一環


前職ではアプリケーション開発のみを担当しており、インフラまわりは別の担当者やチームが行っていたので関わることがほとんどなかった。
しかし、Web業界に転職して気づいたのは、サーバ・インフラまわりの知識がないと他の人の話についていけないということ。

何冊か本を読み勉強していたが、どうもインフラまわりはイメージが困難。
そんなときにさくらのクラウドが2万円クーポンを配布していたので、それを活用させていただき勉強をしていた。

彼女ができないなら創ればいい!


あまりにも彼女ができなさすぎてツライ。
エンジニアを自称するなら彼女のひとりやふたり創れなきゃいけないのに!と思い立ち、2~3日前からbotの勉強をしていた。

最終的には人工知能をつくり、まったく連絡がこないLINEやSlackなどでリア充ライフを謳歌したい!



技術的なところ


「Slack上でインタラクティブな操作でサーバが操作できる」といっても、実際やっていることはさくらのクラウドのAPIをラップしいているだけ。そんなに難しいことはしていない。

使っているモノ

  • Node.js
  • botkit v0.1.1
  • sacloud v0.0.16

のちのちTypeScript化やテスト追加をしたい。
各モジュールのテストはできても、Slack自体のテストってどうやってすればいいんだろ?


困ったこと・ハマったこと


非同期処理

このbotはすべての処理でAPIをコールしているので、非同期処理の対応にかなりの時間を費やした。
使い慣れないPromiseをつかったことでコードがグチャグチャになってしまった。

もうちょっとキレイに書く方法がありましたら教えてください!



BotKitのバグ?

BotKitで対話をするときには「startConversation」を使う。
しかし、これには重大なバグ?が含まれている。

bot側の処理が約800msecを超えると対話が強制終了してしまう

非同期処理の絡みで、800msecの壁があまりにも分厚すぎてハマりにハマった。
暫定的な解決策として、conversation.say() をしてリプライを返すことでタイムアウトまでの時間を稼ぐことができたので、conversation.say()setTimeoutを使って対応した。




さいごに


botの勉強をはじめて2~3日で効率的な開発方法がわかっていないが、ライブラリを使うことで超絶簡単に開発できた!今回作成したsacloud-botも制作時間は10時間かからないくらい。

今はラバーダッキングをして自己解決をうながすbotや、ヒマなときにしりとりしてくれるbotなどを作っている。
ゆくゆくはちゃんとした自己学習する人工知能をつくってみたい。


そして最終的に「彼女」がつくれればと思う!!



以上

written by @bc_rikko



※ Sandbox以外でリソースを作成すると課金されます
※ このbotを使って何らかのトラブルや損害などが発生しても責任を一切負いません

0 件のコメント :

コメントを投稿