Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis...

52
厳秘:本資料の一部または全部を、Nature株式会社の許可なしに、複製、転載することを禁じます。 Introduce about September 3, 2019 Nature株式会社 Remoの裏側 AWS DevDay Tokyo 2019 4th Oct, 2019 ~ AWSWeb技術をIoTの世界でフル活用する

Transcript of Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis...

Page 1: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

厳秘:本資料の一部または全部を、Nature株式会社の許可なしに、複製、転載することを禁じます。

Introduce about

September 3, 2019Nature株式会社

厳秘:本資料の一部または全部を、Nature株式会社の許可なしに、複製、転載することを禁じます。

Introduce about

September 3, 2019Nature株式会社

Remoの裏側

AWS DevDay Tokyo 2019

Introduce about

4th Oct, 2019

~ AWSとWeb技術をIoTの世界でフル活用する

Page 2: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

2

Me

• 松木雅幸 (id:Songmu)

• Nature 株式会社取締役CTO

• https://songmu.jp/riji• https://github.com/Songmu

• 好きな言語はGoとPerlと中国語

• 3 Times ISUCON Winner • 著書に「みんなのGo言語」等

Page 3: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

3

Created Miscellaneous Go Tools• maltmill

• ツールを簡単にhomebrewで配布するためのツール• horenso

• バッチジョブのためのラッパー• peep

• プロセスの終了通知をしてくれる君• gocredits

• Goのツール配布時に依存ライブラリのLICENSEを同梱• etc.

• ref. 「Goでツールを量産する僕の方法」• https://junkyard.song.mu/slides/gocon2019-fukuoka/#0

Page 4: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

4

Maintaining major Go toolsご意見あれば懇親会などでお声がけください

• ghq (github.com/motemen/ghq) • ソースコードリポジトリ管理ツール

• ghr (github.com/tcnksm/ghr) • GitHubへのバイナリリリース用ツール

Page 5: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

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

Page 6: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

今日話すことAgenda

6

Page 7: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

7

Agenda• Nature及びNature Remoの紹介

• Nature Remoのシステムアーキテクチャ解説

• ECS活用事例• 現在の課題• その他の細かい取り組み

Page 8: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

会社と製品Company and Product

8

Page 9: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Mission

9

Mission

⾃然との共⽣を�テクノロジーでドライブする�Vision

インターネットとセンサー技術を活⽤し、分散型で再⽣可能な電

源を普及させ、エネルギーを⾃給⾃⾜出来る未来を創造する

Page 10: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

8,980円(税抜)

(2018年7月13日発売)11,980円(税抜)

(2018年12月6日発売)

(第2世代)

8,980円(税抜)

Nature Remo 1st Generationは、2017年10月16日に13,000円(税抜き)で発売

10

Product

Page 11: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

外出先からスマホでエアコンをON スマートスピーカーと連携して声で家電を操作

11

Features

Page 12: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

スマートデバイス Nature Remo 家電

How It Works

Page 13: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Traction

13

2年弱で

10万台突破認知&シェア業界No.1

Page 14: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Funding

14

2019年8月 5億円調達

• 環境エネルギー投資• DeNA 日経電子版・TechCrunch等掲載

継続成長中

Page 15: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Home Automation to P2P Electricity Platform

15

2019 Phase 1 (現在)

Home Automation

2020 Phase 2 Energy Management

2022 Phase 3 P2P Electricity Auction Platform

Page 16: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Confidential 16

Page 17: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Nature Remo E

• 「スマートエネルギーハブ」• ECHONET Liteプロトコルを利用

• 日本国内のスマートメータとHEMSを繋ぐ標準プロトコル• 経産省認定

• 家庭のWifiにつないでUDPやWi-SUNなどで通信• 家庭のスマートメーターやソーラーパネル・蓄電池の操作や情報収拾

• 電力データの閲覧や操作などはスマートフォンアプリから• スマートメーターは実はほぼ全てのご家庭で利用可能

