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

JAWS DAYS 2020 | サーバレスの新しいデータストアの選択肢 S3 Select の魅力

tutida
March 13, 2020

JAWS DAYS 2020 | サーバレスの新しいデータストアの選択肢 S3 Select の魅力

サーバレスアプリを構築するときのデータストアとして皆さんは何を利用していますか?
DynamoDBが一般的ですが、NoSQL向けの設計や、検索性の低さに疲弊していたりしませんか?
より柔軟な検索性を求め、RDSを使おうとすると、VPC の概念が現れ、悩んだことはありませんか?

2018年にGAされた S3 Select を利用すると上記の悩みが解決するかもしれません。
このスライドでは、サーバレスアプリのデータストアの新たな選択肢として有用な S3 Select の魅力伝えるために、下記内容を予定しています。

・S3 Select の概要
 ・使い方・サンプルコードの提供
 ・メリット・デメリット / 向き・不向き
 ・従来の選択肢(DynamoDBなど)との比較
 ・実行速度などの検証結果

このスライドを通し、S3 Select の魅力を伝え、 現在、サーバレスアプリのデータストアについて悩みを抱えている方々の助けに少しでもなればと思っています。

tutida

March 13, 2020
Tweet

More Decks by tutida

Other Decks in Technology

Transcript

  1. JAWS DAYS 2020 2020 / 03 / 14 @_tutida_ /

    Fusic Co.,Ltd. サーバレスの新しいデータストアの選択肢 S3 Select の魅力
  2. JAWS DAYS 2020 内田 大順(Uchida Tomoyuki) • GitHub : https://github.com/tutida

    • Twitter : @_tutida_ • Fusic Co.,Ltd. @福岡 • プリンシパルエンジニア • 主な業務:受託開発(AWS, PHP, JS) • 最近 • コロナビールを積極的に摂取中 • 猫飼いたい 2 自己紹介
  3. JAWS DAYS 2020 4 S3 Select • 2018年4月にGA • S3バケット上の

    CSV, JSON, Parquet オブジェクトに、 SQLライクな条件文を使い、絞り込んだデータの取得が可能
  4. JAWS DAYS 2020 下記のようなCSVファイルがS3にアップロードされている状態で 5 S3 Select no,name,gender,age,email 0,喜嶋 香織,男性,24,[email protected]

    1,坂本 裕美子,男性,21,[email protected] 2,野村 加奈,女性,33,[email protected] 3,杉山 花子,男性,16,[email protected] 4,山本 陽子,女性,48,[email protected] 5,藤本 智也,女性,37,[email protected] 6,近藤 明美,男性,22,[email protected] 7,高橋 太一,男性,26,[email protected] 8,山本 さゆり,女性,41,[email protected] 9,藤本 千代,男性,22,[email protected] 10,鈴木 知実,男性,13,[email protected] 11,山口 聡太郎,女性,36,[email protected] 12,山口 治,女性,12,[email protected] ……
  5. JAWS DAYS 2020 CSVから、「佐々木」で「男性」で「未成年」なデータを取得 6 S3 Select $ aws s3api

    select-object-content ¥ --bucket=example-s3-select ¥ --key=sample.csv ¥ --input-serialization '{"CSV":{"FileHeaderInfo": "USE", "QuoteEscapeCharacter":"¥¥"}}' ¥ --output-serialization '{"CSV":{"QuoteFields":"ALWAYS","QuoteEscapeCharacter":"¥¥"}}' ¥ --expression "SELECT * FROM s3object s WHERE s.name LIKE '%佐々木%' AND s.gender = '男性 ' AND s.age < '19'" ¥ --expression-type SQ output.txt $ cat output.txt "177","佐々木 裕太","男性","16","[email protected] “515”,“佐々木 拓真","男性","18","[email protected] "1133","佐々木 浩","男性","16","[email protected] "1869","佐々木 京助","男性","12","[email protected] "2235","佐々木 裕美子","男性","17","[email protected] "2572","佐々木 洋介","男性","10","[email protected] "2854","佐々木 美加子","男性","10","[email protected] "3176","佐々木 真綾","男性","12","[email protected] "3447","佐々木 裕美子","男性","15","[email protected] "3567","佐々木 太郎","男性","15","[email protected] "4098","佐々木 花子","男性","16","[email protected] "4377","佐々木 真綾","男性","11","[email protected] "4458","佐々木 裕美子","男性","13","[email protected]
  6. JAWS DAYS 2020 CSVから、「佐々木」で「男性」で「未成年」なデータを取得 7 S3 Select $ aws s3api

    select-object-content ¥ --bucket=example-s3-select ¥ --key=sample.csv ¥ --input-serialization '{"CSV":{"FileHeaderInfo": "USE", "QuoteEscapeCharacter":"¥¥"}}' ¥ --output-serialization '{"CSV":{"QuoteFields":"ALWAYS","QuoteEscapeCharacter":"¥¥"}}' ¥ --expression "SELECT * FROM s3object s WHERE s.name LIKE '%佐々木%' AND s.gender = '男性 ' AND s.age < '19'" ¥ --expression-type SQ output.txt $ cat output.txt "177","佐々木 裕太","男性","16","[email protected] “515”,“佐々木 拓真","男性","18","[email protected] "1133","佐々木 浩","男性","16","[email protected] "1869","佐々木 京助","男性","12","[email protected] "2235","佐々木 裕美子","男性","17","[email protected] "2572","佐々木 洋介","男性","10","[email protected] "2854","佐々木 美加子","男性","10","[email protected] "3176","佐々木 真綾","男性","12","[email protected] "3447","佐々木 裕美子","男性","15","[email protected] "3567","佐々木 太郎","男性","15","[email protected] "4098","佐々木 花子","男性","16","[email protected] "4377","佐々木 真綾","男性","11","[email protected] "4458","佐々木 裕美子","男性","13","[email protected] … ファイル取得後にアプリ側で選別するのではなく 取得時に必要なデータのみを取得できる機能
  7. JAWS DAYS 2020 • 単一ファイル(≒テーブル)のデータを取得 • SQLライクな条件文で絞り込みができる • 不特定多数のプロセス(Lambdaなど)からのアクセスに対応できる •

    データの耐久性はS3のため99.999999999% • バケット、IAMポリシーでアクセス制限可能 • オブジェクトデータはバージョニングで管理可能 8 S3 Select
  8. JAWS DAYS 2020 • 単一ファイル(≒テーブル)のデータを取得 • SQLライクな条件文で絞り込みができる • 不特定多数のプロセス(Lambdaなど)からのアクセスに対応できる •

    データの耐久性はS3のため99.999999999% • バケット、IAMポリシーでアクセス制限可能 • オブジェクトデータはバージョニングで管理可能 9 S3 Select サーバレスのデータストアに 使えるんじゃない?
  9. JAWS DAYS 2020 • サーバレスのデータストア • S3 Select とは •

    使い方・サンプルコード • メジャーなデータストアとの比較 11 アジェンダ
  10. JAWS DAYS 2020 • サーバレスのデータストア • S3 Select とは •

    使い方・サンプルコード • メジャーなデータストアとの比較 12 アジェンダ サーバレスの新しいデータストアの選択肢になりえる S3 Select の可能性を探求!
  11. JAWS DAYS 2020 • 代表的な構成 • API Gateway + Lambda

    + DynamoDB 15 サーバレスのデータストア
  12. JAWS DAYS 2020 • NoSQL型のデータストア • 容量:無制限 • エンドポイント:グローバル •

    スケーラビリティ:AutoScalingの設定が可能 • オンデマンドタイプにしておけばさらに楽 • メンテナンス:フリー • 検索性:ハッシュキーとインデックスによる検索のみ 18 DynamoDB
  13. JAWS DAYS 2020 • NoSQL型のデータストア • 容量:無制限 • エンドポイント:グローバル •

    スケーラビリティ:AutoScalingの設定が可能 • オンデマンドタイプにしておけばさらに楽 • メンテナンス:フリー • 検索性:ハッシュキーとインデックスによる検索のみ 19 DynamoDB データ構造、キーとインデックスの設計が重要
  14. JAWS DAYS 2020 • RDB型のデータストア • 容量:最大16TB • エンドポイント:設定による。VPCには属する。 •

    一般的に、Lambdaと組み合わせる場合は VPC Lambda を利用する • スケーラビリティ:AutoScalingはなし • メンテナンス:OS, エンジンのメンテナンスあり • 検索性:SQLによる柔軟な検索が可能 23 RDS
  15. JAWS DAYS 2020 • RDB型のデータストア • 容量:最大16TB • エンドポイント:設定による。VPCには属する。 •

    一般的に、Lambdaと組み合わせる場合は VPC Lambda を利用する • スケーラビリティ:AutoScalingはなし • メンテナンス:OS, エンジンのメンテナンスあり • 検索性:SQLによる柔軟な検索が可能 24 RDS 様々なアップデートにより、Lambdaとの組み合わせが アンチパターンではなくなってきた
  16. JAWS DAYS 2020 • サーバレスなら、とりあえずDynamoDBかな (要件を整理すると、集計と柔軟な検索が必要) • DynamoDBの設計が辛くなってくる • Scanしてアプリで選別・集計すればいいんだけど…

    • 大好きなSQLが使いたくなってくる ← • もういっそのことRDSにするか • Aurora Serverless や RDS Proxy もでたし • VPC Lambdaの起動時間も改善されたし 25 サーバレスのデータストア
  17. JAWS DAYS 2020 • サーバレスなら、とりあえずDynamoDBかな (要件を整理すると、集計と柔軟な検索が必要) • DynamoDBの設計が辛くなってくる • Scanしてアプリで選別・集計すればいいんだけど…

    • 大好きなSQLが使いたくなってくる ← • もういっそのことRDSにするか • Aurora Serverless や RDS Proxy もでたし • VPC Lambdaの起動時間も改善されたし • でも、料金はあがるし、オーバースペック感ある… VPCのことも考えたくない… 26 サーバレスのデータストア
  18. JAWS DAYS 2020 30 S3 Select とは • 2018年4月にGA •

    S3バケット上の CSV, JSON, Parquet オブジェクトに、 SQLライクな条件文を使い、絞り込んだデータの取得が可能
  19. JAWS DAYS 2020 31 S3 Select とは • S3 Select

    できるファイル形式 • CSV : ヘッダーあり/なしどちらでも • JSON : JSONドキュメント、JSON Lines • Parquest : Haloopで使用する列指向フォーマット • 圧縮している状態でも利用可能 • GZIP : CSV, JSON • BZIP2 : CSV, JSON • 料金(東京) • SELECTのリクエスト : $0.0047/1000件 • SELECTで取得したデータ : $0.0008/GB • SELECTでスキャンしたデータ : $0.00225/GB
  20. JAWS DAYS 2020 32 S3 Select とは • S3 Select

    できるファイル形式 • CSV : ヘッダーあり/なしどちらでも • JSON : JSONドキュメント、JSON Lines • Parquest : Haloopで使用する列指向フォーマット • 圧縮している状態でも利用可能 • GZIP : CSV, JSON • BZIP2 : CSV, JSON • 料金(東京) • SELECTのリクエスト : $0.0047/1000件 • SELECTで取得したデータ : $0.0008/GB • SELECTでスキャンしたデータ : $0.00225/GB 安い
  21. JAWS DAYS 2020 対応しているファイル形式のオブジェクトをS3にアップロード 34 使い方・サンプルコード no,name,gender,age,email 0,喜嶋 香織,男性,24,[email protected] 1,坂本

    裕美子,男性,21,[email protected] 2,野村 加奈,女性,33,[email protected] 3,杉山 花子,男性,16,[email protected] 4,山本 陽子,女性,48,[email protected] 5,藤本 智也,女性,37,[email protected] 6,近藤 明美,男性,22,[email protected] 7,高橋 太一,男性,26,[email protected] 8,山本 さゆり,女性,41,[email protected] 9,藤本 千代,男性,22,[email protected] 10,鈴木 知実,男性,13,[email protected] 11,山口 聡太郎,女性,36,[email protected] 12,山口 治,女性,12,[email protected] ……
  22. JAWS DAYS 2020 AWS CLIで(CSVファイルの場合) https://docs.aws.amazon.com/cli/latest/reference/s3api/select-object-content.html 37 使い方・サンプルコード $ aws

    s3api select-object-content ¥ --bucket=example-s3-select ¥ --key=sample.csv ¥ --input-serialization '{"CSV":{"FileHeaderInfo": "USE", "QuoteEscapeCharacter":"¥¥"}}' ¥ --output-serialization '{"CSV":{"QuoteFields":"ALWAYS","QuoteEscapeCharacter":"¥¥"}}' ¥ --expression "SELECT * FROM s3object s WHERE s.name LIKE '%佐々木%' AND s.gender = '男性 ' AND s.age < '19'" ¥ --expression-type SQ output.txt $ cat output.txt "177","佐々木 裕太","男性","16","[email protected] “515”,“佐々木 拓真","男性","18","[email protected] "1133","佐々木 浩","男性","16","[email protected] "1869","佐々木 京助","男性","12","[email protected] "2235","佐々木 裕美子","男性","17","[email protected] "2572","佐々木 洋介","男性","10","[email protected] "2854","佐々木 美加子","男性","10","[email protected] "3176","佐々木 真綾","男性","12","[email protected] "3447","佐々木 裕美子","男性","15","[email protected] "3567","佐々木 太郎","男性","15","[email protected] "4098","佐々木 花子","男性","16","[email protected] "4377","佐々木 真綾","男性","11","[email protected] "4458","佐々木 裕美子","男性","13","[email protected]
  23. JAWS DAYS 2020 AWD-SDK for Javascript で(CSVファイルの場合) https://aws.amazon.com/jp/blogs/developer/introducing-support-for-amazon-s3- select-in-the-aws-sdk-for-javascript/ 38

    使い方・サンプルコード const {S3} = require('aws-sdk'); const s3 = new S3({region: 'ap-northeast-1'}); const params = { Bucket: "example-s3-select", Key: "sample.csv", ExpressionType: 'SQL', Expression: sql, InputSerialization: {"CSV":{"FileHeaderInfo": "USE", "QuoteEscapeCharacter":"¥¥"}}, OutputSerialization: {"CSV":{"QuoteFields":"ALWAYS","QuoteEscapeCharacter":"¥¥"}} }; s3.selectObjectContent(params, (err, data) => { const eventStream = data.Payload; eventStream.on('data', (event) => { if (event.Records) { process.stdout.write(event.Records.Payload.toString()); } }); });
  24. JAWS DAYS 2020 https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/s3-glacier-select-sql-reference.html • 使える構文 / 関数 • 基本

    • SELECT, FROM, WHERE, LIMIT • ORDER BY, OFFSET は使えない • 演算子 • 論理演算子 : AND, NOT, OR • 比較演算子 : <, >, <=, >=, =, <>, !=, BETWEEN(a, b), IN(a, b, c) • パターンマッチング演算子 : LIKE, _(任意の一文字), %(任意の一連の文字列) • 単一演算子 : IS NULL, IS NOT NULL • 算術演算子 : +, -, *, % • 集計関数 • AVG, COUNT, MAX, MIN, SUM • 条件関数 • COALESCE, NULLIF • 変換関数 • CAST • 日付関数 • DATE_ADD, DATE_DIFF, EXTRACT, TO_STRING, TO_TIMESTAMP, UTC_NOW • 文字列関数 • CHAR_LENGTH, LOWER, UPPER, SUBSTRING, TRIM 39 使い方・サンプルコード
  25. JAWS DAYS 2020 https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/s3-glacier-select-sql-reference.html • 使える構文 / 関数 • 基本

    • SELECT, FROM, WHERE, LIMIT • ORDER BY, OFFSET は使えない • 演算子 • 論理演算子 : AND, NOT, OR • 比較演算子 : <, >, <=, >=, =, <>, !=, BETWEEN(a, b), IN(a, b, c) • パターンマッチング演算子 : LIKE, _(任意の一文字), %(任意の一連の文字列) • 単一演算子 : IS NULL, IS NOT NULL • 算術演算子 : +, -, *, % • 集計関数 • AVG, COUNT, MAX, MIN, SUM • 条件関数 • COALESCE, NULLIF • 変換関数 • CAST • 日付関数 • DATE_ADD, DATE_DIFF, EXTRACT, TO_STRING, TO_TIMESTAMP, UTC_NOW • 文字列関数 • CHAR_LENGTH, LOWER, UPPER, SUBSTRING, TRIM 40 使い方・サンプルコード メジャーなSQLの関数がほとんど利用可能!
  26. JAWS DAYS 2020 • 比較対象 • DynamoDB • RDS •

    S3 Select • 比較項目 • メンテナンス • スケーラビリティ • 検索性 • 整合性 • 料金 • データ更新 • データ取得 42 メジャーなデータストアとの比較
  27. JAWS DAYS 2020 • メンテナンス • DynamoDB • メンテナンスフリー •

    RDS • OSやエンジンのメンテナンスが発生 • S3 Select • メンテナンスフリー • S3にファイルを置いているだけ 43 メジャーなデータストアとの比較 項目 DynamoDB RDS S3 Select メンテナンス ◎ △ ◎
  28. JAWS DAYS 2020 • スケーラビリティ • DynamoDB • プロビジョニング :

    AutoScalingを事前に設定可能 • オンデマンド : 設定しなくても自動でスケール • RDS • スケールアップは可能 • 負荷に応じたスケールアウトはできない • S3 Select • そもそもスケーラビリティという概念がない 44 メジャーなデータストアとの比較 項目 DynamoDB RDS S3 Select スケーラビリティ ◎ △ -
  29. JAWS DAYS 2020 • 検索性 • DynamoDB • キーとインデックスによる検索のみ •

    集計は不可 • RDS • SQLによる柔軟な検索・集計が可能 • 複数のテーブルを結合した検索・集計が可能 • S3 Select • SQLによる柔軟な検索・集計が可能 • 複数のテーブルを結合した検索・集計が不可 45 メジャーなデータストアとの比較 項目 DynamoDB RDS S3 Select 検索性 △ ◎ ◦
  30. JAWS DAYS 2020 • 整合性 • DynamoDB • 結果整合性 •

    オプションで「強い整合性」も選択できる • RDS • 強力な整合性 • S3 Select • 結果整合性 46 メジャーなデータストアとの比較 項目 DynamoDB RDS S3 Select 整合性 結果整合性 強い整合性 結果整合性
  31. JAWS DAYS 2020 • 料金 • DynamoDB • キャパシティの設定次第 :

    計算難しい… • 比較的ローコスト • RDS • インスタンスタイプ・起動時間 次第 • DynamoDB, S3 と比べるとコスト高 • S3 Select • アップロードしているファイルの容量とGET時の料金 • ローコスト 47 メジャーなデータストアとの比較 項目 DynamoDB RDS S3 Select 料金 ◦ △ ◎
  32. JAWS DAYS 2020 • データ更新 • DynamoDB • トランザクションあり •

    キー指定で単一項目の追加・更新可能 • RDS • トランザクションあり • SQLによる柔軟なデータ操作が可能 • S3 Select • データ操作にはファイルを置き換える必要がある • 不特定多数のプロセスからの更新は向いてない 48 メジャーなデータストアとの比較 項目 DynamoDB RDS S3 Select データ更新 ◦ ◎ △
  33. JAWS DAYS 2020 • データ取得 : 前提 • 検証内容 •

    取得元・計測 : ローカルPC • データ : 1万行のレコード(ファイル) • DynamoDB : オンデマンドタイプ ハッシュキーテーブル • RDS : db.t3.micro PostgreSQL • S3 : オブジェクトサイズ 522KB • 取得方法 : AWS SDK for Javascript • 取得内容 • 指定の1件 • 全件取得 • 範囲選択による10件の取得(DynamoDBは除く) • 集計(DynamoDBは除く) 49 メジャーなデータストアとの比較
  34. JAWS DAYS 2020 • データ取得 : 前提 • 項目ごとの計測方法 •

    5回の実行結果の中央値を最終結果とする • 実行時間の計測方法 • 取得関数の実行前後に hrtime で計測 50 メジャーなデータストアとの比較 (async () => { const hrstart = process.hrtime(); // -------------------------------- // ここで実行 const result = await s3Select(); // -------------------------------- hrend = process.hrtime(hrstart) console.info('%ds %dms', hrend[0], hrend[1] / 1000000) })();
  35. JAWS DAYS 2020 • 指定の1件 • DynamoDB • 実行内容 :

    get • 取得速度 : 150.810119ms • RDS • 実行内容 : SELECT * FROM example WHERE no = 1; • 取得速度 : 121.276729ms • S3 Select • 実行内容 : SELECT * FROM s3Object s WHERE no = 1 • 取得速度 : 249.055213ms • 全件取得 • DynamoDB • 実行内容 : scan • 取得速度 : 824.093342ms • RDS • 実行内容 : SELECT * FROM example; • 取得速度 : 292.399822ms • S3 Select • 実行内容 : SELECT * FROM s3Object s; • 取得速度 : 320.370613ms ※ オブジェクトサイズに依存 51 メジャーなデータストアとの比較
  36. JAWS DAYS 2020 • 範囲選択による10件の取得 • RDS • 実行内容 :

    SELECT * FROM example WHERE age BETWEEN 10 AND 24 LIMIT 10; • 取得速度 : 122.471291ms • S3 Select • 実行内容 : SELECT * FROM s3object s WHERE s.age BETWEEN ‘20' AND ‘30' LIMIT 10 • 取得速度 : 275.446927ms • 集計 • RDS • 実行内容 : SELECT SUM(age) FROM example; • 取得速度 : 117.619842ms • S3 Select • 実行内容 : SELECT SUM(s.age) FROM s3object s; • 取得速度 : 243.328442ms 52 メジャーなデータストアとの比較
  37. JAWS DAYS 2020 • データ取得:グラフ 53 メジャーなデータストアとの比較 0 100 200

    300 400 500 600 700 800 900 集計処理 範囲選択 全件取得 指定の一件 データストア別 取得速度 DynamoDB RDS S3 Select
  38. JAWS DAYS 2020 • データ取得 • DynamoDB • getは安定し、早く取得が可能 •

    scanはやはり速度が落ちる • RDS • 安定し、早い取得が可能 • 重いクエリ、多数のプロセスからアクセスがある場合は この限りではない • S3 Select • 一定の速度で安定して、取得可能、 • SELECT対象のオブジェクトサイズに依存する 54 メジャーなデータストアとの比較 項目 DynamoDB RDS S3 Select データ取得 ◦ ◎ ◦
  39. JAWS DAYS 2020 55 メジャーなデータストアとの比較 項目 DynamoDB RDS S3 Select

    メンテナンス ◎ △ ◎ スケーラビリティ ◎ △ - 検索性 △ ◎ ◦ 整合性 結果整合性 強い整合性 結果整合性 料金 ◦ △ ◎ データ更新 ◦ ◎ △ データ取得 ◦ ◎ ◦
  40. JAWS DAYS 2020 56 メジャーなデータストアとの比較 項目 DynamoDB RDS S3 Select

    メンテナンス ◎ △ ◎ スケーラビリティ ◎ △ - 検索性 △ ◎ ◦ 整合性 結果整合性 強い整合性 結果整合性 料金 ◦ △ ◎ データ更新 ◦ ◎ △ データ取得 ◦ ◎ ◦ S3 Select が向いている要件 ・強い整合性が必要ない ・単一のテーブルに対する柔軟な検索が必要 ・ローコストを求められる ・不特定多数のプロセスからデータを取得したい場合 ・データの更新は単一のプロセスからのみ更新する場合
  41. JAWS DAYS 2020 58 まとめ データストアとしての S3 Select の魅力 データストアとしての

    S3 Select の注意点 (単一オブジェクトに)SQLによる柔軟な検索が可能 不特定多数のプロセスからのアクセス(GET)に対応可能 バージョニングによる世代管理が可能 ローコスト 更新データの反映は結果整合性 不特定多数のプロセスからの更新には向いていない → データの更新にはファイルを置き換える必要があるため 複数オブジェクトのデータをJOINはできない ORDER BY, OFFSETは使えない
  42. JAWS DAYS 2020 59 まとめ データストアの選択肢になりえる魅力を持つ S3 Select ・DynamoDBを利用すると発生する ・設計のツラさ

    ・検索性の低さ ・RDSを利用すると発生する ・VPCのことを考えたくない ・起動速度やコネクションなど考えたくない ・メンテナンスのことを考えたくない S3 Select がこれらの悩みを解決してくれるかも! 今後の選択肢の1つとして検討してみてください!