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

空調設備向けIoTシステムにおけるクラウドランニングコスト

Kenta Nohara
October 22, 2019

 空調設備向けIoTシステムにおけるクラウドランニングコスト

ServerlessDays Tokyo 2019

Kenta Nohara

October 22, 2019
Tweet

More Decks by Kenta Nohara

Other Decks in Technology

Transcript

  1. Copyright: ©2019 DAIKIN INDUSTRIES, LTD., All Rights Reserved. 2 自己紹介

    野原 健太 ダイキン工業株式会社所属 ➢ 2008年4月に入社 ➢ 入社以降、組み込みソフト開発(主にC++) ➢ ここ数年、IoTシステム開発に進出 ➢ クラウド歴=AWS歴=サーバーレス歴 2年ほど
  2. Copyright: ©2019 DAIKIN INDUSTRIES, LTD., All Rights Reserved. 3 今日話したいこと

    製造メーカーの組み込みソフト開発技術者が、 サーバーレスIoTシステムの開発に挑戦し、 苦労した話 Amazon DynamoDBの設計について、クラウ ドランニングコスト最適化の観点で工夫した話
  3. Copyright: ©2019 DAIKIN INDUSTRIES, LTD., All Rights Reserved. 5 ダイキン工業株式会社とIoT

    会社概要 • 空調事業を主力とする会社 • 150カ国以上に事業を展開 IoTの取り組み(Daikin Global Platform) 全世界の空調機をインターネットにつないで、販売、 施工、運用、保守、更新といったライフサイクルに対 するサービスを提供する
  4. Copyright: ©2019 DAIKIN INDUSTRIES, LTD., All Rights Reserved. 6 Daikin

    Global Platform Daikin Global Platform アプリケーション インターネット インターネット 建物 Edge 空調設備 機器 空調設備 機器 建物 Edge 空調設備 機器 空調設備 機器 インターネット
  5. Copyright: ©2019 DAIKIN INDUSTRIES, LTD., All Rights Reserved. 7 Daikin

    Global Platform システム規模 • 想定機器接続台数500万台(各機器から毎分データ発生) • 想定ユーザー数30万人(同時アクセス9万人) • 求められる高い処理性能とスケーラビリティ • 無限に発生するデータを扱えるストレージ サーバーレスでやるしかない!! • 性能とスケーラビリティの担保をAWSに任せる! • 断固としてRDBは使わず、全てをNoSQLでまかなう!
  6. Copyright: ©2019 DAIKIN INDUSTRIES, LTD., All Rights Reserved. 8 Daikin

    Global Platform 接続台数に応じてコスト最適化 • 初期投資を限りなく抑えたい(スモールスタート) • 接続台数とクラウド利用料を限りなく正比例にしたい サーバーレスでやるしかない!! • 徹底的な従量課金サービスの利用へ! 利用料 接続台数
  7. Copyright: ©2019 DAIKIN INDUSTRIES, LTD., All Rights Reserved. 9 サーバーレス開発

    サーバーレスのクラウドサービスを適切に使いこなすことで、機能面、非機 能面ともに、作りたいシステムは作れる。 あとは、目標ランニングコスト以内で動くシステムを作れるかどうか。 一般的に、「サーバーレス化=コストが下がる」と言われることがあるが、 大量の負荷がかかるシステムでは、コストが青天井になるケースがある。 (サーバーレスが故に、負荷に応じてスケールし動いてしまうので。) そのため、コストを意識した設計や実装が重要となる。 各サービスの特性、課金体系を把握し、それに応じて適切に設 計を行うことが重要 サーバーレス開発は クラウドランニングコストとの闘い!! といっても過言ではない
  8. Copyright: ©2019 DAIKIN INDUSTRIES, LTD., All Rights Reserved. 11 システム構成

    Daikin Global Platform アプリ ケーション Edge 空調設備 機器 Amazon Kinesis Data Streams Amazon DynamoDB Amazon API Gateway • 空調設備機器から送られてくる運転データをKinesisで受け、Lambda で処理してDynamoDBに格納 • DynamoDBに格納された運転データを API Gateway ⇒ Lambdaを経由してDynamoDBから取り出し • DynamoDBには、設備機器の遠隔監視のため、最新の機器データのみ を格納(時系列データではない) 建物 ユーザ AWSのサーバーレスのサービスを組み合わせて構築
  9. Copyright: ©2019 DAIKIN INDUSTRIES, LTD., All Rights Reserved. 12 システムの負荷条件

    Daikin Global Platform アプリ ケーション Edge 空調設備 機器 Amazon Kinesis Data Streams Amazon DynamoDB Amazon API Gateway 空調設備機器側の負荷 • 1機器あたりの運転データサイズ=数百項目(数十kB) • 機器から送られてくる運転データは、毎回全項目が送られてくるわけでは なく、数項目ずつ送られてくる。(値の変化があった項目のデータのみ送 られてくる) • 各機器の運転データは毎分数項目変化する ⇒毎分、接続機器数×数個の運転データが送信される 建物 ユーザ
  10. Copyright: ©2019 DAIKIN INDUSTRIES, LTD., All Rights Reserved. 13 システムの負荷条件

    Daikin Global Platform アプリ ケーション Edge 空調設備 機器 Amazon Kinesis Data Streams Amazon DynamoDB Amazon API Gateway アプリケーション側の負荷 • 機器の遠隔監視のため、API Gateway経由で運転データを取り出す • 各ユーザは建物内の全機器の監視を行うために、同時に複数機器(数十機 器)の運転データを取り出す • ユーザは遠隔監視中は毎分運転データ取り出しを行う 建物 ユーザ
  11. Copyright: ©2019 DAIKIN INDUSTRIES, LTD., All Rights Reserved. 14 クラウドランニングコスト構造

    Daikin Global Platform アプリ ケーション Edge 空調設備 機器 Amazon Kinesis Data Streams Amazon DynamoDB Amazon API Gateway 建物 ユーザ 以下のランニングコストが全体の大半を占める ①大量の運転データをDynamoDBに書き込む際に消費する WCUコスト ②機器の遠隔監視をリアルタイムに行うために、アプリから大 量に送られてくるリクエストを処理するために必要なLambda にかかるコスト ① ②
  12. Copyright: ©2019 DAIKIN INDUSTRIES, LTD., All Rights Reserved. 15 クラウドランニングコスト構造

    Daikin Global Platform アプリ ケーション Edge 空調設備 機器 Amazon Kinesis Data Streams Amazon DynamoDB Amazon API Gateway 建物 ユーザ ①のWCUをおさえ、②のLambdaの処理時間をおさえ、 ランニングコストを最適化するためには、 DynamoDBのデータ構造がポイントとなる。 ① ②
  13. Copyright: ©2019 DAIKIN INDUSTRIES, LTD., All Rights Reserved. 17 DynamoDB設計

    その1 最初に設計したDynamoDBの構造は以下の通り Primary Key Data-Item Attributes… Partition Key Sort Key Data 機器ID 時刻 100 2019-10-22T14:40:00.000Z 運転データ(JSON形式) 101 2019-10-22T14:40:00.000Z 運転データ(JSON形式) ・・・ ・・・ ・・・ 1機器1アイテムとして運転データを格納する この設計には問題があった…
  14. Copyright: ©2019 DAIKIN INDUSTRIES, LTD., All Rights Reserved. 18 DynamoDB設計

    その1 Primary Key Data-Item Attributes… Partition Key Sort Key Data 機器ID 時刻 100 2019-10-22T14:40:00.000Z 運転データ(JSON形式) 数十kB 101 2019-10-22T14:40:00.000Z 運転データ(JSON形式) 数十kB ・・・ ・・・ ・・・ 1アイテムが数十kBあるため、数百項目ある運転データの1項目だけが送られてき た場合でも、その書き込み処理に数十WCUを消費する。 各機器からは、毎分データが送られてくるため、毎分、数十WCU×接続機器数の WCUを消費する。 運転データ書き込みの際のWCUがかかりすぎる 【DynamoDBの課金仕様】 アイテムの一部だけ更新する場合でも、1アイテムのサイズ分のWCUを消費する
  15. Copyright: ©2019 DAIKIN INDUSTRIES, LTD., All Rights Reserved. 19 DynamoDB設計

    その2 その1を踏まえ、見直したDynamoDBの構造は以下の通り Primary Key Data-Item Attributes… Partition Key Sort Key Data 機器ID 運転データ項目名 100 項目1 項目1の運転データ(JSON形式) 100 ・・・ ・・・ 100 項目N 項目Nの運転データ(JSON形式) 1機器Nアイテムとして運転データを格納する これにより1アイテムあたりのサイズは1kB以下となり、1項目 だけ送られてきた場合はWCUを1だけ消費する、ということに なりWCU消費量を改善できた。 この設計にも問題があった…
  16. Copyright: ©2019 DAIKIN INDUSTRIES, LTD., All Rights Reserved. 20 DynamoDB設計

    その2 1回の運転データ取り出しで数十機器の運転データを取り出す ため、数十機器×N項目=数千アイテムをDynamoDBから取り 出す必要あり 運転データ取り出しのLambda処理時間がかかりすぎる 【DynamoDBのAPI仕様】 ・Queryで指定できるPrimaryキーの数はひとつ ・BatchGetItemで取得できるアイテム数は最大100 ⇒いずれを利用しても、数十回APIを実行する必要があり、処理時間がかかる Primary Key Data-Item Attributes… Partition Key Sort Key Data 機器ID 運転データ項目名 100 項目1 項目1の運転データ(JSON形式) 100 ・・・ ・・・ 100 項目N 項目Nの運転データ(JSON形式)
  17. Copyright: ©2019 DAIKIN INDUSTRIES, LTD., All Rights Reserved. 21 DynamoDB設計

    その3 その2を踏まえ、見直したDynamoDBの構造は以下の通り Partition Keyを建物IDとし、1機器Nアイテムとして運転 データを格納する 建物IDをキーとしてQueryを実行することで、1回のAPI呼び 出しで建物内の全機器の運転データを取得 (項目ごとに書き込めるのでWCUも抑えたまま) Primary Key Data-Item Attributes… Partition Key Sort Key Data 建物ID 機器ID_運転データ項目名 A 100_項目1 項目1の運転データ(JSON形式) A ・・・ ・・・ A 100_項目N 項目Nの運転データ(JSON形式)
  18. Copyright: ©2019 DAIKIN INDUSTRIES, LTD., All Rights Reserved. 22 DynamoDB設計

    まとめ • データ書き込み側(少しずつ書き込みたい)と、データ読み 込み側(まとめて取り出したい)のユースケースが相反する ケースにおいて、両者のバランスを取る最適なデータ構造を 探ることができた • DynamoDBのデータ構造(キー設計)は、クラウドランニ ングコストの観点で非常に重要。アクセス頻度が高いデータ はキー設計を適切に行わないと、非常にコストがかかる! • DynamoDBの場合、書き込みにかかる料金(WCUの料金) は、読み込みにかかる料金(RCUの料金)の10倍以上なので、 特に、⾼頻度でデータ書き込みを行う箇所のキー設計が重要 (IoTシステムにおいて、機器のデータを書き込む箇所がま さに該当する)
  19. Copyright: ©2019 DAIKIN INDUSTRIES, LTD., All Rights Reserved. 24 開発中に失敗した事例

    皆様、お気をつけください 事例1 インスタンス停止し忘れ 高負荷をかけてシステムを評価するテストを実施する際に、負 荷ツールを動かすために、かなりハイスペックなEC2を2台使 用。テスト自体は数時間で完了したが、テスト終了後にインス タンスを停止し忘れ、1週間ほど放置。〇〇万円が課金されて しまった。 (負荷ツールも従量課金制のサーバーレスで動かせば!) 事例2 大量デバッグログ 高負荷をかけてシステムを評価するテストを実施する際に、ロ グレベルをDEBUGのままテストを実行。CloudWatch Logsに 数百億件のログを送信し、〇〇万円が課金されてしまった。 (CloudWatch Logs高い…)
  20. Copyright: ©2019 DAIKIN INDUSTRIES, LTD., All Rights Reserved. Daikin Global

    Platformに興味を持っていただいた方! AWSをやりたい方! 一緒にDaikin Global Platformを作りませんか? ご応募、お待ちしております! (採用HP) http://www.daikin.co.jp/recruit/career/ ご清聴ありがとうございました