Slide 1

Slide 1 text

1 Aurora Serverlessの Data APIについて

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

3 ⾃⼰紹介 lサーバーレス開発部 改め CX事業本部 l好きなAWSサービス: AWS Lambda l好きなRDB PostgreSQL lMySQLはド素⼈ 岩⽥ 智哉

Slide 4

Slide 4 text

4 MySQLは良く分からないので Aurora PostgreSQL compatible を前提に話します

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

9 Auroraとは • クラウド時代にAWSが再設計したRDMS • MySQL互換、PostgreSQL互換の2種類から選択可能 • MySQLの最⼤5倍、PostgreSQLの最⼤3倍の性能

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

13 Serverless Architecture な特性を備えたRDB

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

16 Data APIとは • HTTPSのエンドポイントからAurora Serverlessにア クセスする機能 • DBドライバが無くてもAWS SDKだけでAurora Serverlessにアクセス可能 • クエリの実⾏結果をJSON形式で受けとることが可能

Slide 17

Slide 17 text

17 Data APIの実⾏例 { "records": [ [ { "longValue": 1 }, { "stringValue": "TEST" }, { "stringValue": "2019-06-01 04:15:10.0" } ] ], "numberOfRecordsUpdated": 0 }

Slide 18

Slide 18 text

18 Data APIでできること • ExecuteStatement • BatchExecuteStatement ※パラメータも利⽤可能 Extended Queryプロトコルでunnamedなprepared-statemenを実行 SQL の実⾏ • BeginTransaction • RollbackTransaction • CommitTransaction トランザクション制御

Slide 19

Slide 19 text

19 Data APIの制限事項 • SQLの呼び出しは45秒でタイムアウト • レスポンスは最⼤1,000⾏まで • レスポンスは最⼤1Mまで • 結果セットの1⾏あたり64Kまで • トランザクションは最⼤24時間まで • 3分間トランザクションIDの呼び出しがない場合はタイ ムアウト

Slide 20

Slide 20 text

20 Data APIのメリット • インターネットに公開されたエンドポイントから Aurora Serverlessにアクセスできる • http(s)でAurora Serverlessにアクセスできる • 利⽤者側はDBとの接続を意識せずステートレスに利 ⽤可能

Slide 21

Slide 21 text

21 Data APIの位置付け リリース当時はVPC Lambdaの コールドスタートが遅く、Lambdaから RDBを利⽤する⽅法として期待された

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

24 Data API発表後に良く⽿にした話... これでVPC Lambda無しでRDB使える︕︕ しかもhttpsのエンドポイントだから 同時接続数の問題が解決する︕︕

Slide 25

Slide 25 text

なぜ︖︖

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

27 接続⽅式の違い • 認証⽅式の違い • 単純なユーザー名/パスワードによる認証とSIGV4の違い • 認証を⾏うコンポーネントの違い • Data APIのエンドポイントでまずSIGV4による認証とIAMによ る認可を⾏う • Data APIの認証/認可がOKの場合にDB側の認証/認可に進む 通常のエンドポイントをPublic公開するのとどう違う︖︖

Slide 28

Slide 28 text

28 Data APIの⽅が攻撃への耐性が強い Publicなエンドポイントで通常の認証⽅式を使うと、悪意ある接 続要求の拒否にDBインスタンスのリソースを消費してしまう

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

30 IAMデータベース認証との違い PostgreSQL で IAM データベース認証を使⽤する場合、以下の制限に 注意してください。 • データベースインスタンスの 1 秒あたりの最⼤接続数は、インス タンスタイプとワークロードに応じて制限される場合があります。 https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html#UsingWithRDS.IAMDBAuth.Availability

Slide 31

Slide 31 text

31 Aurora Serverlessへの接続⽅式の⽐較 認証⽅式 同時接続への耐性 DDOS耐性 通常の接続 ユーザー名/パスワード 弱 弱 IAMデータベース認証 SIGV4 弱 強 Data API SIGV4 強 ※詳しくは後ほど 強

Slide 32

Slide 32 text

32 疑問その2 Data APIでLambdaの 同時接続数問題が解決︖︖

Slide 33

Slide 33 text

33 疑問その2 # DBへの接続処理 # コールドスタート時のみ接続し、接続を使い回すことでオー バーヘッドを低減する def handler(event, conext): # lambdaのメイン処理 こういう実装だとアイドル中のLambda実⾏環境がDB接続を消費 して無駄なのは分かるが...

Slide 34

Slide 34 text

34 疑問その2 def handler(event, conext): # lambdaのメイン処理1 # DBへの接続処理 # lambdaのメイン処理2(DBアクセスが必要な処理) # DB切断処理 # lambdaのメイン処理3 こうすれば良くない︖︖

Slide 35

Slide 35 text

35 Data APIの同時接続耐性を調べてみる

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

