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

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

Songmu
October 04, 2019

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

Songmu

October 04, 2019
Tweet

More Decks by Songmu

Other Decks in Technology

Transcript

  1. ݫൿɿຊࢿྉͷҰ෦·ͨ͸શ෦ΛɺNatureגࣜձࣾͷڐՄͳ͠ʹɺෳ੡ɺసࡌ͢Δ͜ͱΛې͡·͢ɻ
    Introduce about
    September 3, 2019
    Natureגࣜձࣾ
    Remoͷཪଆ
    AWS DevDay Tokyo 2019
    4th Oct, 2019
    ~ AWSͱWebٕज़ΛIoTͷੈքͰϑϧ׆༻͢Δ

    View Slide

  2. 2
    Me
    • 松⽊ 雅幸 (id:Songmu)
    • Nature 株式会社 取締役CTO
    • https://songmu.jp/riji
    • https://github.com/Songmu
    • 好きな⾔語はGoとPerlと中国語
    • 3 Times ISUCON Winner
    • 著書に「みんなのGo⾔語」等

    View Slide

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

    View Slide

  4. 4
    Maintaining major Go tools
    ご意⾒あれば懇親会などでお声がけください
    • ghq (github.com/motemen/ghq)
    • ソースコードリポジトリ管理ツール
    • ghr (github.com/tcnksm/ghr)
    • GitHubへのバイナリリリース⽤ツール

    View Slide

  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

    View Slide

  6. ࠓ೔࿩͢͜ͱ
    Agenda
    6

    View Slide

  7. 7
    Agenda
    • Nature及びNature Remoの紹介
    • Nature Remoのシステムアーキテクチャ解説
    • ECS活⽤事例
    • 現在の課題
    • その他の細かい取り組み

    View Slide

  8. ձࣾͱ੡඼
    Company and Product
    8

    View Slide

  9. Mission
    9
    Mission
    ⾃然との共⽣を
    テクノロジーでドライブする
    Vision
    インターネットとセンサー技術を活⽤し、分散型で再⽣可能な電
    源を普及させ、エネルギーを⾃給⾃⾜出来る未来を創造する

    View Slide

  10. 8,980ԁ(੫ൈ)
    ʢ2018೥7݄13೔ൃചʣ
    11,980ԁ(੫ൈ)
    ʢ2018೥12݄6೔ൃചʣ
    (ୈ̎ੈ୅ʣ
    Nature Remo 1st Generation͸ɺ2017೥10݄16೔ʹ13,000ԁʢ੫ൈ͖ʣͰൃച
    10
    Product

    View Slide

  11. ֎ग़ઌ͔ΒεϚϗͰΤΞίϯΛON εϚʔτεϐʔΧʔͱ࿈ܞͯ͠੠ͰՈిΛૢ࡞
    11
    Features

    View Slide

  12. εϚʔτσόΠε Nature Remo Ոి
    How It Works

    View Slide

  13. Traction
    13
    2೥ऑͰ
    10ສ୆ಥഁ
    ೝ஌ˍγΣΞۀքNo.1

    View Slide

  14. Funding
    14
    2019年8⽉ 5億円調達
    • 環境エネルギー投資
    • DeNA (デライト・ベンチャーズ)
    ⽇経電⼦版・TechCrunch等掲載
    継続成⻑中

    View Slide

  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

    View Slide

  16. Confidential 16

    View Slide

  17. Nature Remo E
    • ʮεϚʔτΤωϧΪʔϋϒʯ
    • ECHONET LiteϓϩτίϧΛར༻
    • ೔ຊࠃ಺ͷεϚʔτϝʔλͱHEMSΛܨ͙ඪ४ϓϩτίϧ
    • ܦ࢈লೝఆ
    • ՈఉͷWifiʹͭͳ͍ͰUDP΍Wi-SUNͳͲͰ௨৴
    • ՈఉͷεϚʔτϝʔλʔ΍ιʔϥʔύωϧɾ஝ి஑ͷૢ࡞΍৘ใऩर
    • ిྗσʔλͷӾཡ΍ૢ࡞ͳͲ͸εϚʔτϑΥϯΞϓϦ͔Β
    • εϚʔτϝʔλʔ͸࣮͸΄΅શͯͷ͝ՈఉͰར༻Մೳ

    View Slide

  18. Nature RemoͱGo
    Nature Remo and Go
    18

    View Slide

  19. Features
    • いわゆるIoT製品のスマートリモコン
    • スマートフォンやスマートスピーカーから家電操作
    • エアコン・TV・ライト等
    • 既存の⾚外線リモコンをそのまま置き換えられる
    • 簡単なリモコン学習(検出)機能
    • センシングやユーザーの位置情報をもとに家電操作
    • 温度・湿度、家から離れた時、近づいたときなど

    View Slide

  20. εϚʔτσόΠε Nature Remo Ոి
    How It Works

    View Slide

  21. Conditions
    • Nature Remoは⾃宅のWi-Fiに接続してローカルIPは保持
    • → ⾃分からインターネットに出ていくことはできるが、外か
    らのリクエストを受け付けるのは容易ではない
    • しかし屋外のスマホ、スマートスピーカー、ルールなどに対して
    素早く反応する必要がある
    • → どうやって?
    • Nature Remoはマイコンボード上でCのFirmwareが動作
    • あまり複雑なことをさせたくはない

    View Slide

  22. Possible Solutions (?)
    • UPnP等によるポート開放とDDNSの組み合わせ
    • セキュリティ上の懸念
    • UDPホールパンチング等のNAT越え技術を⽤いたP2P
    • 接続維持が難しそう。特に移動体
    ↑これらはかっこいいけど、現実的ではない

    View Slide

  23. Realistic Solution
    • スマホアプリからはAPIリクエスト (開発者向けAPIも提供)
    • 我々のクラウドシステムがNature RemoにWebsockt経由で指令を送る
    • 「この⾚外線信号を出して」
    HTTP API WebSocket
    - ੺֎ઢ
    - ηϯαʔ৘ใ
    - Թ౓
    - ࣪౓

    View Slide

  24. Why WebSocket?
    • リアルタイムに双⽅向通信がお⼿軽にできる
    • 「普通の」Web技術
    • 接続や切断時の再接続はNature Remo側が制御
    • 常時接続になるため接続管理が割と⼤変ではある
    • 10万台+増加の⼀途

    View Slide

  25. ΞʔΩςΫνϟ
    Architecture
    25

    View Slide

  26. API
    Stream
    Worker
    System Diagram
    Amazon ECS
    Subscribe
    Publish
    WS
    WS
    Pub/Sub

    View Slide

  27. Components
    • API
    • スマホアプリやスマートスピーカーとの通信
    • Stream
    • Nature RemoとのWebSocket通信
    • Worker
    • ルールの実⾏
    すべてGo製でAmazon ECS上で動かしている

    View Slide

  28. Remarkable Points
    • 素朴なGo製のWebアプリケーション
    • Redis Pub/Subを⽤いた、API - Stream間のやりとり
    • Consulによるサービスディスカバリとコネクション管理
    • AlexaのカスタムスキルはAWS Lambda経由を使って実⾏
    される

    View Slide

  29. Simple Web Applications with Go
    • 普通のWebアプリケーション
    • もともとherokuでホストしていた名残も
    • フレームワークは使わずGorilla web toolkitを部分的に利⽤
    • MySQL/Redis
    • gorp/redigo
    • DynamoDBはじめました
    • guregu/dynamo

    View Slide

  30. Utilize Redis Pub/Sub
    • Redis Pub/Subを活⽤している
    • APIからはRedisにPublish
    • StreamはRedisをSubscribe
    • 相互通信しない疎結合を実現している
    • Stream側はあくまでWebSocketとRedisからのSubscribe
    で受け付けた命令の実⾏しかおこなわず状態を持たない

    View Slide

  31. Service Discovery with Consul
    • 歴史的経緯によりNature RemoはALBへの直接接続が困難
    • NginxからproxyしてStreamサーバーに接続している
    • NginxでTLS終端とWebSocketのProxyを実施
    • エフェメラルポートの都合上、6万接続程度が上限
    • 接続数が少ないサーバーにNature Remoは接続する
    • 接続先IPを返すAPIをまずコールし、返されたIPにWS接続
    • Consulを使ってディスカバリを実現

    View Slide

  32. ECSΛ༻͍ͨίϯςφ׆༻
    ECS and Containers
    32

    View Slide

  33. Our almost services running on Amazon ECS
    • 前述の通り、ほとんどのサービスをECS上で動かしている

    View Slide

  34. CI/CD Pipelines
    git-pr-release
    git push
    go test
    go build
    docker build
    docker push
    ecspresso deploy
    1
    2
    3
    4

    View Slide

  35. Introduce "ecspresso" for Deploying
    • github.com/kayac/ecspresso
    • ecs-deployから乗り換え
    • ecs-deployからの乗り換え先としてちょうどよい
    • 既存のTask Definitionを利⽤できる
    • そのままシームレスに移⾏可能
    • CircleCI上で実⾏してdeploy

    View Slide

  36. The ECS Task Definition become reviewable
    • Taskへのサイドカー追加やパラメーター変更がreviewable
    になったのは良かった

    View Slide

  37. --no-wait Option
    • https://github.com/kayac/ecspresso/pull/38
    • デフォルトではサービスが⼊れ替わるまで待ってからコマ
    ンド終了するが、待たないオプション
    • ecs-deployとの互換挙動
    • CD上で利⽤する時に便利

    View Slide

  38. ՝୊΍ࠓޙऔΓ૊Έ͍ͨ͜ͱ
    Problems
    38

    View Slide

  39. Nginx Proxy
    • 歴史的経緯によりNature RemoはALBに接続できない
    • Nginxに直つなぎしている
    • Nginxはstreamにproxyしているので6万接続程度が上限
    • エフェメラルポート関連
    • コネクション数管理が煩雑!
    • → ALBに⼀本化したい
    • DNSベースで⾃動で内部のノード増やしてくれる

    View Slide

  40. Service Discovery
    • Consulのサービスディスカバリはかっこいいが不安定にな
    ることも
    • Consul⾃体のバージョンも古い…
    • Cloud Mapなどに切り替えていきたい

    View Slide

  41. Stream Reconnection
    • streamをdeployすると⼀⻫にNature Remoとの接続を切断
    することになるため再接続ラッシュとなる
    • ⼀時的にAPIが過負荷気味になる
    • コンテナがコネクションを維持したまま、ローリングで⼊
    れ替えていく⽅法を模索中

    View Slide

  42. Log Monitoring
    • go.uber.go/zap でJSONログをCloudWatch Logsに送信
    • CloudWatch Logs Insightsも安定してきて便利
    • しかし如何せん⾼い
    • ⼀部のログはアプリから直接firehoseを叩いてS3送信
    • Athenaで調査
    • firehoseがたまに⼀時的にエラーが続くことに困っている
    • 改善したい

    View Slide

  43. Further use AWS
    • AWS IoT
    • 無理して使う必要はないと考えているが、選択肢を広げ
    て必要に応じて使いたい
    • 機械学習系機能
    • ユースケース
    • 室温や快適度の⾃動調整
    • 電⼒の最適化や需給調整

    View Slide

  44. RDB Migration
    • gooseを利⽤
    • 積み上げ式のMigrationはイマイチ
    • メンテも滞っている
    • マスターデータ⼊れるのもやっているので若⼲乗り換え
    づらい
    • schemalexに乗り換えたい
    • sqldefでも良いがschemalexは社内に作者がいる

    View Slide

  45. ࣋ଓՄೳͳ։ൃͷͨΊʹೖࣾޙऔΓ૊Μͩ͜ͱ
    Minor Topics
    45

    View Slide

  46. Go Modulesಋೖ
    • depから移⾏
    • vendorを残すなら以下のステップのみ
    % GO111MODULE=on go mod init
    % GO111MODULE=on go mod vendor
    % rm Gopkg.*
    • ビルド時に `-mod=vendor` を⼀律つける必要はある
    • vendoringなんだかんだで便利だと思うようになった…
    • CI環境で考えることも減らせる

    View Slide

  47. Dependabotಋೖ
    • dependabot.com
    • 依存ライブラリのバージョンが上がっていたらpull requestを起票して
    くれるサービス
    • GitHubが買収して今は無料で使える
    • とにかく依存ライブラリ最新にし続けたいので便利
    • Go対応正直微妙な部分も…
    • 頑張ってほしい…
    • 起票後CircleCI上でgo mod tidy⾛らせるなどの⼯夫もしている
    • アップデート当番のアサインも⾃動化

    View Slide

  48. git-pr-releaseࣗಈԽ
    • developブランチにfeatureブランチマージしたら勝⼿にリ
    リースpull requestが⽣えてきて便利
    • https://songmu.jp/riji/entry/2019-07-28-circleci-git-pr-release.html

    View Slide

  49. ECS Scheduled Task؅ཧͷͨΊͷπʔϧecsched
    • github.com/Songmu/ecsched (作りかけ)
    • バッチ類は、ECSのScheduled Taskを利⽤しているがそれ
    をバージョン管理したいという動機

    View Slide

  50. ·ͱΊ
    50

    View Slide

  51. Nature Remoͷཪଆ
    • サーバーサイドはほぼ全てGo
    • 実は割と普通のWeb技術を使って実現している
    • インフラはAWSに寄せているし、もっと寄せていきたい
    • 本質的なサービス開発に注⼒したい
    • WebSocketの接続管理周りがチャレンジング
    • サービスも急成⻑中
    • 開発体験を上げるためにも⾊々やっています

    View Slide

  52. We are hiring!
    積極採⽤中です!
    • バックエンドエンジニア
    • スマートフォンエンジニア
    • 機械学習エンジニア
    • 組み込みエンジニア
    ぜひオフィスに遊びに来てください@恵⽐寿

    View Slide