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
テストって楽しい!開発を加速させるテストの魅力 / Testing is Fun! The Fascinating of Testing to Accelerate Development
aiandrox
0
170
Coding Agentに値札を付けろ
watany
3
410
Next.jsと状態管理のプラクティス
uhyo
3
1.3k
Compose におけるパスワード自動入力とパスワード保存
tonionagauzzi
0
210
TanStack Start 技術選定の裏側 / Findy-Lunch-LT-TanStack-Start
iktakahiro
0
110
Part2 GitHub Copilotってなんだろう
tomokusaba
2
750
Gateway H2 モジュールで スマートホーム入門
minoruinachi
0
140
地に足の付いた現実的な技術選定から魔力のある体験を得る『AIレシート読み取り機能』のケーススタディ / From Grounded Tech Choices to Magical UX: A Case Study of AI Receipt Scanning
moznion
2
580
『ささAI』ネタづくりをささえるAI📝 (にぼしいわし担当:GIFTech2025)
masapyon1212
0
110
Datadog のトライアルを成功に導く技術 / Techniques for a successful Datadog trial
nulabinc
PRO
0
130
問 1:以下のコンパイラを証明せよ(予告編) #kernelvm / Kernel VM Study Kansai 11th
ytaka23
3
480
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
5.5k
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
14
1.5k
Building Applications with DynamoDB
mza
94
6.4k
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
Building Better People: How to give real-time feedback that sticks.
wjessup
368
19k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.2k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
13
840
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
227
22k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
41
2.3k
Bash Introduction
62gerente
613
210k
Stop Working from a Prison Cell
hatefulcrawdad
268
20k
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! ੵۃ࠾༻தͰ͢ʂ • όοΫΤϯυΤϯδχΞ • εϚʔτϑΥϯΤϯδχΞ • ػցֶशΤϯδχΞ
• ΈࠐΈΤϯδχΞ