Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
20万超のIoTデバイス同時接続を支えるNature RemoのシステムとAWS / IoT ...
Search
Songmu
February 10, 2021
Technology
0
1.2k
20万超のIoTデバイス同時接続を支えるNature RemoのシステムとAWS / IoT AWS Loft Nature Remo 2021
Songmu
February 10, 2021
Tweet
Share
More Decks by Songmu
See All by Songmu
現役エンジニア兼採用担当から見たエンジニア採用アンチパターン / Engineer Recruitment Anti-Patterns
songmu
20
16k
GoとNature ~ Nature Remoの裏側 / Nature Bath vol6
songmu
0
6.8k
Nature Remoの裏側 ~ AWSとWeb技術をIoTの世界でフル活用する / Inside Nature Remo
songmu
11
15k
Other Decks in Technology
See All in Technology
技術者はかっこいいものだ!!~キルラキルから学んだエンジニアの生き方~
masakiokuda
2
280
AIでめっちゃ便利になったけど、結局みんなで学ぶよねっていう話
kakehashi
PRO
1
420
C++26アップデート 2025-03
faithandbrave
0
1.1k
持続可能なドキュメント運用のリアル: 1年間の成果とこれから
akitok_
1
230
JPOUG Tech Talk #12 UNDO Tablespace Reintroduction
nori_shinoda
2
160
バックオフィス向け toB SaaS バクラクにおけるレコメンド技術活用 / recommender-systems-in-layerx-bakuraku
yuya4
5
590
日経電子版 for Android の技術的課題と取り組み(令和最新版)/android-20250423
nikkei_engineer_recruiting
1
490
更新系と状態
uhyo
8
1.9k
ドキュメント管理の理想と現実
kazuhe
1
240
ここはMCPの夜明けまえ
nwiizo
32
12k
Oracle Cloud Infrastructure:2025年4月度サービス・アップデート
oracle4engineer
PRO
0
170
Databricksで完全履修!オールインワンレイクハウスは実在した!
akuwano
0
110
Featured
See All Featured
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
23
2.7k
Adopting Sorbet at Scale
ufuk
76
9.3k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
12k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.5k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
178
53k
What's in a price? How to price your products and services
michaelherold
245
12k
Gamification - CAS2011
davidbonilla
81
5.2k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
45
9.5k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Making the Leap to Tech Lead
cromwellryan
133
9.2k
Transcript
ݫൿɿຊࢿྉͷҰ෦·ͨશ෦ΛɺNatureגࣜձࣾͷڐՄͳ͠ʹɺෳɺసࡌ͢Δ͜ͱΛې͡·͢ɻ Introduce about September 3, 201 9 Natureגࣜձࣾ 20ສͷIoTσόΠεಉ࣌ଓΛࢧ͑Δ IoT@Loft
#17 - IoT։ൃͷల 10th Feb, 2021 Nature RemoͷγεςϜͱAWS
2 Me • দ խ (id:Songmu) • Nature גࣜձࣾ औకCTO
• https://songmu.jp/riji • https://github.com/Songmu • ͖ͳݴޠGoͱPerlͱதࠃޠ • 3 Times ISUCON Winner • ஶॻʹʮΈΜͳͷGoݴޠʯ • झຯOSS׆ಈͰ͢
ࠓ͢͜ͱ Agenda 3
4 Agenda • ϓϩμΫτͷհ • γεςϜ֓ཁ • AWS׆༻ • ࠓޙͷ՝
ձࣾͱ Company and Product 5
Mission 6 Mission ⾃然との共⽣を テクノロジーでドライブする Vision インターネットとセンサー技術を活⽤し、分散型で再⽣可能な電 源を普及させ、エネルギーを⾃給⾃⾜出来る未来を創造する
6,980ԁ ʢ202012݄24ൃചʣ 7 Product 9,980ԁ ʢ20208݄5ൃചʣ (ୈ̏ੈʣ (ୈ̎ੈʣ
֎ग़ઌ͔ΒεϚϗͰΤΞίϯΛON εϚʔτεϐʔΧʔͱ࿈ܞͯ͠ͰՈిΛૢ࡞ 8 Features
How It Works
User Feedback NPSスコア30ポイント
Traction 20ສಥഁ ೝˍγΣΞۀքNo.1 ʢ20202݄࣮ࢪɺࣗࣾௐʣ
14,800ԁ ʢ20204݄27ൃചʣ 14,800ԁ 29,800ԁ ʢ201912݄17ൃചʣ 32,780ԁ 12 Product ઌߦ༧ ಛผՁ֨
Unattached Area = Demand Side 常に供給を需要に合わせて調整 IoTでつながり家庭の需要を制御
Home Automation to Virtual Power Plant 14 2019- Phase 1
ホームオートメーション 2020- Phase 2 エネルギーマネージメント 2022 Phase 3 Virtual Power Plant
Phase 2 : Energy Management AC Control Appliances
IoT機器を束ねた仮装発電所でよりクリーンな世界へ 関⻄電⼒と2年間実証済み。 Phase 3: Virtual Power Plant
地元のコミュニティの個⼈間で電気をシェアするプラットフォームを実現 A => B (10) A => C (30) D
=> C (20) A : ༨40 C : ෆ50 B : ෆ10 D : ༨20 Beyond
Nature RemoγεςϜͷཪଆ Inside Nature Remo 18
Features • ͍ΘΏΔIoTͷεϚʔτϦϞίϯ • εϚʔτϑΥϯεϚʔτεϐʔΧʔ͔ΒՈిૢ࡞ • ΤΞίϯɾTVɾϥΠτ • طଘͷ֎ઢϦϞίϯΛͦͷ··ஔ͖͑ΒΕΔ •
؆୯ʹ͑ΔϦϞίϯֶश(ݕग़)ػೳ • ηϯγϯάϢʔβʔͷҐஔใΛͱʹՈిૢ࡞ • Թɾ࣪ɺՈ͔ΒΕͨ࣌ɺ͍ۙͮͨͱ͖ͳͲ
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ଆ੍͕ޚ •
ৗ࣌ଓʹͳΔͨΊଓཧׂ͕ͱେมͰ͋Δ • 20ສ+૿ՃͷҰ్
ΞʔΩςΫνϟ Architecture 25
API Stream Worker Amazon ECS Subscribe Publish WS WS Pub/Sub
System Diagram
Components • API • εϚϗΞϓϦεϚʔτεϐʔΧʔͱͷ௨৴ • Stream • Nature RemoͱͷWebSocket௨৴
• Worker • ϧʔϧͷ࣮ߦ ͯ͢GoͰAmazon ECS্Ͱಈ͔͍ͯ͠Δ
Remarkable Points • ૉͳGoͷWebΞϓϦέʔγϣϯ • Redis Pub/SubΛ༻͍ͨɺAPI - StreamؒͷΓͱΓ •
Nature RemoALBΛܦ༝ͯ͠streamαʔόʔʹ Websocketଓ͍ͯ͠Δ • AlexaͷΧελϜεΩϧAWS Lambdaܦ༝Λ࣮ͬͯߦ ͞ΕΔ
Simple Web Applications with Go • ී௨ͷWebΞϓϦέʔγϣϯ • ͱͱherokuͰϗετ໊͍ͯͨ͠ •
ϑϨʔϜϫʔΫ • github.com/nbio/hitch • Gorilla web toolkitΛ෦తʹར༻ • MySQL/Redis • gorp/redigo • guregu/dynamo
Utilize Redis Pub/Sub • Redis Pub/SubΛ׆༻͍ͯ͠Δ • API͔ΒRedisʹPublish • StreamRedisΛSubscribe
• ૬ޓ௨৴͠ͳ͍ૄ݁߹Λ࣮ݱ͍ͯ͠Δ • Streamଆ͋͘·ͰWebSocketͱRedis͔ΒͷSubscribeͰ ड໋͚͚ͨྩͷ࣮ߦ͔͓͜͠ͳΘͣঢ়ଶΛ࣋ͨͳ͍
WebSocket connection via ALB • Nature RemoALBΛܦ༝ͯ͠streamαʔϏεʹ WebSocketଓ͍ͯ͠Δ • ҰͭͷGoΞϓϦͷίϯςφͰສଓ͚͞Δʂ
• Goͷ͓खܰͳྑ͞Λ࣮ײ
ར༻͍ͯ͠ΔAWSαʔϏε AWS Services 32
Amazon ECS (on EC2) • ecspresso(ޙड़)ͰͷλεΫఆٛཧ͕ศར • ࢹΤʔδΣϯτؚΊඞཁͳσʔϞϯECS্ʹدͤͯߏங • ࠔ͍ͬͯͳ͍ͷͰEKSk8sͷҠߦࠓͷॴߟ͍͑ͯͳ͍
AWS Lambda • Amazon EchoͱͷεΩϧ࿈ܞ෦ͰͷΈར༻ • όονܥͷλεΫECS Scheduled TaskͰ࣮ߦ
Application Load Balancer • ಛघͳ༻్ͱͯ͠WebsocketαʔόʔͱͷதܧʹALBΛར༻ • ݩʑؤுͬͯConsulͰσΟεΧόϦػߏΛΜͰ͍ͨ • Nature RemoͱWebsocketαʔόʔΛܨ͢ΔͨΊ
• ALBʹΑΓϓϩΩγϊʔυ͕উखʹεέʔϧ͢ΔΑ͏ʹ • ෦IPͷࢹΛಠࣗͰߦͳ͍ͬͯΔ
Amazon RDS • MySQLΛී௨ʹ͍ͬͯ·͢ • ଟ͘ͷϢʔεέʔεʹ͓͍ͯRDBMSͰͳ͍
Amazon ElastiCache Redis • PubSub༻: ඇΫϥελRedis • ηϯαʔσʔλͷҰ࣌อଘ: ΫϥελϞʔυ •
࠷ׂۙ • Ϋϥελ༻Redis 6ޓͷM6gΛೖ • ఆΑΓશવCPUΛΘͣ • Graviton͍͢͝
Amazon DynamoDB • ిྗσʔλͷ࣌ܥྻσʔλอଘ • ిྗ༻ྔάϥϑͷඳըʹར༻ • ηϯαʔσʔλͳͲͰͷ׆༻Λ͍͛ͨ • ॻ͖ࠐΈίετ͕݁ߏ͔͔͍ͬͯΔͷͰޮԽΛਤΓ͍ͨ
• Ͳ͔͜ʹͨΊ͓͍ͯͯ·ͱΊͯॻ͘ͳͲ • Amazon TimeStreamؾʹͳΔ
Log Monitoring • go.uber.go/zap Ͱඪ४ग़ྗͷJSONϩάΛCloudWatch Logs ʹૹ৴ • CloudWatch Logs
Insights҆ఆ͖ͯͯ͠ศར • ͔͠͠ԿͤΜߴ͍💸 • Ұ෦ͷϩάGoΞϓϦ͔ΒAmazon Kinesis Data FirehoseΛୟ͍ͯS3ૹ৴ • Amazon AthenaͰௐࠪ
Further use AWS • AWS IoT • ແཧͯ͠͏ඞཁͳ͍ͱߟ͍͑ͯΔ͕ɺબࢶΛ͛ ͯඞཁʹԠ͍͍ͯͨ͡ •
ػցֶशܥػೳ • Ϣʔεέʔε • ࣨԹշదͷࣗಈௐ • ిྗͷ࠷దԽधڅௐ
ศརϥΠϒϥϦͳͲ Topics 41
ECSͷdeployʹecspressoಋೖ • github.com/kayac/ecspresso • ecs-deploy͔ΒΓ͑ • Γ͑ઌͱͯͪ͠ΐ͏ͲΑ͔ͬͨ • طଘͷTask DefinitionΛར༻ͯͦ͠ͷ··γʔϜϨεʹ
ҠߦՄೳ • binaryΛrepoʹಥͬࠐΜͰCircleCI͔Βdeploy
ECS Task Definition͕reviewableʹ • TaskͷαΠυΧʔՃύϥϝʔλʔมߋ͕reviewable ʹͳͬͨͷྑ͔ͬͨ
ECS Scheduled TaskཧͷͨΊͷπʔϧecschedule • github.com/Songmu/ecschedule • όονྨɺECSͷScheduled TaskΛར༻͍ͯ͠Δ͕ͦ ΕΛόʔδϣϯཧ͍ͨ͠ͱ͍͏ಈػ
github.com/natureglobal/firequeue • Amazon Kinesis Data Firehoseͷૹ৴ࣦഊ࣌ͷϦτϥΠ • ΠϯϝϞϦΩϡʔͳͷͰشൃͷՄೳੑ͋Δ • ׂͦ͜ΓΓ
• Ұ෦ͷϩάΛGoͷΞϓϦ͔ΒKinesis Data Firehoseʹ ͍͛ͯΔͨΊ • ϩάίϨΫλܦ༝Ͱͳ͍(ཱ͍ͯͯͳ͍) • ͦ͜ͷૹ৴ͷ࣮֬ੑΛ্͛ΔͨΊʹϥΠϒϥϦ࡞
ࠓޙͷ՝ 46
IoTػثଆͷ՝ • Observabilityͷ্ • ղܾ࣌ͷΓ͚͕͍͠ • ΤοδଆͰͷ੍ޚ • ػثͰͰ͖Δ͜ͱΛ૿͍ͨ͠ •
ػثଆͷεϖοΫΞοϓؚΊͯ
·ͱΊ 48
Nature Remoͷཪଆ • サーバーサイドはほぼ全てGo • 実は割と普通のWeb技術を使って実現している • インフラはAWSに寄せているし、もっと寄せていきたい • 本質的なサービス開発に注⼒したい
• IoT機器側でのエッジコンピューティング • Observability向上 • 機械学習
We are Hiring! ੵۃ࠾༻தͰ͢ʂ • όοΫΤϯυΤϯδχΞ • εϚʔτϑΥϯΤϯδχΞ • ػցֶशΤϯδχΞ
• ΈࠐΈΤϯδχΞ