Slide 1

Slide 1 text

ݫൿɿຊࢿྉͷҰ෦·ͨ͸શ෦ΛɺNatureגࣜձࣾͷڐՄͳ͠ʹɺෳ੡ɺసࡌ͢Δ͜ͱΛې͡·͢ɻ Introduce about September 3, 2019 Natureגࣜձࣾ Remoͷཪଆ AWS DevDay Tokyo 2019 4th Oct, 2019 ~ AWSͱWebٕज़ΛIoTͷੈքͰϑϧ׆༻͢Δ

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⾔語」等

Slide 3

Slide 3 text

3 Created Miscellaneous Go Tools • maltmill • ツールを簡単にhomebrewで配布するためのツール • horenso • バッチジョブのためのラッパー • peep • プロセスの終了通知をしてくれる君 • gocredits • Goのツール配布時に依存ライブラリのLICENSEを同梱 • etc. • ref. 「Goでツールを量産する僕の⽅法」 • https://junkyard.song.mu/slides/gocon2019-fukuoka/#0

Slide 4

Slide 4 text

4 Maintaining major Go tools ご意⾒あれば懇親会などでお声がけください • ghq (github.com/motemen/ghq) • ソースコードリポジトリ管理ツール • ghr (github.com/tcnksm/ghr) • GitHubへのバイナリリリース⽤ツール

Slide 5

Slide 5 text

5 Recent Works • godzil (github.com/Songmu/godzil) • Goツール作成のためのAuthoring Tool • ecsched (github.com/Songmu/ecsched) • ECSのスケジュールタスク管理ツール • kibelasync (github.com/Songmu/kibelasync) • kibelaのクライアント • replaceablewriter (github.com/Songmu/replaceablewriter) • Write先を差し替えられるio.Writer

Slide 6

Slide 6 text

ࠓ೔࿩͢͜ͱ Agenda 6

Slide 7

Slide 7 text

7 Agenda • Nature及びNature Remoの紹介 • Nature Remoのシステムアーキテクチャ解説 • ECS活⽤事例 • 現在の課題 • その他の細かい取り組み

Slide 8

Slide 8 text

ձࣾͱ੡඼ Company and Product 8

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