Page 18: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Nature RemoとGo

Nature Remo and Go

18

Page 19: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Features

•いわゆるIoT製品のスマートリモコン•スマートフォンやスマートスピーカーから家電操作

•エアコン・TV・ライト等•既存の赤外線リモコンをそのまま置き換えられる•簡単なリモコン学習(検出)機能

•センシングやユーザーの位置情報をもとに家電操作•温度・湿度、家から離れた時、近づいたときなど

Page 20: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

スマートデバイス Nature Remo 家電

How It Works

Page 21: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Conditions

• Nature Remoは自宅のWi-Fiに接続してローカルIPは保持

• →自分からインターネットに出ていくことはできるが、外からのリクエストを受け付けるのは容易ではない

• しかし屋外のスマホ、スマートスピーカー、ルールなどに対して素早く反応する必要がある

• →どうやって?

• Nature Remoはマイコンボード上でCのFirmwareが動作• あまり複雑なことをさせたくはない

Page 22: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Possible Solutions (?)

• UPnP等によるポート開放とDDNSの組み合わせ• セキュリティ上の懸念

• UDPホールパンチング等のNAT越え技術を用いたP2P

• 接続維持が難しそう。特に移動体↑これらはかっこいいけど、現実的ではない

Page 23: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Realistic Solution

•スマホアプリからはAPIリクエスト (開発者向けAPIも提供)

•我々のクラウドシステムがNature RemoにWebsockt経由で指令を送る•「この赤外線信号を出して」

HTTP API WebSocket

- 赤外線- センサー情報

- 温度- 湿度

Page 24: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Why WebSocket?

• リアルタイムに双方向通信がお手軽にできる• 「普通の」Web技術

• 接続や切断時の再接続はNature Remo側が制御• 常時接続になるため接続管理が割と大変ではある

• 10万台+増加の一途

Page 25: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

アーキテクチャArchitecture

25

Page 26: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

API

Stream

Worker

System Diagram

Amazon ECS

Subscribe

Publish

WS

WS

Pub/Sub

Page 27: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Components

• API • スマホアプリやスマートスピーカーとの通信

• Stream • Nature RemoとのWebSocket通信

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

Page 28: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Remarkable Points

• 素朴なGo製のWebアプリケーション

• Redis Pub/Subを用いた、API - Stream間のやりとり

• Consulによるサービスディスカバリとコネクション管理

• AlexaのカスタムスキルはAWS Lambda経由を使って実行される

Page 29: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Simple Web Applications with Go

• 普通のWebアプリケーション

• もともとherokuでホストしていた名残も

• フレームワークは使わずGorilla web toolkitを部分的に利用

• MySQL/Redis • gorp/redigo • DynamoDBはじめました

• guregu/dynamo

Page 30: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Utilize Redis Pub/Sub

• Redis Pub/Subを活用している

• APIからはRedisにPublish

• StreamはRedisをSubscribe

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

Page 31: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Service Discovery with Consul

• 歴史的経緯によりNature RemoはALBへの直接接続が困難

• NginxからproxyしてStreamサーバーに接続している• NginxでTLS終端とWebSocketのProxyを実施• エフェメラルポートの都合上、6万接続程度が上限• 接続数が少ないサーバーにNature Remoは接続する• 接続先IPを返すAPIをまずコールし、返されたIPにWS接続

• Consulを使ってディスカバリを実現

Page 32: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

ECSを用いたコンテナ活用ECS and Containers

32

Page 33: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Our almost services running on Amazon ECS

• 前述の通り、ほとんどのサービスをECS上で動かしている

Page 34: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

CI/CD Pipelines

git-pr-release git push

go test go build

docker build docker push

ecspresso deploy

1

2

3

4

Page 35: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Introduce "ecspresso" for Deploying

• github.com/kayac/ecspresso • ecs-deployから乗り換え

• ecs-deployからの乗り換え先としてちょうどよい

• 既存のTask Definitionを利用できる• そのままシームレスに移行可能

