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

Aurora ServerlessのData APIについて

119659c28d16f22d01eb48a6f3ee1391?s=47 TomoyaIwata
November 29, 2019

Aurora ServerlessのData APIについて

HIGOBASHI.AWS 第12回の発表資料です

119659c28d16f22d01eb48a6f3ee1391?s=128

TomoyaIwata

November 29, 2019
Tweet

Transcript

  1. 1 Aurora Serverlessの Data APIについて

  2. スライドは後で⼊⼿することが出来ますので 発表中の内容をメモする必要はありません。 写真撮影をする場合は フラッシュ・シャッター⾳が出ないようにご配慮ください Attention

  3. 3 ⾃⼰紹介 lサーバーレス開発部 改め CX事業本部 l好きなAWSサービス: AWS Lambda l好きなRDB PostgreSQL

    lMySQLはド素⼈ 岩⽥ 智哉
  4. 4 MySQLは良く分からないので Aurora PostgreSQL compatible を前提に話します

  5. 5 今⽇話すこと 無駄なコスト • Aurora/Aurora Serverlessの基礎知識 • Data APIについてちょっとだけ深掘りした話 •

    Data APIのユースケースに関する考察
  6. 6 今⽇話さないこと 無駄なコスト •LambdaやRDS等AWSの各サービスに関する基礎知識 •アプリの実装寄りの話 •DBの設計や運⽤の話

  7. 7 アジェンダ 無駄なコスト • Aurora/Aurora Serverlessとは︖ 3分 • Data APIの裏側に関する考察

    • Data APIについて • Data APIのユースケースに関する考察 5分 9分 9分 • まとめ 2分
  8. 8 アジェンダ 無駄なコスト • Aurora/Aurora Serverlessとは︖ 3分 • Data APIの裏側に関する考察

    • Data APIについて • Data APIのユースケースに関する考察 5分 9分 9分 • まとめ 2分
  9. 9 Auroraとは • クラウド時代にAWSが再設計したRDMS • MySQL互換、PostgreSQL互換の2種類から選択可能 • MySQLの最⼤5倍、PostgreSQLの最⼤3倍の性能

  10. 10 Auroraのアーキテクチャ概要 • ストレージレイヤーがDB インスタンスから独⽴ • このアーキテクチャが 様々なメリットを実現 ※画像はhttps://aws.amazon.com/jp/blogs/news/new-parallel-query-for-amazon-aurora/ より引⽤

  11. 11 Auroraとは https://dev.classmethod.jp/cloud/aws/developers-io-2019-in-osaka-aurora-or-rds このブログに⾊々詳しく書かれています

  12. 12 Aurora Serverless ※画像はhttps://aws.amazon.com/jp/blogs/news/amazon-aurora-postgresql-serverless-now-generally-available/ より引⽤ •⾼可⽤性/⾃動スケール •パッチ等の管理作業不要 •アイドル時間に課⾦されない ※ストレージの課⾦はあり インスタンスレイヤが⾃動スケールする動作モード

  13. 13 Serverless Architecture な特性を備えたRDB

  14. 14 ※⼀般的にServerless Architectureと聞いて 思い浮かべるLambdaからの利⽤を ⽬的として作られたサービスでは無い

  15. 15 アジェンダ 無駄なコスト • Aurora/Aurora Serverlessとは︖ 3分 • Data APIの裏側に関する考察

    • Data APIについて • Data APIのユースケースに関する考察 5分 9分 9分 • まとめ 2分
  16. 16 Data APIとは • HTTPSのエンドポイントからAurora Serverlessにア クセスする機能 • DBドライバが無くてもAWS SDKだけでAurora

    Serverlessにアクセス可能 • クエリの実⾏結果をJSON形式で受けとることが可能
  17. 17 Data APIの実⾏例 { "records": [ [ { "longValue": 1

    }, { "stringValue": "TEST" }, { "stringValue": "2019-06-01 04:15:10.0" } ] ], "numberOfRecordsUpdated": 0 }
  18. 18 Data APIでできること • ExecuteStatement • BatchExecuteStatement ※パラメータも利⽤可能 Extended Queryプロトコルでunnamedなprepared-statemenを実行

    SQL の実⾏ • BeginTransaction • RollbackTransaction • CommitTransaction トランザクション制御
  19. 19 Data APIの制限事項 • SQLの呼び出しは45秒でタイムアウト • レスポンスは最⼤1,000⾏まで • レスポンスは最⼤1Mまで •

    結果セットの1⾏あたり64Kまで • トランザクションは最⼤24時間まで • 3分間トランザクションIDの呼び出しがない場合はタイ ムアウト
  20. 20 Data APIのメリット • インターネットに公開されたエンドポイントから Aurora Serverlessにアクセスできる • http(s)でAurora Serverlessにアクセスできる

    • 利⽤者側はDBとの接続を意識せずステートレスに利 ⽤可能
  21. 21 Data APIの位置付け リリース当時はVPC Lambdaの コールドスタートが遅く、Lambdaから RDBを利⽤する⽅法として期待された

  22. 22 Data APIが不要に︖︖ 2019/9/27 VPC Lambdaアーキテクチャ改善が東京リージョンに適⽤完了 https://aws.amazon.com/jp/blogs/compute/announcing-improved-vpc-networking-for-aws-lambda-functions/

  23. 23 アジェンダ 無駄なコスト • Aurora/Aurora Serverlessとは︖ 3分 • Data APIの裏側に関する考察

    • Data APIについて • Data APIのユースケースに関する考察 5分 9分 9分 • まとめ 2分
  24. 24 Data API発表後に良く⽿にした話... これでVPC Lambda無しでRDB使える︕︕ しかもhttpsのエンドポイントだから 同時接続数の問題が解決する︕︕

  25. なぜ︖︖

  26. 26 疑問その1 今までもインターネットアクセス可 能なエンドポイントは⽤意できたけ ど何が違うの︖︖ rds.force_sslで暗号化を強制できるけど...

  27. 27 接続⽅式の違い • 認証⽅式の違い • 単純なユーザー名/パスワードによる認証とSIGV4の違い • 認証を⾏うコンポーネントの違い • Data

    APIのエンドポイントでまずSIGV4による認証とIAMによ る認可を⾏う • Data APIの認証/認可がOKの場合にDB側の認証/認可に進む 通常のエンドポイントをPublic公開するのとどう違う︖︖
  28. 28 Data APIの⽅が攻撃への耐性が強い Publicなエンドポイントで通常の認証⽅式を使うと、悪意ある接 続要求の拒否にDBインスタンスのリソースを消費してしまう

  29. 29 IAMデータベース認証との違い MySQL で IAM データベース認証を使⽤する場合、1 秒あたりの新しい接続数は 256 ま でに制限されます。db.t2.micro

    DB インスタンスクラスを使⽤している場合、この制限 は 1 秒あたり 10 接続に制限されます。 最近はIAMデータベース認証という選択肢も... MySQL エンジンを使⽤する場合には、以下のことをお勧めします。 • データベースへの⼀時的な個⼈アクセス⽤メカニズムとして IAM データベース認証 を使⽤します。 • 簡単に再試⾏できるワークロードに対してのみ、IAM データベース認証を使⽤します。 • アプリケーションで 1 秒あたり 256 を超える新しい接続が必要な場合は、IAM データ ベース認証を使⽤しないでください。 https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html#UsingWithRDS.IAMDBAuth.Availability
  30. 30 IAMデータベース認証との違い PostgreSQL で IAM データベース認証を使⽤する場合、以下の制限に 注意してください。 • データベースインスタンスの 1

    秒あたりの最⼤接続数は、インス タンスタイプとワークロードに応じて制限される場合があります。 https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html#UsingWithRDS.IAMDBAuth.Availability
  31. 31 Aurora Serverlessへの接続⽅式の⽐較 認証⽅式 同時接続への耐性 DDOS耐性 通常の接続 ユーザー名/パスワード 弱 弱

    IAMデータベース認証 SIGV4 弱 強 Data API SIGV4 強 ※詳しくは後ほど 強
  32. 32 疑問その2 Data APIでLambdaの 同時接続数問題が解決︖︖

  33. 33 疑問その2 # DBへの接続処理 # コールドスタート時のみ接続し、接続を使い回すことでオー バーヘッドを低減する def handler(event, conext):

    # lambdaのメイン処理 こういう実装だとアイドル中のLambda実⾏環境がDB接続を消費 して無駄なのは分かるが...
  34. 34 疑問その2 def handler(event, conext): # lambdaのメイン処理1 # DBへの接続処理 #

    lambdaのメイン処理2(DBアクセスが必要な処理) # DB切断処理 # lambdaのメイン処理3 こうすれば良くない︖︖
  35. 35 Data APIの同時接続耐性を調べてみる

  36. 36 まずは簡単にData API利⽤時の Aurora Serverlessのログを確認

  37. 37 aws rds-data execute-statement --database iwatadb --sql 'select pg_sleep(10)' --

    resource-arn ....
  38. 38 LOG: connection received: host=10.1.13.68 port=24081 LOG: connection authorized: user=cm-iwata

    database=iwatadb LOG: execute <unnamed>: SET extra_float_digits = 3 LOG: execute <unnamed>: SET application_name = 'PostgreSQL JDBC Driver’ LOG: execute <unnamed>: select pg_sleep(10) LOG: execute <unnamed>: DISCARD ALL LOG: execute <unnamed>: SELECT n.nspname = ... DETAIL: parameters: $1 = '2278' LOG: execute <unnamed>: SELECT typinput=... DETAIL: parameters: $1 = 'void' LOG: disconnection: session time: 0:05:31.980 user=cm-iwata database=iwatadb host=10.1.13.68 port=24081 Data API⽤のコネクションは約5:30維持されていた AWS CLIで指定した SQL⽂
  39. 39 Data APIの基盤はプロキシ型の コネクションプーリング機構を備えてる

  40. 40 今度は並列に⼤量アクセスしてみる

  41. 41 検証環境の構成 • Aurora Serverlessのmax_connectionsは180 • 負荷掛け⽤のPCからAPI GW経由でLambdaに200並列アクセス • LambdaはData

    API経由でSQLを発⾏ AWS Cloud VPC Data API Endpoint
  42. 42 検証⽤コード import json import boto3 rdsData = boto3.client('rds-data') def

    lambda_handler(event, context): rdsData.execute_statement( resourceArn = <DBクラスタのARN> secretArn = <シークレットのARN> database = 'dataapi_db', sql = 'select pg_sleep(5)') return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') } • pg_sleep(5)を実⾏するだけの コード
  43. 43 検証⽤コード hey -t 0 -n 200 -c 200 https://xxxxxxxxxx

    200並列で合計200回のリクエストを実⾏
  44. 44 検証結果 postgres=> select count(*) from pg_stat_activity where usename <>

    'rdsadmin' and usename <> 'postgres' ; count ------- 100 (1 row) 200並列でアクセスしたのに100接続しか消費していない
  45. 45 検証結果 Response time histogram: 10.342 [1] | 12.225 [99]

    |▪▪▪▪▪▪▪▪▪▪▪... 14.108 [0] | 15.991 [0] | 17.874 [0] | 19.757 [0] | 21.640 [96] |▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪... 23.523 [0] | 25.406 [0] | 27.289 [0] | 29.172 [4] |▪▪ 10秒弱で完了したリクエストと20秒弱で完了したリクエストでほぼ半々
  46. 46 検証結果から読み解くData APIの接続管理 要求1 要求2 要求3 要求4 要求5 要求6 Data

    API Endpoint
  47. 47 さらに並列度を上げてアクセスしてみる

  48. 48 検証⽤コード hey -t 0 -n 400 -c 400 https://xxxxxxxxxx

    400並列で合計400回のリクエストを実⾏
  49. 49 結果 datname | usename | count ------------+--------------+------- | |

    5 postgres | postgres | 1 dataapi_db | dataapi_user | 171 | rdsadmin | 1 rdsadmin | rdsadmin | 3 (5 rows) max_connectionsの限界まで使い切れた
  50. 50 ⾮Data APIから⼤量接続している状態だと どうなる︖︖

  51. 51 検証環境の構成 AWS Cloud VPC Data API Endpoint Data APIを使わず

    普通に接続 • Aurora Serverlessと同⼀VPCのEC2から通常のDB接続を確⽴ • この状態で同じ検証を流してみる
  52. 52 結果 datname | usename | count ----------------+------------------+------- | |

    5 non_dataapi_db | non_dataapi_user | 130 dataapi_db | dataapi_user | 41 postgres | postgres | 1 | rdsadmin | 1 rdsadmin | rdsadmin | 3 (6 rows) 通常のDB接続を130確⽴している状態だと、Data API⽤ の接続は41に制限
  53. 53 結果 datname | usename | count ----------------+------------------+------- | |

    5 non_dataapi_db | non_dataapi_user | 170 dataapi_db | dataapi_user | 1 postgres | postgres | 1 | rdsadmin | 1 rdsadmin | rdsadmin | 3 (6 rows) 通常のDB接続を170確⽴している状態だと、Data APIの 接続エラーが発⽣
  54. 54 Data APIの基盤はプロキシ型のコネクショ ンプーリング機構を備えており、同時接 続への耐性が⾼い

  55. 55 アジェンダ 無駄なコスト • Aurora/Aurora Serverlessとは︖ 2分 • Data APIの裏側に関する考察

    • Data APIについて • Data APIのユースケースに関する考察 5分 9分 9分 • まとめ 2分
  56. 56 Data APIはどのようなユースケースに マッチするのか︖︖

  57. 57 Data APIのユースケースについて •IoT機器から利⽤ •Lambdaから利⽤ •AppSyncから利⽤(今回話しません)

  58. 58 IoT機器からData APIを利⽤する構成 AWS Cloud VPC Data API Endpoint •

    AWS SDKがあればDBドライバは不要 • IoT機器の限られたリソースでも簡単にRDBへのアクセスが実現可能
  59. 59 本当に⼤丈夫︖︕

  60. 60 IoT機器からData APIを利⽤するリスク Data API経由で発⾏されるSQLをユーザー 側でバリデーションすることは出来ない IoT機器が乗っ取られた場合に任意のSQL を発⾏されるリスクがある

  61. 61 IoT機器からData APIを利⽤する際の留意点 • IoT機器が乗っ取られた場合のリスクを理解し、しっ かりとリスクヘッジを⾏う • Data API⽤のDBユーザーの権限は必要最低限に絞る

  62. 62 LambdaからData APIを利⽤する構成 同時接続数に対する耐性が⾼いので、特定のユースケースでは引き 続きVPC Lambda × 通常接続よりも優位 AWS Cloud

    VPC Data API Endpoint
  63. 63 LambdaからData APIを利⽤する際の留意点 • VPC Lambdaと⽐較するとコールドスタートが遅くなり⾟い • Data APIからAurora ServerlessにアクセスするだけであればLambda実

    ⾏環境にバンドルされたライブラリだけで実現可能 ※Python3.6,Node.js10で動作を確認 • VPC Lambdaから通常の接続⽅式を利⽤する場合は追加でライブラリ の導⼊が必要 → コールドスタートに悪影響
  64. 64 LambdaからData APIを利⽤する際の留意点 https://github.com/chanzuckerberg/sqlalchemy-aurora-data-api • 既存のORMライブラリは 基本使えないと思った⽅ が良い • 複雑処理を実装するのは

    ⾟そう • Data APIに対応したライブ ラリも出てきてはいる
  65. 65 発表資料作ってる間に出ました... https://aws.amazon.com/jp/about-aws/whats-new/2019/11/amazon-rds-data-api-client-library-supports-java-preview/

  66. 66 通常接続 with VPC Lambda と Data APIの⽐較 アプリの実装容易性 コールドスタート

    同時接続耐性 VPC Lambda ORMの恩恵を受けやすい 遅くなりがち 弱 Data API ORMの恩恵を受け⾟い 遅くなりにくい 強 複雑なクエリが不要で、⼤量の書き込みが発⽣するようなワーク ロードではData APIの⽅が優位になりそう
  67. 67 アジェンダ 無駄なコスト • Aurora/Aurora Serverlessとは︖ 2分 • Data APIの裏側に関する考察

    • Data APIについて • Data APIのユースケースに関する考察 5分 9分 9分 • まとめ 2分
  68. 68 まとめ • Aurora ServerlessのData APIを利⽤することで同時接続耐性の⾼いシ ステムを構築しやすくなる • Data APIを利⽤する際はセキュリティをしっかりと考慮する

    • Data APIはAurora Serverlessが前提となるため、⼀時停⽌〜復帰の遅 延が発⽣し得ることを念頭に置いておく
  69. 69 VPC Lambdaのアーキテクチャ改善で Data APIが役⽬を終えた訳ではない メリット/デメリットを理解して 選択肢の1つとして抑えておきましょう

  70. 70 ご清聴ありがとうございました

  71. 71