Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GoogleHomeとStackStorm

 GoogleHomeとStackStorm

NTT Engineers Festa #1で発表したネタ。
GoogleAssistantを使った対話型アプリの裏処理をst2にやらせるための実装に用いる機能や実装案についてザックリまとめたものです。

#GoogleAssistant #GoogleHome #StackStorm #st2

Wataru Manji

January 31, 2018
Tweet

More Decks by Wataru Manji

Other Decks in Programming

Transcript

  1. 自己紹介 Name : 萬治 渉 (マンジ ワタル) Account : #

    call me まんじまる ・Slack : @manji0 ・Twitter : @___manji0 Occupation : # 入社してからそろそろ丸2年 ・NTT-TXのOpenStackチームに所属 - StackStormを使って運用やテストの効率化 - Ansibleを使ってOpenStack構築資材を作成 - 若手特権で色々なイベントへお邪魔 ・研究所のとある案件に50%くらい投入中 - NW運用、工事などを自動化するシステムの方式検討 - 機器操作抽象化ツールの方式検討、調査、試作など
  2. GoogleAssistantアプリ(=拡張) の作成について 非常に乱暴なまとめ: • ガチで作るならSDK使ってゴリゴリ実装すれば何でもできる • POST Request投げっぱなしでよいならIFTTTでOK • Request

    → 結果のpolling → 結果を返す... 程度ならDialogflowを使え 非常に乱暴なチャート: 実行系をWeb APIで キックできる? リクエスト投げっぱなしで OK? 返り値を元に複雑な処理を してから返したい? SDKで ゴリゴリ
  3. 複雑さのレベル • リクエスト投げっぱなしでいいもの ◦ 家電の操作 ◦ 定型連絡 (今日休みます!とか ) •

    リクエストを投げる&結果をそのまま返してくれればいいもの ◦ 列車の運行状況取得 ◦ アサインされてるチケットの確認 • 複雑な操作が絡むもの, etc... ◦ 複数のサービスへの一括操作 (特に認証情報の管理が必要なやつなど ) ◦ Internet Reachableでない機器、サービスの操作
  4. リクエストの先はどこへ? • 手堅くやるなら API Gateway → Lambda (→ Step Functions)

    ◦ メリット : ▪ 構成を組むための情報が豊富 • 日本語で書かれた入門記事がいくらでもある • 社内に1人くらいはめっちゃ詳しい人がいるので頼れる ▪ 良心的なレートの従量課金 • 個人的な実験なら数十円とか • GoogleAssistantで遊ぶ系の記事でも大抵上記の構成を使ってる • しかし、前項の「複雑な操作が絡むもの, etc...」には対応しにくい
  5. リクエストの先はどこへ? • ここでStackStorm ◦ メリット : ▪ 1サービスでAPI Gateway, Lambda,

    StepFunctions相当の リソースを作成、管理できる ▪ 各種サービス、機器に対応した拡張パッケージが豊富 ▪ 各種サービスの認証情報を簡単に管理できる • ただし、市中に情報が少ない ◦ ドキュメントはほぼ英語 ◦ 英語ですら「使ってみた」系の記事が少ない ◦ (情報に需要はあるっぽいが、供給が追い付いてない感じ...)
  6. StackStormの機能とAWS各サービスとの対応 • Rule : 各種イベントやWebhookのendpointなどの起動契機と、 起動するAction | Workflow及び引数の対応の定義 • Action

    : Python/bash/etc… で記述される実行コード • Workflow : OpenStack Mistralなどで記述されるワークフロー定義 StackStorm AWS Rule API Gateway + Lambda(Event hook) Action Lambda(Execution) Workflow Step Functions
  7. StackStormと連携できるサービス、機器など StackStorm Exchange にまとまっているので参照すべし。 サービス毎に「Pack」という単位でActionなどのパッケージが提供されている。 • 対応しているサービスの例 : ◦ Github,

    Gitlab ◦ AWS ◦ OpenStack ◦ Bitcoin(送金のみ) ◦ ActiveDirectory, MS Exchange ◦ etc... • 対応している機器の例 : ◦ Junos, ios, eos ▪ napalm-packによるconfig, 状態確認に対応 ▪ napalm-logsによるSNMPメッセージ契機のhookに対応 ◦ Linux, Windows ▪ Ansible-packによる操作に対応 ▪ 基本機能でsshによる操作に対応
  8. 各サービスの認証情報の管理について StackStormにはPack毎に「Config」という名前空間を用意しており、 任意の変数を登録することができる。 Configの特徴 : • 同一Pack内のAction, Workflowから参照可能 • secret属性を指定することが可能

    (ログに変数の中身が残らない) • APIで管理可能 機微な情報をAction, Workflowから分離し、かつ簡易な管理ができる。 積極的に使ってほしい機能の1つ。 参考: https://docs.stackstorm.com/reference/pack_configs.html
  9. StackStormのREST APIについて 基本的にはStackStom APIを見れば全部載ってる。 注意したいのは以下のポイント。 • WebhookによってAction/Workflowをキックした場合、 POSTの返り値でexecution idが取れず、実行結果の追跡が難しい。 →

    実行結果を追跡したいならexecutionのAPIを叩こう POST api/v1/execution • 実行結果を追跡する場合、単純にexecutionをGETするループを書くのは 非効率。 → Real time Action Outputを使おう GET api/v1/execution/<id>/output
  10. 1. /executionにPOSTしてst2をキックする function postSt2Exec (app, parameters) { let opts =

    { “Header”: { “x-st2-auth-token”: ‘hoge’, “Contents-Type”: ‘application/json’, “Connection”: ‘keep-alive’ }, “Data”: { “action”: ‘hoge.hoge’, “parameters”: parameters } }; let resp = http.post(‘https://st2.manj.io/api/v1/execution’, opts); return resp; }
  11. 2. 処理が終了するまで待機&結果取得 function getSt2Exec (executionID) { const execURL = “https://st2.manj.io/api/v1/executions/”

    + executionID; http.get(execURL + ‘/output’); # 待機 return http.get(execURL)[“body”] # 結果を取得 }
  12. 3. 1→2→returnの手続き function main (app, parameters) { const executionID =

    postSt2Exec(parameters)[“execution_id”]; const result = getSt2Exec(executionID); # listで返ってくると仮定 const isExsistListItem = result.length == 0 ? True : False; if (isExsistListItem) { return(“結果はありません”); } else { return(“結果は” + result.join(“ ”) + “の” + str(result.length) + “件です”); } }
  13. インターフェースの機能レベル • レベル1: ただ処理をキックするだけ ◦ 例: 家中のPCのウィルスチェックを起動する ◦ GoogleAssistant: IFTTTでST2のWebhookをキック

    ◦ ST2: Workflowに応じて淡々とActionを実行 • レベル2: 同期的に返事を喋らせる ◦ 例: 任意の担当者にアサインされているチケットの数と番号を喋らせる ◦ GoogleAssistant: Dialogflowで ▪ ST2のexecutionをキック ▪ 続けてexecutionをGETして結果を喋らせる ◦ ST2: Workflowに応じて淡々とActionを実行 • レベル3: 非同期的に返事を喋らせる ◦ 例: 新しいチケットがアサインされたら GoogleHomeが名前を呼んでくれる、など ◦ GoogleAssistant: 命令通り喋るだけ ◦ ST2: GoogleAssistantのAPIを叩いて喋らせる
  14. GoogleAssistant×StackStormのレベル感 • レベル1: ただ処理をキックするだけ ◦ 例: 家中のPCのウィルスチェックを起動する ◦ GoogleAssistant: IFTTTでST2のWebhookをキック

    ◦ ST2: Workflowに応じて淡々とActionを実行 • レベル2: 同期的に返事を喋らせる ◦ 例: 任意の担当者にアサインされているチケットの数と番号を喋らせる ◦ GoogleAssistant: Dialogflowで ▪ ST2のexecutionをキック ▪ 続けてexecutionをGETして結果を喋らせる ◦ ST2: Workflowに応じて淡々とActionを実行 • レベル3: 非同期的に返事を喋らせる ◦ 例: 新しいチケットがアサインされたら GoogleHomeが名前を呼んでくれる、など ◦ GoogleAssistant: 命令通り喋るだけ ◦ ST2: GoogleAssistantのAPIを叩いて喋らせる
  15. GoogleAssistant×StackStormのレベル感 • レベル1: ただ処理をキックするだけ ◦ 例: 家中のPCのウィルスチェックを起動する ◦ GoogleAssistant: IFTTTでST2のWebhookをキック

    ◦ ST2: Workflowに応じて淡々とActionを実行 • レベル2: 同期的に返事を喋らせる ◦ 例: 任意の担当者にアサインされているチケットの数と番号を喋らせる ◦ GoogleAssistant: Dialogflowで ▪ ST2のexecutionをキック ▪ 続けてexecutionをGETして結果を喋らせる ◦ ST2: Workflowに応じて淡々とActionを実行 • レベル3: 非同期的に返事を喋らせる ◦ 例: 新しいチケットがアサインされたら GoogleHomeが名前を呼んでくれる、など ◦ GoogleAssistant: 命令通り喋るだけ ◦ ST2: GoogleAssistantのAPIを叩いて喋らせる
  16. GoogleAssistant×StackStormのレベル感 • レベル1: ただ処理をキックするだけ ◦ 例: 家中のPCのウィルスチェックを起動する ◦ GoogleAssistant: IFTTTでST2のWebhookをキック

    ◦ ST2: Workflowに応じて淡々とActionを実行 • レベル2: 同期的に返事を喋らせる ◦ 例: 任意の担当者にアサインされているチケットの数と番号を喋らせる ◦ GoogleAssistant: Dialogflowで ▪ ST2のexecutionをキック ▪ 続けてexecutionをGETして結果を喋らせる ◦ ST2: Workflowに応じて淡々とActionを実行 • レベル3: 非同期的に返事を喋らせる ◦ 例: 新しいチケットがアサインされたら GoogleHomeが名前を呼んでくれる、など ◦ GoogleAssistant: 命令通り喋るだけ ◦ ST2: GoogleAssistantのAPIを叩いて喋らせる
  17. おまけ: データの永続性 • Actionの実行履歴 • Pack(Action, Workflow, Rule, Sensor,...)の登録情報 •

    Datastore(st2についてるKVS)のデータ • (有償版だと) RBACのデータ あらゆるものがMongoDBで管理されてる 以上 # レプリケーションとか大変そうですね...