Slide 1

Slide 1 text

ݫൿɿຊࢿྉͷҰ෦·ͨ͸શ෦ΛɺNatureגࣜձࣾͷڐՄͳ͠ʹɺෳ੡ɺసࡌ͢Δ͜ͱΛې͡·͢ɻ Introduce about September 3, 201 9 Natureגࣜձࣾ 20ສ௒ͷIoTσόΠεಉ࣌઀ଓΛࢧ͑Δ IoT@Loft #17 - IoT੡඼։ൃͷల๬ 10th Feb, 2021 Nature RemoͷγεςϜͱAWS

Slide 2

Slide 2 text

2 Me • দ໦ խ޾ (id:Songmu) • Nature גࣜձࣾ औక໾CTO • https://songmu.jp/riji • https://github.com/Songmu • ޷͖ͳݴޠ͸GoͱPerlͱதࠃޠ • 3 Times ISUCON Winner • ஶॻʹʮΈΜͳͷGoݴޠʯ౳ • झຯ͸OSS׆ಈͰ͢

Slide 3

Slide 3 text

ࠓ೔࿩͢͜ͱ Agenda 3

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

ձࣾͱ੡඼ Company and Product 5

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

How It Works

Slide 10

Slide 10 text

User Feedback NPSスコア30ポイント

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

Home Automation to Virtual Power Plant 14 2019- Phase 1 ホームオートメーション 2020- Phase 2 エネルギーマネージメント 2022 Phase 3 Virtual Power Plant

Slide 15

Slide 15 text

Phase 2 : Energy Management AC Control Appliances

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

地元のコミュニティの個⼈間で電気をシェアするプラットフォームを実現 A => B (10) A => C (30) D => C (20) A : ༨৒40 C : ෆ଍50 B : ෆ଍10 D : ༨৒20 Beyond

Slide 18

Slide 18 text

Nature RemoγεςϜͷཪଆ Inside Nature Remo 18

Slide 19

Slide 19 text

Features • ͍ΘΏΔIoT੡඼ͷεϚʔτϦϞίϯ • εϚʔτϑΥϯ΍εϚʔτεϐʔΧʔ͔ΒՈిૢ࡞ • ΤΞίϯɾTVɾϥΠτ౳ • طଘͷ੺֎ઢϦϞίϯΛͦͷ··ஔ͖׵͑ΒΕΔ • ؆୯ʹ࢖͑ΔϦϞίϯֶश(ݕग़)ػೳ • ηϯγϯά΍ϢʔβʔͷҐஔ৘ใΛ΋ͱʹՈిૢ࡞ • Թ౓ɾ࣪౓ɺՈ͔Β཭Εͨ࣌ɺ͍ۙͮͨͱ͖ͳͲ

Slide 20

Slide 20 text

How It Works

Slide 21

Slide 21 text

Conditions • Nature Remo͸ࣗ୐ͷWi-Fiʹ઀ଓͯ͠ϩʔΧϧIP͸อ࣋ • → ࣗ෼͔ΒΠϯλʔωοτʹग़͍ͯ͘͜ͱ͸Ͱ͖Δ͕ɺ֎͔Βͷ ϦΫΤετΛड͚෇͚Δͷ͸༰қͰ͸ͳ͍ • ͔͠͠԰֎ͷεϚϗɺεϚʔτεϐʔΧʔɺϧʔϧͳͲʹରͯ͠ૉ ૣ͘൓Ԡ͢Δඞཁ͕͋Δ • → Ͳ͏΍ͬͯʁ 🤔 • Nature Remo͸ϚΠίϯϘʔυ্ͰCͷFirmware͕ಈ࡞ • ͋·Γෳࡶͳ͜ͱΛͤͨ͘͞͸ͳ͍

Slide 22

Slide 22 text

Possible Solutions (?) • UPnP౳ʹΑΔϙʔτ։์ͱDDNSͷ૊Έ߹Θͤ • ηΩϡϦςΟ্ͷݒ೦ • UDPϗʔϧύϯνϯά౳ͷNATӽٕ͑ज़Λ༻͍ͨP2P • ઀ଓҡ͕࣋೉ͦ͠͏ɻಛʹҠಈମ(εϚʔτϑΥϯ) ↑͜ΕΒ͸͔͍͍͚ͬ͜Ͳɺݱ࣮తͰ͸ͳ͍

Slide 23

Slide 23 text

Realistic Solution • εϚϗΞϓϦ͔Β͸APIϦΫΤετ (։ൃऀ޲͚API΋ఏڙ) • զʑͷΫϥ΢υγεςϜ͕Nature RemoʹWebsocktܦ༝ͰࢦྩΛૹΔ • ʮ͜ͷ੺֎ઢ৴߸Λग़ͯ͠ʯ HTTP API WebSocket - ੺֎ઢ - ηϯαʔ৘ใ - Թ౓ - ࣪౓