8,980ԁ(੫ൈ) ʢ2018೥7݄13೔ൃചʣ 11,980ԁ(੫ൈ) ʢ2018೥12݄6೔ൃചʣ (ୈ̎ੈ୅ʣ Nature Remo 1st Generation͸ɺ2017೥10݄16೔ʹ13,000ԁʢ੫ൈ͖ʣͰൃച 10 Product

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

εϚʔτσόΠε Nature Remo Ոి How It Works

Slide 13

Slide 13 text

Traction 13 2೥ऑͰ 10ສ୆ಥഁ ೝ஌ˍγΣΞۀքNo.1

Slide 14

Slide 14 text

Funding 14 2019年8⽉ 5億円調達 • 環境エネルギー投資 • DeNA (デライト・ベンチャーズ) ⽇経電⼦版・TechCrunch等掲載 継続成⻑中

Slide 15

Slide 15 text

Home Automation to P2P Electricity Platform 15 2019 Phase 1 (ݱࡏ) Home Automation 2020 Phase 2 Energy Management 2022 Phase 3 P2P Electricity Auction Platform

Slide 16

Slide 16 text

Confidential 16

Slide 17

Slide 17 text

Nature Remo E • ʮεϚʔτΤωϧΪʔϋϒʯ • ECHONET LiteϓϩτίϧΛར༻ • ೔ຊࠃ಺ͷεϚʔτϝʔλͱHEMSΛܨ͙ඪ४ϓϩτίϧ • ܦ࢈লೝఆ • ՈఉͷWifiʹͭͳ͍ͰUDP΍Wi-SUNͳͲͰ௨৴ • ՈఉͷεϚʔτϝʔλʔ΍ιʔϥʔύωϧɾ஝ి஑ͷૢ࡞΍৘ใऩर • ిྗσʔλͷӾཡ΍ૢ࡞ͳͲ͸εϚʔτϑΥϯΞϓϦ͔Β • εϚʔτϝʔλʔ͸࣮͸΄΅શͯͷ͝ՈఉͰར༻Մೳ

Slide 18

Slide 18 text

Nature RemoͱGo Nature Remo and Go 18

Slide 19

Slide 19 text

Features • いわゆるIoT製品のスマートリモコン • スマートフォンやスマートスピーカーから家電操作 • エアコン・TV・ライト等 • 既存の⾚外線リモコンをそのまま置き換えられる • 簡単なリモコン学習(検出)機能 • センシングやユーザーの位置情報をもとに家電操作 • 温度・湿度、家から離れた時、近づいたときなど

Slide 20

Slide 20 text

εϚʔτσόΠε Nature Remo Ոి 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側が制御 • 常時接続になるため接続管理が割と⼤変ではある • 10万台+増加の⼀途

Slide 25

Slide 25 text

ΞʔΩςΫνϟ Architecture 25

Slide 26

Slide 26 text

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

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間のやりとり • Consulによるサービスディスカバリとコネクション管理 • AlexaのカスタムスキルはAWS Lambda経由を使って実⾏ される

Slide 29

Slide 29 text

Simple Web Applications with Go • 普通のWebアプリケーション • もともとherokuでホストしていた名残も • フレームワークは使わずGorilla web toolkitを部分的に利⽤ • MySQL/Redis • gorp/redigo • DynamoDBはじめました • 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

Service Discovery with Consul • 歴史的経緯によりNature RemoはALBへの直接接続が困難 • NginxからproxyしてStreamサーバーに接続している • NginxでTLS終端とWebSocketのProxyを実施 • エフェメラルポートの都合上、6万接続程度が上限 • 接続数が少ないサーバーにNature Remoは接続する • 接続先IPを返すAPIをまずコールし、返されたIPにWS接続 • Consulを使ってディスカバリを実現

Slide 32

Slide 32 text

ECSΛ༻͍ͨίϯςφ׆༻ ECS and Containers 32

Slide 33

Slide 33 text

Our almost services running on Amazon ECS • 前述の通り、ほとんどのサービスをECS上で動かしている

Slide 34

Slide 34 text

CI/CD Pipelines git-pr-release git push go test go build docker build docker push ecspresso deploy 1 2 3 4

Slide 35

Slide 35 text

Introduce "ecspresso" for Deploying • github.com/kayac/ecspresso • ecs-deployから乗り換え • ecs-deployからの乗り換え先としてちょうどよい • 既存のTask Definitionを利⽤できる • そのままシームレスに移⾏可能 • CircleCI上で実⾏してdeploy

Slide 36

Slide 36 text

The ECS Task Definition become reviewable • Taskへのサイドカー追加やパラメーター変更がreviewable になったのは良かった

Slide 37

Slide 37 text

--no-wait Option • https://github.com/kayac/ecspresso/pull/38 • デフォルトではサービスが⼊れ替わるまで待ってからコマ ンド終了するが、待たないオプション • ecs-deployとの互換挙動 • CD上で利⽤する時に便利

Slide 38

Slide 38 text

՝୊΍ࠓޙऔΓ૊Έ͍ͨ͜ͱ Problems 38

Slide 39

Slide 39 text

Nginx Proxy • 歴史的経緯によりNature RemoはALBに接続できない • Nginxに直つなぎしている • Nginxはstreamにproxyしているので6万接続程度が上限 • エフェメラルポート関連 • コネクション数管理が煩雑! • → ALBに⼀本化したい • DNSベースで⾃動で内部のノード増やしてくれる

Slide 40

Slide 40 text

Service Discovery • Consulのサービスディスカバリはかっこいいが不安定にな ることも • Consul⾃体のバージョンも古い… • Cloud Mapなどに切り替えていきたい

Slide 41

Slide 41 text

Stream Reconnection • streamをdeployすると⼀⻫にNature Remoとの接続を切断 することになるため再接続ラッシュとなる • ⼀時的にAPIが過負荷気味になる • コンテナがコネクションを維持したまま、ローリングで⼊ れ替えていく⽅法を模索中

Slide 42

Slide 42 text

Log Monitoring • go.uber.go/zap でJSONログをCloudWatch Logsに送信 • CloudWatch Logs Insightsも安定してきて便利 • しかし如何せん⾼い • ⼀部のログはアプリから直接firehoseを叩いてS3送信 • Athenaで調査 • firehoseがたまに⼀時的にエラーが続くことに困っている • 改善したい

Slide 43

Slide 43 text

Further use AWS • AWS IoT • 無理して使う必要はないと考えているが、選択肢を広げ て必要に応じて使いたい • 機械学習系機能 • ユースケース • 室温や快適度の⾃動調整 • 電⼒の最適化や需給調整

Slide 44

Slide 44 text

RDB Migration • gooseを利⽤ • 積み上げ式のMigrationはイマイチ • メンテも滞っている • マスターデータ⼊れるのもやっているので若⼲乗り換え づらい • schemalexに乗り換えたい • sqldefでも良いがschemalexは社内に作者がいる

Slide 45

Slide 45 text

࣋ଓՄೳͳ։ൃͷͨΊʹೖࣾޙऔΓ૊Μͩ͜ͱ Minor Topics 45

Slide 46

Slide 46 text

Go Modulesಋೖ • depから移⾏ • vendorを残すなら以下のステップのみ % GO111MODULE=on go mod init % GO111MODULE=on go mod vendor % rm Gopkg.* • ビルド時に `-mod=vendor` を⼀律つける必要はある • vendoringなんだかんだで便利だと思うようになった… • CI環境で考えることも減らせる

Slide 47

Slide 47 text

Dependabotಋೖ • dependabot.com • 依存ライブラリのバージョンが上がっていたらpull requestを起票して くれるサービス • GitHubが買収して今は無料で使える • とにかく依存ライブラリ最新にし続けたいので便利 • Go対応正直微妙な部分も… • 頑張ってほしい… • 起票後CircleCI上でgo mod tidy⾛らせるなどの⼯夫もしている • アップデート当番のアサインも⾃動化

Slide 48

Slide 48 text

git-pr-releaseࣗಈԽ • developブランチにfeatureブランチマージしたら勝⼿にリ リースpull requestが⽣えてきて便利 • https://songmu.jp/riji/entry/2019-07-28-circleci-git-pr-release.html

Slide 49

Slide 49 text

ECS Scheduled Task؅ཧͷͨΊͷπʔϧecsched • github.com/Songmu/ecsched (作りかけ) • バッチ類は、ECSのScheduled Taskを利⽤しているがそれ をバージョン管理したいという動機

Slide 50

Slide 50 text

·ͱΊ 50

Slide 51

Slide 51 text

Nature Remoͷཪଆ • サーバーサイドはほぼ全てGo • 実は割と普通のWeb技術を使って実現している • インフラはAWSに寄せているし、もっと寄せていきたい • 本質的なサービス開発に注⼒したい • WebSocketの接続管理周りがチャレンジング • サービスも急成⻑中 • 開発体験を上げるためにも⾊々やっています

Slide 52

Slide 52 text

We are hiring! 積極採⽤中です! • バックエンドエンジニア • スマートフォンエンジニア • 機械学習エンジニア • 組み込みエンジニア ぜひオフィスに遊びに来てください@恵⽐寿