Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis...
Transcript of Introduce about Remoの裏側 - AWS | Contact UsUtilize Redis Pub/Sub • Redis...
厳秘:本資料の一部または全部を、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の世界でフル活用する
2
Me
• 松木雅幸 (id:Songmu)
• Nature 株式会社取締役CTO
• https://songmu.jp/riji• https://github.com/Songmu
• 好きな言語はGoとPerlと中国語
• 3 Times ISUCON Winner • 著書に「みんなのGo言語」等
3
Created Miscellaneous Go Tools• maltmill
• ツールを簡単にhomebrewで配布するためのツール• horenso
• バッチジョブのためのラッパー• peep
• プロセスの終了通知をしてくれる君• gocredits
• Goのツール配布時に依存ライブラリのLICENSEを同梱• etc.
• ref. 「Goでツールを量産する僕の方法」• https://junkyard.song.mu/slides/gocon2019-fukuoka/#0
4
Maintaining major Go toolsご意見あれば懇親会などでお声がけください
• ghq (github.com/motemen/ghq) • ソースコードリポジトリ管理ツール
• ghr (github.com/tcnksm/ghr) • GitHubへのバイナリリリース用ツール
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
今日話すことAgenda
6
7
Agenda• Nature及びNature Remoの紹介
• Nature Remoのシステムアーキテクチャ解説
• ECS活用事例• 現在の課題• その他の細かい取り組み
会社と製品Company and Product
8
Mission
9
Mission
⾃然との共⽣を�テクノロジーでドライブする�Vision
インターネットとセンサー技術を活⽤し、分散型で再⽣可能な電
源を普及させ、エネルギーを⾃給⾃⾜出来る未来を創造する
8,980円(税抜)
(2018年7月13日発売)11,980円(税抜)
(2018年12月6日発売)
(第2世代)
8,980円(税抜)
Nature Remo 1st Generationは、2017年10月16日に13,000円(税抜き)で発売
10
Product
外出先からスマホでエアコンをON スマートスピーカーと連携して声で家電を操作
11
Features
スマートデバイス Nature Remo 家電
How It Works
Traction
13
2年弱で
10万台突破認知&シェア業界No.1
Funding
14
2019年8月 5億円調達
• 環境エネルギー投資• DeNA 日経電子版・TechCrunch等掲載
継続成長中
Home Automation to P2P Electricity Platform
15
2019 Phase 1 (現在)
Home Automation
2020 Phase 2 Energy Management
2022 Phase 3 P2P Electricity Auction Platform
Confidential 16
Nature Remo E
• 「スマートエネルギーハブ」• ECHONET Liteプロトコルを利用
• 日本国内のスマートメータとHEMSを繋ぐ標準プロトコル• 経産省認定
• 家庭のWifiにつないでUDPやWi-SUNなどで通信• 家庭のスマートメーターやソーラーパネル・蓄電池の操作や情報収拾
• 電力データの閲覧や操作などはスマートフォンアプリから• スマートメーターは実はほぼ全てのご家庭で利用可能
Nature RemoとGo
Nature Remo and Go
18
Features
•いわゆるIoT製品のスマートリモコン•スマートフォンやスマートスピーカーから家電操作
•エアコン・TV・ライト等•既存の赤外線リモコンをそのまま置き換えられる•簡単なリモコン学習(検出)機能
•センシングやユーザーの位置情報をもとに家電操作•温度・湿度、家から離れた時、近づいたときなど
スマートデバイス Nature Remo 家電
How It Works
Conditions
• Nature Remoは自宅のWi-Fiに接続してローカルIPは保持
• →自分からインターネットに出ていくことはできるが、外からのリクエストを受け付けるのは容易ではない
• しかし屋外のスマホ、スマートスピーカー、ルールなどに対して素早く反応する必要がある
• →どうやって?
• Nature Remoはマイコンボード上でCのFirmwareが動作• あまり複雑なことをさせたくはない
Possible Solutions (?)
• UPnP等によるポート開放とDDNSの組み合わせ• セキュリティ上の懸念
• UDPホールパンチング等のNAT越え技術を用いたP2P
• 接続維持が難しそう。特に移動体↑これらはかっこいいけど、現実的ではない
Realistic Solution
•スマホアプリからはAPIリクエスト (開発者向けAPIも提供)
•我々のクラウドシステムがNature RemoにWebsockt経由で指令を送る•「この赤外線信号を出して」
HTTP API WebSocket
- 赤外線- センサー情報
- 温度- 湿度
Why WebSocket?
• リアルタイムに双方向通信がお手軽にできる• 「普通の」Web技術
• 接続や切断時の再接続はNature Remo側が制御• 常時接続になるため接続管理が割と大変ではある
• 10万台+増加の一途
アーキテクチャArchitecture
25
API
Stream
Worker
System Diagram
Amazon ECS
Subscribe
Publish
WS
WS
Pub/Sub
Components
• API • スマホアプリやスマートスピーカーとの通信
• Stream • Nature RemoとのWebSocket通信
• Worker • ルールの実行すべてGo製でAmazon ECS上で動かしている
Remarkable Points
• 素朴なGo製のWebアプリケーション
• Redis Pub/Subを用いた、API - Stream間のやりとり
• Consulによるサービスディスカバリとコネクション管理
• AlexaのカスタムスキルはAWS Lambda経由を使って実行される
Simple Web Applications with Go
• 普通のWebアプリケーション
• もともとherokuでホストしていた名残も
• フレームワークは使わずGorilla web toolkitを部分的に利用
• MySQL/Redis • gorp/redigo • DynamoDBはじめました
• guregu/dynamo
Utilize Redis Pub/Sub
• Redis Pub/Subを活用している
• APIからはRedisにPublish
• StreamはRedisをSubscribe
•相互通信しない疎結合を実現している• Stream側はあくまでWebSocketとRedisからのSubscribeで受け付けた命令の実行しかおこなわず状態を持たない
Service Discovery with Consul
• 歴史的経緯によりNature RemoはALBへの直接接続が困難
• NginxからproxyしてStreamサーバーに接続している• NginxでTLS終端とWebSocketのProxyを実施• エフェメラルポートの都合上、6万接続程度が上限• 接続数が少ないサーバーにNature Remoは接続する• 接続先IPを返すAPIをまずコールし、返されたIPにWS接続
• Consulを使ってディスカバリを実現
ECSを用いたコンテナ活用ECS and Containers
32
Our almost services running on Amazon ECS
• 前述の通り、ほとんどのサービスをECS上で動かしている
CI/CD Pipelines
git-pr-release git push
go test go build
docker build docker push
ecspresso deploy
1
2
3
4
Introduce "ecspresso" for Deploying
• github.com/kayac/ecspresso • ecs-deployから乗り換え
• ecs-deployからの乗り換え先としてちょうどよい
• 既存のTask Definitionを利用できる• そのままシームレスに移行可能
• CircleCI上で実行してdeploy
The ECS Task Definition become reviewable
• Taskへのサイドカー追加やパラメーター変更がreviewable
になったのは良かった
--no-wait Option
• https://github.com/kayac/ecspresso/pull/38 • デフォルトではサービスが入れ替わるまで待ってからコマンド終了するが、待たないオプション
• ecs-deployとの互換挙動
• CD上で利用する時に便利
課題や今後取り組みたいことProblems
38
Nginx Proxy
• 歴史的経緯によりNature RemoはALBに接続できない
• Nginxに直つなぎしている• Nginxはstreamにproxyしているので6万接続程度が上限
• エフェメラルポート関連• コネクション数管理が煩雑!
• → ALBに一本化したい• DNSベースで自動で内部のノード増やしてくれる
Service Discovery
• Consulのサービスディスカバリはかっこいいが不安定になることも• Consul自体のバージョンも古い…
• Cloud Mapなどに切り替えていきたい
Stream Reconnection
• streamをdeployすると一斉にNature Remoとの接続を切断することになるため再接続ラッシュとなる• 一時的にAPIが過負荷気味になる
• コンテナがコネクションを維持したまま、ローリングで入れ替えていく方法を模索中
Log Monitoring
• go.uber.go/zap でJSONログをCloudWatch Logsに送信
• CloudWatch Logs Insightsも安定してきて便利
• しかし如何せん高い
• 一部のログはアプリから直接firehoseを叩いてS3送信• Athenaで調査• firehoseがたまに一時的にエラーが続くことに困っている
• 改善したい
Further use AWS
• AWS IoT • 無理して使う必要はないと考えているが、選択肢を広げて必要に応じて使いたい
• 機械学習系機能• ユースケース
• 室温や快適度の自動調整• 電力の最適化や需給調整
RDB Migration
• gooseを利用
• 積み上げ式のMigrationはイマイチ• メンテも滞っている• マスターデータ入れるのもやっているので若干乗り換えづらい
• schemalexに乗り換えたい
• sqldefでも良いがschemalexは社内に作者がいる
持続可能な開発のために入社後取り組んだことMinor Topics
45
Go Modules導入
• depから移行
• vendorを残すなら以下のステップのみ% GO111MODULE=on go mod init % GO111MODULE=on go mod vendor % rm Gopkg.*
• ビルド時に `-mod=vendor` を一律つける必要はある
• vendoringなんだかんだで便利だと思うようになった…
• CI環境で考えることも減らせる
Dependabot導入• dependabot.com • 依存ライブラリのバージョンが上がっていたらpull requestを起票してくれるサービス• GitHubが買収して今は無料で使える
• とにかく依存ライブラリ最新にし続けたいので便利• Go対応正直微妙な部分も…
• 頑張ってほしい…
• 起票後CircleCI上でgo mod tidy走らせるなどの工夫もしている• アップデート当番のアサインも自動化
git-pr-release自動化
• developブランチにfeatureブランチマージしたら勝手にリリースpull requestが生えてきて便利
• https://songmu.jp/riji/entry/2019-07-28-circleci-git-pr-release.html
ECS Scheduled Task管理のためのツールecsched
• github.com/Songmu/ecsched (作りかけ)
• バッチ類は、ECSのScheduled Taskを利用しているがそれをバージョン管理したいという動機
まとめ
50
Nature Remoの裏側
• サーバーサイドはほぼ全てGo
• 実は割と普通のWeb技術を使って実現している• インフラはAWSに寄せているし、もっと寄せていきたい
• 本質的なサービス開発に注力したい• WebSocketの接続管理周りがチャレンジング
• サービスも急成長中• 開発体験を上げるためにも色々やっています
ぜひオフィスに遊びに来てください@恵比寿