• CircleCI上で実行してdeploy

Page 36: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

The ECS Task Definition become reviewable

• Taskへのサイドカー追加やパラメーター変更がreviewable

になったのは良かった

Page 37: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

--no-wait Option

• https://github.com/kayac/ecspresso/pull/38 • デフォルトではサービスが入れ替わるまで待ってからコマンド終了するが、待たないオプション

• ecs-deployとの互換挙動

• CD上で利用する時に便利

Page 38: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

課題や今後取り組みたいことProblems

38

Page 39: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Nginx Proxy

• 歴史的経緯によりNature RemoはALBに接続できない

• Nginxに直つなぎしている• Nginxはstreamにproxyしているので6万接続程度が上限

• エフェメラルポート関連• コネクション数管理が煩雑!

• → ALBに一本化したい• DNSベースで自動で内部のノード増やしてくれる

Page 40: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Service Discovery

• Consulのサービスディスカバリはかっこいいが不安定になることも• Consul自体のバージョンも古い…

• Cloud Mapなどに切り替えていきたい

Page 41: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Stream Reconnection

• streamをdeployすると一斉にNature Remoとの接続を切断することになるため再接続ラッシュとなる• 一時的にAPIが過負荷気味になる

• コンテナがコネクションを維持したまま、ローリングで入れ替えていく方法を模索中

Page 42: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Log Monitoring

• go.uber.go/zap でJSONログをCloudWatch Logsに送信

• CloudWatch Logs Insightsも安定してきて便利

• しかし如何せん高い

• 一部のログはアプリから直接firehoseを叩いてS3送信• Athenaで調査• firehoseがたまに一時的にエラーが続くことに困っている

• 改善したい

Page 43: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Further use AWS

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

• 機械学習系機能• ユースケース

• 室温や快適度の自動調整• 電力の最適化や需給調整

Page 44: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

RDB Migration

• gooseを利用

• 積み上げ式のMigrationはイマイチ• メンテも滞っている• マスターデータ入れるのもやっているので若干乗り換えづらい

• schemalexに乗り換えたい

• sqldefでも良いがschemalexは社内に作者がいる

Page 45: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

持続可能な開発のために入社後取り組んだことMinor Topics

45

Page 46: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Go Modules導入

• depから移行

• vendorを残すなら以下のステップのみ% GO111MODULE=on go mod init % GO111MODULE=on go mod vendor % rm Gopkg.*

• ビルド時に `-mod=vendor` を一律つける必要はある

• vendoringなんだかんだで便利だと思うようになった…

• CI環境で考えることも減らせる

Page 47: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

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

• とにかく依存ライブラリ最新にし続けたいので便利• Go対応正直微妙な部分も…

• 頑張ってほしい…

• 起票後CircleCI上でgo mod tidy走らせるなどの工夫もしている• アップデート当番のアサインも自動化

Page 48: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

git-pr-release自動化

• developブランチにfeatureブランチマージしたら勝手にリリースpull requestが生えてきて便利

• https://songmu.jp/riji/entry/2019-07-28-circleci-git-pr-release.html

Page 49: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

ECS Scheduled Task管理のためのツールecsched

• github.com/Songmu/ecsched (作りかけ)

• バッチ類は、ECSのScheduled Taskを利用しているがそれをバージョン管理したいという動機

Page 50: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

まとめ

50

Page 51: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

Nature Remoの裏側

• サーバーサイドはほぼ全てGo

• 実は割と普通のWeb技術を使って実現している• インフラはAWSに寄せているし、もっと寄せていきたい

• 本質的なサービス開発に注力したい• WebSocketの接続管理周りがチャレンジング

• サービスも急成長中• 開発体験を上げるためにも色々やっています

Page 52: Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis Pub/Subを活用している • APIからはRedisにPublish • StreamはRedisをSubscribe • 相互通信しない疎結合を実現している

ぜひオフィスに遊びに来てください@恵比寿