38 LOG: connection received: host=10.1.13.68 port=24081 LOG: connection authorized: user=cm-iwata database=iwatadb LOG: execute : SET extra_float_digits = 3 LOG: execute : SET application_name = 'PostgreSQL JDBC Driver’ LOG: execute : select pg_sleep(10) LOG: execute : DISCARD ALL LOG: execute : SELECT n.nspname = ... DETAIL: parameters: $1 = '2278' LOG: execute : 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⽂

Slide 39

Slide 39 text

39 Data APIの基盤はプロキシ型の コネクションプーリング機構を備えてる

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

42 検証⽤コード import json import boto3 rdsData = boto3.client('rds-data') def lambda_handler(event, context): rdsData.execute_statement( resourceArn = secretArn = <シークレットのARN> database = 'dataapi_db', sql = 'select pg_sleep(5)') return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') } • pg_sleep(5)を実⾏するだけの コード

Slide 43

Slide 43 text

43 検証⽤コード hey -t 0 -n 200 -c 200 https://xxxxxxxxxx 200並列で合計200回のリクエストを実⾏

Slide 44

Slide 44 text

44 検証結果 postgres=> select count(*) from pg_stat_activity where usename <> 'rdsadmin' and usename <> 'postgres' ; count ------- 100 (1 row) 200並列でアクセスしたのに100接続しか消費していない

Slide 45

Slide 45 text

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秒弱で完了したリクエストでほぼ半々

Slide 46

Slide 46 text

46 検証結果から読み解くData APIの接続管理 要求1 要求2 要求3 要求4 要求5 要求6 Data API Endpoint

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

48 検証⽤コード hey -t 0 -n 400 -c 400 https://xxxxxxxxxx 400並列で合計400回のリクエストを実⾏

Slide 49

Slide 49 text

49 結果 datname | usename | count ------------+--------------+------- | | 5 postgres | postgres | 1 dataapi_db | dataapi_user | 171 | rdsadmin | 1 rdsadmin | rdsadmin | 3 (5 rows) max_connectionsの限界まで使い切れた

Slide 50

Slide 50 text

50 ⾮Data APIから⼤量接続している状態だと どうなる︖︖

Slide 51

Slide 51 text

51 検証環境の構成 AWS Cloud VPC Data API Endpoint Data APIを使わず 普通に接続 • Aurora Serverlessと同⼀VPCのEC2から通常のDB接続を確⽴ • この状態で同じ検証を流してみる

Slide 52

Slide 52 text

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に制限

Slide 53

Slide 53 text

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の 接続エラーが発⽣

Slide 54

Slide 54 text

54 Data APIの基盤はプロキシ型のコネクショ ンプーリング機構を備えており、同時接 続への耐性が⾼い

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

56 Data APIはどのようなユースケースに マッチするのか︖︖

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

58 IoT機器からData APIを利⽤する構成 AWS Cloud VPC Data API Endpoint • AWS SDKがあればDBドライバは不要 • IoT機器の限られたリソースでも簡単にRDBへのアクセスが実現可能

Slide 59

Slide 59 text

59 本当に⼤丈夫︖︕

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

63 LambdaからData APIを利⽤する際の留意点 • VPC Lambdaと⽐較するとコールドスタートが遅くなり⾟い • Data APIからAurora ServerlessにアクセスするだけであればLambda実 ⾏環境にバンドルされたライブラリだけで実現可能 ※Python3.6,Node.js10で動作を確認 • VPC Lambdaから通常の接続⽅式を利⽤する場合は追加でライブラリ の導⼊が必要 → コールドスタートに悪影響

Slide 64

Slide 64 text

64 LambdaからData APIを利⽤する際の留意点 https://github.com/chanzuckerberg/sqlalchemy-aurora-data-api • 既存のORMライブラリは 基本使えないと思った⽅ が良い • 複雑処理を実装するのは ⾟そう • Data APIに対応したライブ ラリも出てきてはいる

Slide 65

Slide 65 text

65 発表資料作ってる間に出ました... https://aws.amazon.com/jp/about-aws/whats-new/2019/11/amazon-rds-data-api-client-library-supports-java-preview/

Slide 66

Slide 66 text

66 通常接続 with VPC Lambda と Data APIの⽐較 アプリの実装容易性 コールドスタート 同時接続耐性 VPC Lambda ORMの恩恵を受けやすい 遅くなりがち 弱 Data API ORMの恩恵を受け⾟い 遅くなりにくい 強 複雑なクエリが不要で、⼤量の書き込みが発⽣するようなワーク ロードではData APIの⽅が優位になりそう

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

68 まとめ • Aurora ServerlessのData APIを利⽤することで同時接続耐性の⾼いシ ステムを構築しやすくなる • Data APIを利⽤する際はセキュリティをしっかりと考慮する • Data APIはAurora Serverlessが前提となるため、⼀時停⽌〜復帰の遅 延が発⽣し得ることを念頭に置いておく

Slide 69

Slide 69 text

69 VPC Lambdaのアーキテクチャ改善で Data APIが役⽬を終えた訳ではない メリット/デメリットを理解して 選択肢の1つとして抑えておきましょう

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

71