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
How to integrate AI into engineer recruitment / AIをエンジニア採用にどのように馴染ませていくか
songmu
5
1.3k
現役エンジニア兼採用担当から見たエンジニア採用アンチパターン / Engineer Recruitment Anti-Patterns
songmu
20
16k
GoとNature ~ Nature Remoの裏側 / Nature Bath vol6
songmu
0
6.9k
Nature Remoの裏側 ~ AWSとWeb技術をIoTの世界でフル活用する / Inside Nature Remo
songmu
11
15k
Other Decks in Technology
See All in Technology
Amazon Q Developerを活用したアーキテクチャのリファクタリング
k1nakayama
2
200
Amazon S3 Vectorsは大規模ベクトル検索を低コスト化するサーバーレスなベクトルデータベースだ #jawsugsaga / S3 Vectors As A Serverless Vector Database
quiver
1
140
MCP認可の現在地と自律型エージェント対応に向けた課題 / MCP Authorization Today and Challenges to Support Autonomous Agents
yokawasa
5
2.1k
LLMでAI-OCR、実際どうなの? / llm_ai_ocr_layerx_bet_ai_day_lt
sbrf248
0
450
開発 × 生成AI × コミュニケーション:GENDAの開発現場で感じたコミュニケーションの変化 / GENDA Tech Talk #1
genda
0
110
dipにおけるSRE変革の軌跡
dip_tech
PRO
1
250
React Server ComponentsでAPI不要の開発体験
polidog
PRO
0
130
Claude CodeでKiroの仕様駆動開発を実現させるには...
gotalab555
3
960
マルチプロダクト×マルチテナントを支えるモジュラモノリスを中心としたアソビューのアーキテクチャ
disc99
1
400
JAWS AI/ML #30 AI コーディング IDE "Kiro" を触ってみよう
inariku
3
340
Claude Codeから我々が学ぶべきこと
oikon48
10
2.8k
LLMで構造化出力の成功率をグンと上げる方法
keisuketakiguchi
0
650
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.6k
Practical Orchestrator
shlominoach
190
11k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
How STYLIGHT went responsive
nonsquared
100
5.7k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
6k
The Pragmatic Product Professional
lauravandoore
36
6.8k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Making the Leap to Tech Lead
cromwellryan
134
9.5k
Unsuck your backbone
ammeep
671
58k
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! ੵۃ࠾༻தͰ͢ʂ • όοΫΤϯυΤϯδχΞ • εϚʔτϑΥϯΤϯδχΞ • ػցֶशΤϯδχΞ
• ΈࠐΈΤϯδχΞ