Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20万超のIoTデバイス同時接続を支えるNature RemoのシステムとAWS / IoT AWS Loft Nature Remo 2021

07ecb4f6c2111bff7ab4f0412edc773d?s=47 Songmu
February 10, 2021

20万超のIoTデバイス同時接続を支えるNature RemoのシステムとAWS / IoT AWS Loft Nature Remo 2021

07ecb4f6c2111bff7ab4f0412edc773d?s=128

Songmu

February 10, 2021
Tweet

Transcript

  1. ݫൿɿຊࢿྉͷҰ෦·ͨ͸શ෦ΛɺNatureגࣜձࣾͷڐՄͳ͠ʹɺෳ੡ɺసࡌ͢Δ͜ͱΛې͡·͢ɻ Introduce about September 3, 201 9 Natureגࣜձࣾ 20ສ௒ͷIoTσόΠεಉ࣌઀ଓΛࢧ͑Δ IoT@Loft

    #17 - IoT੡඼։ൃͷల๬ 10th Feb, 2021 Nature RemoͷγεςϜͱAWS
  2. 2 Me • দ໦ խ޾ (id:Songmu) • Nature גࣜձࣾ औక໾CTO

    • https://songmu.jp/riji • https://github.com/Songmu • ޷͖ͳݴޠ͸GoͱPerlͱதࠃޠ • 3 Times ISUCON Winner • ஶॻʹʮΈΜͳͷGoݴޠʯ౳ • झຯ͸OSS׆ಈͰ͢
  3. ࠓ೔࿩͢͜ͱ Agenda 3

  4. 4 Agenda • ϓϩμΫτͷ঺հ • γεςϜ֓ཁ • AWS׆༻ • ࠓޙͷ՝୊

  5. ձࣾͱ੡඼ Company and Product 5

  6. Mission 6 Mission ⾃然との共⽣を テクノロジーでドライブする Vision インターネットとセンサー技術を活⽤し、分散型で再⽣可能な電 源を普及させ、エネルギーを⾃給⾃⾜出来る未来を創造する

  7. 6,980ԁ ʢ2020೥12݄24೔ൃചʣ 7 Product 9,980ԁ ʢ2020೥8݄5೔ൃചʣ (ୈ̏ੈ୅ʣ (ୈ̎ੈ୅ʣ

  8. ֎ग़ઌ͔ΒεϚϗͰΤΞίϯΛON εϚʔτεϐʔΧʔͱ࿈ܞͯ͠੠ͰՈిΛૢ࡞ 8 Features

  9. How It Works

  10. User Feedback NPSスコア30ポイント

  11. Traction 20ສ୆ಥഁ ೝ஌ˍγΣΞۀքNo.1 ʢ2020೥2݄࣮ࢪɺࣗࣾௐ΂ʣ

  12. 14,800ԁ ʢ2020೥4݄27೔ൃചʣ 14,800ԁ 29,800ԁ ʢ2019೥12݄17೔ൃചʣ 32,780ԁ 12 Product ઌߦ༧໿ ಛผՁ֨

  13. Unattached Area = Demand Side 常に供給を需要に合わせて調整 IoTでつながり家庭の需要を制御

  14. Home Automation to Virtual Power Plant 14 2019- Phase 1

    ホームオートメーション 2020- Phase 2 エネルギーマネージメント 2022 Phase 3 Virtual Power Plant
  15. Phase 2 : Energy Management AC Control Appliances

  16. IoT機器を束ねた仮装発電所でよりクリーンな世界へ 関⻄電⼒と2年間実証済み。 Phase 3: Virtual Power Plant

  17. 地元のコミュニティの個⼈間で電気をシェアするプラットフォームを実現 A => B (10) A => C (30) D

    => C (20) A : ༨৒40 C : ෆ଍50 B : ෆ଍10 D : ༨৒20 Beyond
  18. Nature RemoγεςϜͷཪଆ Inside Nature Remo 18

  19. Features • ͍ΘΏΔIoT੡඼ͷεϚʔτϦϞίϯ • εϚʔτϑΥϯ΍εϚʔτεϐʔΧʔ͔ΒՈిૢ࡞ • ΤΞίϯɾTVɾϥΠτ౳ • طଘͷ੺֎ઢϦϞίϯΛͦͷ··ஔ͖׵͑ΒΕΔ •

    ؆୯ʹ࢖͑ΔϦϞίϯֶश(ݕग़)ػೳ • ηϯγϯά΍ϢʔβʔͷҐஔ৘ใΛ΋ͱʹՈిૢ࡞ • Թ౓ɾ࣪౓ɺՈ͔Β཭Εͨ࣌ɺ͍ۙͮͨͱ͖ͳͲ
  20. How It Works

  21. Conditions • Nature Remo͸ࣗ୐ͷWi-Fiʹ઀ଓͯ͠ϩʔΧϧIP͸อ࣋ • → ࣗ෼͔ΒΠϯλʔωοτʹग़͍ͯ͘͜ͱ͸Ͱ͖Δ͕ɺ֎͔Βͷ ϦΫΤετΛड͚෇͚Δͷ͸༰қͰ͸ͳ͍ • ͔͠͠԰֎ͷεϚϗɺεϚʔτεϐʔΧʔɺϧʔϧͳͲʹରͯ͠ૉ

    ૣ͘൓Ԡ͢Δඞཁ͕͋Δ • → Ͳ͏΍ͬͯʁ 🤔 • Nature Remo͸ϚΠίϯϘʔυ্ͰCͷFirmware͕ಈ࡞ • ͋·Γෳࡶͳ͜ͱΛͤͨ͘͞͸ͳ͍
  22. Possible Solutions (?) • UPnP౳ʹΑΔϙʔτ։์ͱDDNSͷ૊Έ߹Θͤ • ηΩϡϦςΟ্ͷݒ೦ • UDPϗʔϧύϯνϯά౳ͷNATӽٕ͑ज़Λ༻͍ͨP2P •

    ઀ଓҡ͕࣋೉ͦ͠͏ɻಛʹҠಈମ(εϚʔτϑΥϯ) ↑͜ΕΒ͸͔͍͍͚ͬ͜Ͳɺݱ࣮తͰ͸ͳ͍
  23. Realistic Solution • εϚϗΞϓϦ͔Β͸APIϦΫΤετ (։ൃऀ޲͚API΋ఏڙ) • զʑͷΫϥ΢υγεςϜ͕Nature RemoʹWebsocktܦ༝ͰࢦྩΛૹΔ • ʮ͜ͷ੺֎ઢ৴߸Λग़ͯ͠ʯ

    HTTP API WebSocket - ੺֎ઢ - ηϯαʔ৘ใ - Թ౓ - ࣪౓
  24. Why WebSocket? • ϦΞϧλΠϜʹ૒ํ޲௨৴͕͓खܰʹͰ͖Δ • ʮී௨ͷʯWebٕज़ • ઀ଓ΍੾அ࣌ͷ࠶઀ଓ͸Nature Remoଆ੍͕ޚ •

    ৗ࣌઀ଓʹͳΔͨΊ઀ଓ؅ཧׂ͕ͱେมͰ͸͋Δ • 20ສ୆+૿ՃͷҰ్
  25. ΞʔΩςΫνϟ Architecture 25

  26. API Stream Worker Amazon ECS Subscribe Publish WS WS Pub/Sub

    System Diagram
  27. Components • API • εϚϗΞϓϦ΍εϚʔτεϐʔΧʔͱͷ௨৴ • Stream • Nature RemoͱͷWebSocket௨৴

    • Worker • ϧʔϧͷ࣮ߦ ͢΂ͯGo੡ͰAmazon ECS্Ͱಈ͔͍ͯ͠Δ
  28. Remarkable Points • ૉ๿ͳGo੡ͷWebΞϓϦέʔγϣϯ • Redis Pub/SubΛ༻͍ͨɺAPI - Streamؒͷ΍ΓͱΓ •

    Nature Remo͸ALBΛܦ༝ͯ͠streamαʔόʔʹ Websocket઀ଓ͍ͯ͠Δ • AlexaͷΧελϜεΩϧ͸AWS Lambdaܦ༝Λ࢖࣮ͬͯߦ ͞ΕΔ
  29. Simple Web Applications with Go • ී௨ͷWebΞϓϦέʔγϣϯ • ΋ͱ΋ͱherokuͰϗετ໊͍ͯͨ͠࢒΋ •

    ϑϨʔϜϫʔΫ • github.com/nbio/hitch • Gorilla web toolkitΛ෦෼తʹར༻ • MySQL/Redis • gorp/redigo • guregu/dynamo
  30. Utilize Redis Pub/Sub • Redis Pub/SubΛ׆༻͍ͯ͠Δ • API͔Β͸RedisʹPublish • Stream͸RedisΛSubscribe

    • ૬ޓ௨৴͠ͳ͍ૄ݁߹Λ࣮ݱ͍ͯ͠Δ • Streamଆ͸͋͘·ͰWebSocketͱRedis͔ΒͷSubscribeͰ ड͚෇໋͚ͨྩͷ࣮ߦ͔͓͜͠ͳΘͣঢ়ଶΛ࣋ͨͳ͍
  31. WebSocket connection via ALB • Nature Remo͸ALBΛܦ༝ͯ͠streamαʔϏεʹ WebSocket઀ଓ͍ͯ͠Δ • ҰͭͷGoΞϓϦͷίϯςφͰ਺ສ઀ଓ͞͹͚Δʂ

    • Goͷ͓खܰͳྑ͞Λ࣮ײ
  32. ར༻͍ͯ͠ΔAWSαʔϏε AWS Services 32

  33. Amazon ECS (on EC2) • ecspresso(ޙड़)ͰͷλεΫఆٛ؅ཧ͕ศར • ؂ࢹΤʔδΣϯτؚΊඞཁͳσʔϞϯ͸ECS্ʹدͤͯߏங • ࠔ͍ͬͯͳ͍ͷͰEKS΍k8s΁ͷҠߦ͸ࠓͷॴߟ͍͑ͯͳ͍

  34. AWS Lambda • Amazon EchoͱͷεΩϧ࿈ܞ෦෼ͰͷΈར༻ • όονܥͷλεΫ͸ECS Scheduled TaskͰ࣮ߦ

  35. Application Load Balancer • ಛघͳ༻్ͱͯ͠WebsocketαʔόʔͱͷதܧʹALBΛར༻ • ݩʑ͸ؤுͬͯConsulͰσΟεΧόϦػߏΛ૊ΜͰ͍ͨ • Nature RemoͱWebsocketαʔόʔΛ௚ܨ͢ΔͨΊ

    • ALBʹΑΓϓϩΩγϊʔυ͕উखʹεέʔϧ͢ΔΑ͏ʹ • ಺෦IP਺ͷ؂ࢹΛಠࣗͰߦͳ͍ͬͯΔ
  36. Amazon RDS • MySQLΛී௨ʹ࢖͍ͬͯ·͢ • ଟ͘ͷϢʔεέʔεʹ͓͍ͯRDBMSͰ໰୊ͳ͍

  37. Amazon ElastiCache Redis • PubSub༻: ඇΫϥελRedis • ηϯαʔσʔλͷҰ࣌อଘ: ΫϥελϞʔυ •

    ࠷ۙ෼ׂ • Ϋϥελ༻͸Redis 6ޓ׵ͷM6gΛ౤ೖ • ૝ఆΑΓ΋શવCPUΛ࢖Θͣ • Graviton͍͢͝
  38. Amazon DynamoDB • ిྗσʔλͷ࣌ܥྻσʔλอଘ • ిྗ࢖༻ྔάϥϑͷඳըʹར༻ • ηϯαʔσʔλͳͲͰͷ׆༻Λ޿͍͛ͨ • ॻ͖ࠐΈίετ͕݁ߏ͔͔͍ͬͯΔͷͰޮ཰ԽΛਤΓ͍ͨ

    • Ͳ͔͜ʹͨΊ͓͍ͯͯ·ͱΊͯॻ͘ͳͲ • Amazon TimeStreamؾʹͳΔ
  39. Log Monitoring • go.uber.go/zap Ͱඪ४ग़ྗͷJSONϩάΛCloudWatch Logs ʹૹ৴ • CloudWatch Logs

    Insights΋҆ఆ͖ͯͯ͠ศར • ͔͠͠೗ԿͤΜߴ͍💸 • Ұ෦ͷϩά͸GoΞϓϦ͔Β௚઀Amazon Kinesis Data FirehoseΛୟ͍ͯS3ૹ৴ • Amazon AthenaͰௐࠪ
  40. Further use AWS • AWS IoT • ແཧͯ͠࢖͏ඞཁ͸ͳ͍ͱߟ͍͑ͯΔ͕ɺબ୒ࢶΛ޿͛ ͯඞཁʹԠͯ͡࢖͍͍ͨ •

    ػցֶशܥػೳ • Ϣʔεέʔε • ࣨԹ΍շద౓ͷࣗಈௐ੔ • ిྗͷ࠷దԽ΍धڅௐ੔
  41. ศརϥΠϒϥϦͳͲ Topics 41

  42. ECSͷdeployʹecspressoಋೖ • github.com/kayac/ecspresso • ecs-deploy͔Β৐Γ׵͑ • ৐Γ׵͑ઌͱͯͪ͠ΐ͏ͲΑ͔ͬͨ • طଘͷTask DefinitionΛར༻ͯͦ͠ͷ··γʔϜϨεʹ

    ҠߦՄೳ • binaryΛrepoʹಥͬࠐΜͰCircleCI͔Βdeploy
  43. ECS Task Definition͕reviewableʹ • Task΁ͷαΠυΧʔ௥Ճ΍ύϥϝʔλʔมߋ͕reviewable ʹͳͬͨͷ͸ྑ͔ͬͨ

  44. ECS Scheduled Task؅ཧͷͨΊͷπʔϧecschedule • github.com/Songmu/ecschedule • όονྨ͸ɺECSͷScheduled TaskΛར༻͍ͯ͠Δ͕ͦ ΕΛόʔδϣϯ؅ཧ͍ͨ͠ͱ͍͏ಈػ

  45. github.com/natureglobal/firequeue • Amazon Kinesis Data Firehose΁ͷૹ৴ࣦഊ࣌ͷϦτϥΠ • ΠϯϝϞϦΩϡʔͳͷͰشൃͷՄೳੑ͸͋Δ • ͦ͜͸ׂΓ੾Γ

    • Ұ෦ͷϩάΛGoͷΞϓϦ͔ΒKinesis Data Firehoseʹ௚઀ ౤͍͛ͯΔͨΊ • ϩάίϨΫλܦ༝Ͱ͸ͳ͍(ཱ͍ͯͯͳ͍) • ͦ͜ͷૹ৴ͷ࣮֬ੑΛ্͛ΔͨΊʹϥΠϒϥϦ࡞੒
  46. ࠓޙͷ՝୊ 46

  47. IoTػثଆͷ՝୊ • Observabilityͷ޲্ • ໰୊ղܾ࣌ͷ੾Γ෼͚͕೉͍͠ • ΤοδଆͰͷ੍ޚ • ػثͰ΋Ͱ͖Δ͜ͱΛ૿΍͍ͨ͠ •

    ػثଆͷεϖοΫΞοϓؚΊͯ
  48. ·ͱΊ 48

  49. Nature Remoͷཪଆ • サーバーサイドはほぼ全てGo • 実は割と普通のWeb技術を使って実現している • インフラはAWSに寄せているし、もっと寄せていきたい • 本質的なサービス開発に注⼒したい

    • IoT機器側でのエッジコンピューティング • Observability向上 • 機械学習
  50. We are Hiring! ੵۃ࠾༻தͰ͢ʂ • όοΫΤϯυΤϯδχΞ • εϚʔτϑΥϯΤϯδχΞ • ػցֶशΤϯδχΞ

    • ૊ΈࠐΈΤϯδχΞ