Slide 24

Slide 24 text

Why WebSocket? • ϦΞϧλΠϜʹ૒ํ޲௨৴͕͓खܰʹͰ͖Δ • ʮී௨ͷʯWebٕज़ • ઀ଓ΍੾அ࣌ͷ࠶઀ଓ͸Nature Remoଆ੍͕ޚ • ৗ࣌઀ଓʹͳΔͨΊ઀ଓ؅ཧׂ͕ͱେมͰ͸͋Δ • 20ສ୆+૿ՃͷҰ్

Slide 25

Slide 25 text

ΞʔΩςΫνϟ Architecture 25

Slide 26

Slide 26 text

API Stream Worker Amazon ECS Subscribe Publish WS WS Pub/Sub System Diagram

Slide 27

Slide 27 text

Components • API • εϚϗΞϓϦ΍εϚʔτεϐʔΧʔͱͷ௨৴ • Stream • Nature RemoͱͷWebSocket௨৴ • Worker • ϧʔϧͷ࣮ߦ ͢΂ͯGo੡ͰAmazon ECS্Ͱಈ͔͍ͯ͠Δ

Slide 28

Slide 28 text

Remarkable Points • ૉ๿ͳGo੡ͷWebΞϓϦέʔγϣϯ • Redis Pub/SubΛ༻͍ͨɺAPI - Streamؒͷ΍ΓͱΓ • Nature Remo͸ALBΛܦ༝ͯ͠streamαʔόʔʹ Websocket઀ଓ͍ͯ͠Δ • AlexaͷΧελϜεΩϧ͸AWS Lambdaܦ༝Λ࢖࣮ͬͯߦ ͞ΕΔ

Slide 29

Slide 29 text

Simple Web Applications with Go • ී௨ͷWebΞϓϦέʔγϣϯ • ΋ͱ΋ͱherokuͰϗετ໊͍ͯͨ͠࢒΋ • ϑϨʔϜϫʔΫ • github.com/nbio/hitch • Gorilla web toolkitΛ෦෼తʹར༻ • MySQL/Redis • gorp/redigo • guregu/dynamo

Slide 30

Slide 30 text

Utilize Redis Pub/Sub • Redis Pub/SubΛ׆༻͍ͯ͠Δ • API͔Β͸RedisʹPublish • Stream͸RedisΛSubscribe • ૬ޓ௨৴͠ͳ͍ૄ݁߹Λ࣮ݱ͍ͯ͠Δ • Streamଆ͸͋͘·ͰWebSocketͱRedis͔ΒͷSubscribeͰ ड͚෇໋͚ͨྩͷ࣮ߦ͔͓͜͠ͳΘͣঢ়ଶΛ࣋ͨͳ͍

Slide 31

Slide 31 text

WebSocket connection via ALB • Nature Remo͸ALBΛܦ༝ͯ͠streamαʔϏεʹ WebSocket઀ଓ͍ͯ͠Δ • ҰͭͷGoΞϓϦͷίϯςφͰ਺ສ઀ଓ͞͹͚Δʂ • Goͷ͓खܰͳྑ͞Λ࣮ײ

Slide 32

Slide 32 text

ར༻͍ͯ͠ΔAWSαʔϏε AWS Services 32

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

Application Load Balancer • ಛघͳ༻్ͱͯ͠WebsocketαʔόʔͱͷதܧʹALBΛར༻ • ݩʑ͸ؤுͬͯConsulͰσΟεΧόϦػߏΛ૊ΜͰ͍ͨ • Nature RemoͱWebsocketαʔόʔΛ௚ܨ͢ΔͨΊ • ALBʹΑΓϓϩΩγϊʔυ͕উखʹεέʔϧ͢ΔΑ͏ʹ • ಺෦IP਺ͷ؂ࢹΛಠࣗͰߦͳ͍ͬͯΔ

Slide 36

Slide 36 text

Amazon RDS • MySQLΛී௨ʹ࢖͍ͬͯ·͢ • ଟ͘ͷϢʔεέʔεʹ͓͍ͯRDBMSͰ໰୊ͳ͍

Slide 37

Slide 37 text

Amazon ElastiCache Redis • PubSub༻: ඇΫϥελRedis • ηϯαʔσʔλͷҰ࣌อଘ: ΫϥελϞʔυ • ࠷ۙ෼ׂ • Ϋϥελ༻͸Redis 6ޓ׵ͷM6gΛ౤ೖ • ૝ఆΑΓ΋શવCPUΛ࢖Θͣ • Graviton͍͢͝

