Nature Remoの裏側 ~ AWSとWeb技術をIoTの世界でフル活用する / Inside Nature Remo

07ecb4f6c2111bff7ab4f0412edc773d?s=47 Songmu
October 04, 2019

Nature Remoの裏側 ~ AWSとWeb技術をIoTの世界でフル活用する / Inside Nature Remo

07ecb4f6c2111bff7ab4f0412edc773d?s=128

Songmu

October 04, 2019
Tweet

Transcript

  1. 2.

    2 Me • 松⽊ 雅幸 (id:Songmu) • Nature 株式会社 取締役CTO

    • https://songmu.jp/riji • https://github.com/Songmu • 好きな⾔語はGoとPerlと中国語 • 3 Times ISUCON Winner • 著書に「みんなのGo⾔語」等
  2. 3.

    3 Created Miscellaneous Go Tools • maltmill • ツールを簡単にhomebrewで配布するためのツール •

    horenso • バッチジョブのためのラッパー • peep • プロセスの終了通知をしてくれる君 • gocredits • Goのツール配布時に依存ライブラリのLICENSEを同梱 • etc. • ref. 「Goでツールを量産する僕の⽅法」 • https://junkyard.song.mu/slides/gocon2019-fukuoka/#0
  3. 4.

    4 Maintaining major Go tools ご意⾒あれば懇親会などでお声がけください • ghq (github.com/motemen/ghq) •

    ソースコードリポジトリ管理ツール • ghr (github.com/tcnksm/ghr) • GitHubへのバイナリリリース⽤ツール
  4. 5.

    5 Recent Works • godzil (github.com/Songmu/godzil) • Goツール作成のためのAuthoring Tool •

    ecsched (github.com/Songmu/ecsched) • ECSのスケジュールタスク管理ツール • kibelasync (github.com/Songmu/kibelasync) • kibelaのクライアント • replaceablewriter (github.com/Songmu/replaceablewriter) • Write先を差し替えられるio.Writer
  5. 15.

    Home Automation to P2P Electricity Platform 15 2019 Phase 1

    (ݱࡏ) Home Automation 2020 Phase 2 Energy Management 2022 Phase 3 P2P Electricity Auction Platform
  6. 17.

    Nature Remo E • ʮεϚʔτΤωϧΪʔϋϒʯ • ECHONET LiteϓϩτίϧΛར༻ • ೔ຊࠃ಺ͷεϚʔτϝʔλͱHEMSΛܨ͙ඪ४ϓϩτίϧ

    • ܦ࢈লೝఆ • ՈఉͷWifiʹͭͳ͍ͰUDP΍Wi-SUNͳͲͰ௨৴ • ՈఉͷεϚʔτϝʔλʔ΍ιʔϥʔύωϧɾ஝ి஑ͷૢ࡞΍৘ใऩर • ిྗσʔλͷӾཡ΍ૢ࡞ͳͲ͸εϚʔτϑΥϯΞϓϦ͔Β • εϚʔτϝʔλʔ͸࣮͸΄΅શͯͷ͝ՈఉͰར༻Մೳ
  7. 19.

    Features • いわゆるIoT製品のスマートリモコン • スマートフォンやスマートスピーカーから家電操作 • エアコン・TV・ライト等 • 既存の⾚外線リモコンをそのまま置き換えられる •

    簡単なリモコン学習(検出)機能 • センシングやユーザーの位置情報をもとに家電操作 • 温度・湿度、家から離れた時、近づいたときなど
  8. 27.

    Components • API • スマホアプリやスマートスピーカーとの通信 • Stream • Nature RemoとのWebSocket通信

    • Worker • ルールの実⾏ すべてGo製でAmazon ECS上で動かしている
  9. 28.

    Remarkable Points • 素朴なGo製のWebアプリケーション • Redis Pub/Subを⽤いた、API - Stream間のやりとり •

    Consulによるサービスディスカバリとコネクション管理 • AlexaのカスタムスキルはAWS Lambda経由を使って実⾏ される
  10. 29.

    Simple Web Applications with Go • 普通のWebアプリケーション • もともとherokuでホストしていた名残も •

    フレームワークは使わずGorilla web toolkitを部分的に利⽤ • MySQL/Redis • gorp/redigo • DynamoDBはじめました • guregu/dynamo
  11. 30.

    Utilize Redis Pub/Sub • Redis Pub/Subを活⽤している • APIからはRedisにPublish • StreamはRedisをSubscribe

    • 相互通信しない疎結合を実現している • Stream側はあくまでWebSocketとRedisからのSubscribe で受け付けた命令の実⾏しかおこなわず状態を持たない
  12. 31.

    Service Discovery with Consul • 歴史的経緯によりNature RemoはALBへの直接接続が困難 • NginxからproxyしてStreamサーバーに接続している •

    NginxでTLS終端とWebSocketのProxyを実施 • エフェメラルポートの都合上、6万接続程度が上限 • 接続数が少ないサーバーにNature Remoは接続する • 接続先IPを返すAPIをまずコールし、返されたIPにWS接続 • Consulを使ってディスカバリを実現
  13. 34.

    CI/CD Pipelines git-pr-release git push go test go build docker

    build docker push ecspresso deploy 1 2 3 4
  14. 35.

    Introduce "ecspresso" for Deploying • github.com/kayac/ecspresso • ecs-deployから乗り換え • ecs-deployからの乗り換え先としてちょうどよい

    • 既存のTask Definitionを利⽤できる • そのままシームレスに移⾏可能 • CircleCI上で実⾏してdeploy
  15. 39.

    Nginx Proxy • 歴史的経緯によりNature RemoはALBに接続できない • Nginxに直つなぎしている • Nginxはstreamにproxyしているので6万接続程度が上限 •

    エフェメラルポート関連 • コネクション数管理が煩雑! • → ALBに⼀本化したい • DNSベースで⾃動で内部のノード増やしてくれる
  16. 42.

    Log Monitoring • go.uber.go/zap でJSONログをCloudWatch Logsに送信 • CloudWatch Logs Insightsも安定してきて便利

    • しかし如何せん⾼い • ⼀部のログはアプリから直接firehoseを叩いてS3送信 • Athenaで調査 • firehoseがたまに⼀時的にエラーが続くことに困っている • 改善したい
  17. 43.

    Further use AWS • AWS IoT • 無理して使う必要はないと考えているが、選択肢を広げ て必要に応じて使いたい •

    機械学習系機能 • ユースケース • 室温や快適度の⾃動調整 • 電⼒の最適化や需給調整
  18. 46.

    Go Modulesಋೖ • depから移⾏ • vendorを残すなら以下のステップのみ % GO111MODULE=on go mod

    init % GO111MODULE=on go mod vendor % rm Gopkg.* • ビルド時に `-mod=vendor` を⼀律つける必要はある • vendoringなんだかんだで便利だと思うようになった… • CI環境で考えることも減らせる
  19. 47.

    Dependabotಋೖ • dependabot.com • 依存ライブラリのバージョンが上がっていたらpull requestを起票して くれるサービス • GitHubが買収して今は無料で使える •

    とにかく依存ライブラリ最新にし続けたいので便利 • Go対応正直微妙な部分も… • 頑張ってほしい… • 起票後CircleCI上でgo mod tidy⾛らせるなどの⼯夫もしている • アップデート当番のアサインも⾃動化
  20. 50.