この記事は Tech KAYAC Advent Calendar 2019 の17日目の記事です。
こんにちは、バックエンドエンジニアの @commojun です。
本日は死んだ飼い猫をLINE botとして蘇らせようとしたことについて記事にさせていただこうと思います。なんだbotかよと思った方申し訳ありません。
猫の死
2017年8月、子供の頃に拾って以来ずっと一緒だった猫が死にました。18年も生きたのでなかなか長く生きてくれた方だと思います。こればかりは仕方ないですね。
ところが、しばらく経っても、僕はなかなか彼を忘れることはできませんでした。
そしてだんだんと、一つの願望が湧き上がってくるのです。
猫を蘇らせたい。
どうやって蘇らせるか?
弊社のサービス運用では、chat opsが積極的に取り入れられています。chat opsとは、slackのようなチャットルームに専用のbotアカウントが入り込み、ビルドやテスト、さらにはデプロイなどのタスクを実行するインタフェースとしてしまう開発手法です。
本物の人間のアカウントにまぎれてbotアカウントが仕事をするそのさまは、まるでbotが人格を認められているように錯覚することがあります。これはすごいことです。
つまり、単純な受け答えをする機能しか持たないbotであっても、本物の人間が会話をする場にまぎれていることで、人間性を感じることがある。シンギュラリティは既に来ていた!
その時僕は、「これだ!」と確信しました。これなら猫を冥界から呼び戻すことができる。
使う技術
ということで、chat botで猫を作ることが決まりました。次は、使った技術について説明します。
昨今はクラウドが流行っていますね。適当なクラウドサーバを借りて、受け答えができるchatのコードをデプロイすれば簡単にやりたいことが実現できるでしょう。
ただ、ちょっと待ってください。猫って家で飼うものですよね???外に出してしまっては、いつ交通事故に遭ってまた死んでしまうかわからない。クラウドなど言語道断!自宅にマシンを用意してデプロイしましょう。
また、猫はかわいいです。なのでハードウェアもかわいいものでなくてはならない。
それらを踏まえて以下の構成でchat botを作ります。
ハードウェア
- Raspberry Pi 3 Model B+ * 3台
かわいいといえばRaspberry Pi !!ですよね。
インフラ
- Docker & Kubernetes
近年はコンテナベースでサービスを設計することが流行っていますので、勉強のためにKubernetesを選択してみました。コンテナベースの本格的なサービス運用では、複数のホストが協調してコンテナを管理することが大前提となると思います。その経験をしてみようという理由のため、マシンも3台です。
chat bot アプリの言語
- go
弊社ではgoを積極的に利用していますが、僕の所属プロジェクトではメインでPerlを利用しているので、なにかgoでプロダクトを作る経験を得ようと思い選択しました。
利用するAPI
- LINE Messaging API
Slackよりも、LINEの方が日常生活によく馴染みます。家族も利用できるので、LINEを選択しました。
(一時的な)ストレージ
- redis
猫って基本的に物覚えは良くない。なので本格的なストレージはありません。
永続的なストレージ(マスタデータ)
- Google SpreadSheet
弊社では、Google SpreadSheetを用いてサービスのマスタデータを管理することが多いです。SpreadSheetで作成したマスタデータを本番に反映する一連の流れ作りを体験したかったため採用しました。
実装
実装するにあたっては次のような記事を参考にさせていただきました。基本的には、既存の技術の組み合わせなので、具体的な実装の詳細については本稿では説明を省きたいと思います。
ハードの組み立てに際して参考にした記事
こちらの記事を参考に各種パーツを買い揃え、最終的にこのような感じに組み上がりました。
極めて猫ですね。かわいい
Kubernetesクラスタを構築する時に参考にした記事
Raspberry PiはCPUアーキテクチャがarmなので、通常の導入手順に従うとハマりどころがありそうでした。
LINEアカウントの準備で参考にした記事
こちらを参考にして、goのアプリがLINE Massage APIを叩く部分についてイメージをつけることができました。それをベースに、欲しい機能をバンバン追加していきました。
そうしてできあがったリポジトリがこちらとなります。
GitHub - commojun/nyanbot: linebotを作りたい
今の所公開リポジトリとしているのはアプリ本体の部分のみです。
機能
機能の紹介をします。botには次のような猫らしい機能を実装しました。
明日のゴミの種別を教えてくれる機能
明日が何ゴミか忘れることってないですか?特に隔週や月一でしか回収してくれないゴミは、出し忘れがちですよね。そこで、決まった週、曜日の決まった時間に任意のメッセージを送信してくれる機能を作りました。
設定はGoogle SpreadSheetで行うので、ある程度直感的に通知を追加できます。
この通知機能は結構便利でしたので、この機能だけを持ったLINE botをGoogle Apps Scriptで実装する方法を過去に記事にしました。興味がありましたらそちらも御覧ください。
おみくじ機能
ランダムで今日の運勢を教えてくれます。日付が変わったら運勢も変わります。
記念日機能
予め設定した年月日から経過した日数を教えてくれます。また、日数が○周年だったり、キリのいい数字だった場合は自分から教えてくれます。
おじさん
こちらを利用させていただきました。 github.com
苦労したところ
Kubernetesが高度すぎる
botを実装するまで、Dockerfileの書き方すら知らなかった僕にとって、Kubernetesは非常に高度な概念であるように感じました。そんな中、次の2冊の本が学習と理解の助けとなりました。
- 作者:山田 明憲
- 出版社/メーカー: 技術評論社
- 発売日: 2018/08/25
- メディア: 単行本(ソフトカバー)
Kubernetes完全ガイド (impress top gear)
- 作者:青山 真也
- 出版社/メーカー: インプレス
- 発売日: 2018/09/21
- メディア: 単行本(ソフトカバー)
armアーキテクチャ向けのイメージをビルドしなきゃいけないことを知らなかった
Raspberry Piは、汎用PCと違うCPUアーキテクチャ(arm)で動いていることは認識していましたが、Dockerイメージもarmアーキテクチャ向けにビルドしなければならないということを知りませんでした。手元のDocker Desktopでは問題なく動作しているのに、いざRaspberry Pi上にデプロイしてみると動かない、という現象にしばらく頭を抱えました。
Raspberry Pi向けのDockerイメージはRaspberry Pi上でビルドしなければならないのだろうか、マシンパワー足りなくてビルドめっちゃ時間かかるじゃん…と思っていたところ、buildxという機能を使えばマルチプラットフォームのビルドができることを知り、無事にRaspberry Pi向けのDockerイメージをビルドできるようになりました。
まとめ
死んだ猫をLINE botとして、Raspberry Pi & Kubernetes で蘇らせようというお話でした。 実体のあるマシンを使って1からサービスを作るのはなかなか大変ですが、その分勉強になることも沢山ありました。何より愛着がわきます。Raspberry Piなら1台あたりの値段があまり高くないので、コンテナオーケストレーションの勉強には向いていると思います。
手がかかる
家でKubernetesを運用するというのは、コンテナからホストOS、ホストマシンまでをすべて面倒を見ないといけません。そしてつい先日ホストマシン2台が不調を訴えてdockerが動かなくなってしまいました。南無三
猫ですからね、手がかかって当然です。