Slide 38

Slide 38 text

Amazon DynamoDB • ిྗσʔλͷ࣌ܥྻσʔλอଘ • ిྗ࢖༻ྔάϥϑͷඳըʹར༻ • ηϯαʔσʔλͳͲͰͷ׆༻Λ޿͍͛ͨ • ॻ͖ࠐΈίετ͕݁ߏ͔͔͍ͬͯΔͷͰޮ཰ԽΛਤΓ͍ͨ • Ͳ͔͜ʹͨΊ͓͍ͯͯ·ͱΊͯॻ͘ͳͲ • Amazon TimeStreamؾʹͳΔ

Slide 39

Slide 39 text

Log Monitoring • go.uber.go/zap Ͱඪ४ग़ྗͷJSONϩάΛCloudWatch Logs ʹૹ৴ • CloudWatch Logs Insights΋҆ఆ͖ͯͯ͠ศར • ͔͠͠೗ԿͤΜߴ͍💸 • Ұ෦ͷϩά͸GoΞϓϦ͔Β௚઀Amazon Kinesis Data FirehoseΛୟ͍ͯS3ૹ৴ • Amazon AthenaͰௐࠪ

Slide 40

Slide 40 text

Further use AWS • AWS IoT • ແཧͯ͠࢖͏ඞཁ͸ͳ͍ͱߟ͍͑ͯΔ͕ɺબ୒ࢶΛ޿͛ ͯඞཁʹԠͯ͡࢖͍͍ͨ • ػցֶशܥػೳ • Ϣʔεέʔε • ࣨԹ΍շద౓ͷࣗಈௐ੔ • ిྗͷ࠷దԽ΍धڅௐ੔

Slide 41

Slide 41 text

ศརϥΠϒϥϦͳͲ Topics 41

Slide 42

Slide 42 text

ECSͷdeployʹecspressoಋೖ • github.com/kayac/ecspresso • ecs-deploy͔Β৐Γ׵͑ • ৐Γ׵͑ઌͱͯͪ͠ΐ͏ͲΑ͔ͬͨ • طଘͷTask DefinitionΛར༻ͯͦ͠ͷ··γʔϜϨεʹ ҠߦՄೳ • binaryΛrepoʹಥͬࠐΜͰCircleCI͔Βdeploy

Slide 43

Slide 43 text

ECS Task Definition͕reviewableʹ • Task΁ͷαΠυΧʔ௥Ճ΍ύϥϝʔλʔมߋ͕reviewable ʹͳͬͨͷ͸ྑ͔ͬͨ

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

github.com/natureglobal/firequeue • Amazon Kinesis Data Firehose΁ͷૹ৴ࣦഊ࣌ͷϦτϥΠ • ΠϯϝϞϦΩϡʔͳͷͰشൃͷՄೳੑ͸͋Δ • ͦ͜͸ׂΓ੾Γ • Ұ෦ͷϩάΛGoͷΞϓϦ͔ΒKinesis Data Firehoseʹ௚઀ ౤͍͛ͯΔͨΊ • ϩάίϨΫλܦ༝Ͱ͸ͳ͍(ཱ͍ͯͯͳ͍) • ͦ͜ͷૹ৴ͷ࣮֬ੑΛ্͛ΔͨΊʹϥΠϒϥϦ࡞੒

Slide 46

Slide 46 text

ࠓޙͷ՝୊ 46

Slide 47

Slide 47 text

IoTػثଆͷ՝୊ • Observabilityͷ޲্ • ໰୊ղܾ࣌ͷ੾Γ෼͚͕೉͍͠ • ΤοδଆͰͷ੍ޚ • ػثͰ΋Ͱ͖Δ͜ͱΛ૿΍͍ͨ͠ • ػثଆͷεϖοΫΞοϓؚΊͯ

Slide 48

Slide 48 text

·ͱΊ 48

Slide 49

Slide 49 text

Nature Remoͷཪଆ • サーバーサイドはほぼ全てGo • 実は割と普通のWeb技術を使って実現している • インフラはAWSに寄せているし、もっと寄せていきたい • 本質的なサービス開発に注⼒したい • IoT機器側でのエッジコンピューティング • Observability向上 • 機械学習

Slide 50

Slide 50 text

We are Hiring! ੵۃ࠾༻தͰ͢ʂ • όοΫΤϯυΤϯδχΞ • εϚʔτϑΥϯΤϯδχΞ • ػցֶशΤϯδχΞ • ૊ΈࠐΈΤϯδχΞ