HIGOBASHI.AWS 第12回の発表資料です
1Aurora ServerlessのData APIについて
View Slide
スライドは後で⼊⼿することが出来ますので発表中の内容をメモする必要はありません。写真撮影をする場合はフラッシュ・シャッター⾳が出ないようにご配慮くださいAttention
3⾃⼰紹介lサーバーレス開発部 改め CX事業本部l好きなAWSサービス: AWS Lambdal好きなRDB PostgreSQLlMySQLはド素⼈岩⽥ 智哉
4MySQLは良く分からないのでAurora PostgreSQL compatibleを前提に話します
5今⽇話すこと無駄なコスト• Aurora/Aurora Serverlessの基礎知識• Data APIについてちょっとだけ深掘りした話• Data APIのユースケースに関する考察
6今⽇話さないこと無駄なコスト•LambdaやRDS等AWSの各サービスに関する基礎知識•アプリの実装寄りの話•DBの設計や運⽤の話
7アジェンダ無駄なコスト• Aurora/Aurora Serverlessとは︖ 3分• Data APIの裏側に関する考察• Data APIについて• Data APIのユースケースに関する考察5分9分9分• まとめ 2分
8アジェンダ無駄なコスト• Aurora/Aurora Serverlessとは︖ 3分• Data APIの裏側に関する考察• Data APIについて• Data APIのユースケースに関する考察5分9分9分• まとめ 2分
9Auroraとは• クラウド時代にAWSが再設計したRDMS• MySQL互換、PostgreSQL互換の2種類から選択可能• MySQLの最⼤5倍、PostgreSQLの最⼤3倍の性能
10Auroraのアーキテクチャ概要• ストレージレイヤーがDBインスタンスから独⽴• このアーキテクチャが様々なメリットを実現※画像はhttps://aws.amazon.com/jp/blogs/news/new-parallel-query-for-amazon-aurora/ より引⽤
11Auroraとはhttps://dev.classmethod.jp/cloud/aws/developers-io-2019-in-osaka-aurora-or-rdsこのブログに⾊々詳しく書かれています
12Aurora Serverless※画像はhttps://aws.amazon.com/jp/blogs/news/amazon-aurora-postgresql-serverless-now-generally-available/ より引⽤•⾼可⽤性/⾃動スケール•パッチ等の管理作業不要•アイドル時間に課⾦されない※ストレージの課⾦はありインスタンスレイヤが⾃動スケールする動作モード
13Serverless Architectureな特性を備えたRDB
14※⼀般的にServerless Architectureと聞いて思い浮かべるLambdaからの利⽤を⽬的として作られたサービスでは無い
15アジェンダ無駄なコスト• Aurora/Aurora Serverlessとは︖ 3分• Data APIの裏側に関する考察• Data APIについて• Data APIのユースケースに関する考察5分9分9分• まとめ 2分
16Data APIとは• HTTPSのエンドポイントからAurora Serverlessにアクセスする機能• DBドライバが無くてもAWS SDKだけでAuroraServerlessにアクセス可能• クエリの実⾏結果をJSON形式で受けとることが可能
17Data APIの実⾏例{"records": [[{"longValue": 1},{"stringValue": "TEST"},{"stringValue": "2019-06-01 04:15:10.0"}]],"numberOfRecordsUpdated": 0}
18Data APIでできること• ExecuteStatement• BatchExecuteStatement※パラメータも利⽤可能 Extended Queryプロトコルでunnamedなprepared-statemenを実行SQL の実⾏• BeginTransaction• RollbackTransaction• CommitTransactionトランザクション制御
19Data APIの制限事項• SQLの呼び出しは45秒でタイムアウト• レスポンスは最⼤1,000⾏まで• レスポンスは最⼤1Mまで• 結果セットの1⾏あたり64Kまで• トランザクションは最⼤24時間まで• 3分間トランザクションIDの呼び出しがない場合はタイムアウト
20Data APIのメリット• インターネットに公開されたエンドポイントからAurora Serverlessにアクセスできる• http(s)でAurora Serverlessにアクセスできる• 利⽤者側はDBとの接続を意識せずステートレスに利⽤可能
21Data APIの位置付けリリース当時はVPC Lambdaのコールドスタートが遅く、LambdaからRDBを利⽤する⽅法として期待された
22Data APIが不要に︖︖2019/9/27 VPC Lambdaアーキテクチャ改善が東京リージョンに適⽤完了https://aws.amazon.com/jp/blogs/compute/announcing-improved-vpc-networking-for-aws-lambda-functions/
23アジェンダ無駄なコスト• Aurora/Aurora Serverlessとは︖ 3分• Data APIの裏側に関する考察• Data APIについて• Data APIのユースケースに関する考察5分9分9分• まとめ 2分
24Data API発表後に良く⽿にした話...これでVPC Lambda無しでRDB使える︕︕しかもhttpsのエンドポイントだから同時接続数の問題が解決する︕︕
なぜ︖︖
26疑問その1今までもインターネットアクセス可能なエンドポイントは⽤意できたけど何が違うの︖︖rds.force_sslで暗号化を強制できるけど...
27接続⽅式の違い• 認証⽅式の違い• 単純なユーザー名/パスワードによる認証とSIGV4の違い• 認証を⾏うコンポーネントの違い• Data APIのエンドポイントでまずSIGV4による認証とIAMによる認可を⾏う• Data APIの認証/認可がOKの場合にDB側の認証/認可に進む通常のエンドポイントをPublic公開するのとどう違う︖︖
28Data APIの⽅が攻撃への耐性が強いPublicなエンドポイントで通常の認証⽅式を使うと、悪意ある接続要求の拒否にDBインスタンスのリソースを消費してしまう
29IAMデータベース認証との違い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
30IAMデータベース認証との違いPostgreSQL で IAM データベース認証を使⽤する場合、以下の制限に注意してください。• データベースインスタンスの 1 秒あたりの最⼤接続数は、インスタンスタイプとワークロードに応じて制限される場合があります。https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html#UsingWithRDS.IAMDBAuth.Availability
31Aurora Serverlessへの接続⽅式の⽐較認証⽅式 同時接続への耐性 DDOS耐性通常の接続 ユーザー名/パスワード 弱 弱IAMデータベース認証 SIGV4 弱 強Data API SIGV4強※詳しくは後ほど強
32疑問その2Data APIでLambdaの同時接続数問題が解決︖︖
33疑問その2# DBへの接続処理# コールドスタート時のみ接続し、接続を使い回すことでオーバーヘッドを低減するdef handler(event, conext):# lambdaのメイン処理こういう実装だとアイドル中のLambda実⾏環境がDB接続を消費して無駄なのは分かるが...
34疑問その2def handler(event, conext):# lambdaのメイン処理1# DBへの接続処理# lambdaのメイン処理2(DBアクセスが必要な処理)# DB切断処理# lambdaのメイン処理3こうすれば良くない︖︖
35Data APIの同時接続耐性を調べてみる
36まずは簡単にData API利⽤時のAurora Serverlessのログを確認
37aws rds-data execute-statement --databaseiwatadb --sql 'select pg_sleep(10)' --resource-arn ....
38LOG: connection received: host=10.1.13.68 port=24081LOG: connection authorized: user=cm-iwata database=iwatadbLOG: execute : SET extra_float_digits = 3LOG: execute : SET application_name = 'PostgreSQL JDBC Driver’LOG: execute : select pg_sleep(10)LOG: execute : DISCARD ALLLOG: 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-iwatadatabase=iwatadb host=10.1.13.68 port=24081Data API⽤のコネクションは約5:30維持されていたAWS CLIで指定したSQL⽂
39Data APIの基盤はプロキシ型のコネクションプーリング機構を備えてる
40今度は並列に⼤量アクセスしてみる
41検証環境の構成• Aurora Serverlessのmax_connectionsは180• 負荷掛け⽤のPCからAPI GW経由でLambdaに200並列アクセス• LambdaはData API経由でSQLを発⾏AWS CloudVPCData APIEndpoint
42検証⽤コードimport jsonimport boto3rdsData = boto3.client('rds-data')def lambda_handler(event, context):rdsData.execute_statement(resourceArn = secretArn = database = 'dataapi_db',sql = 'select pg_sleep(5)')return {'statusCode': 200,'body': json.dumps('Hello from Lambda!')}• pg_sleep(5)を実⾏するだけのコード
43検証⽤コードhey -t 0 -n 200 -c 200 https://xxxxxxxxxx200並列で合計200回のリクエストを実⾏
44検証結果postgres=> select count(*) from pg_stat_activity where usename <>'rdsadmin' and usename <> 'postgres' ;count-------100(1 row)200並列でアクセスしたのに100接続しか消費していない
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検証結果から読み解くData APIの接続管理要求1要求2要求3要求4要求5要求6Data APIEndpoint
47さらに並列度を上げてアクセスしてみる
48検証⽤コードhey -t 0 -n 400 -c 400 https://xxxxxxxxxx400並列で合計400回のリクエストを実⾏
49結果datname | usename | count------------+--------------+-------| | 5postgres | postgres | 1dataapi_db | dataapi_user | 171| rdsadmin | 1rdsadmin | rdsadmin | 3(5 rows)max_connectionsの限界まで使い切れた
50⾮Data APIから⼤量接続している状態だとどうなる︖︖
51検証環境の構成AWS CloudVPCData APIEndpointData APIを使わず普通に接続• Aurora Serverlessと同⼀VPCのEC2から通常のDB接続を確⽴• この状態で同じ検証を流してみる
52結果datname | usename | count----------------+------------------+-------| | 5non_dataapi_db | non_dataapi_user | 130dataapi_db | dataapi_user | 41postgres | postgres | 1| rdsadmin | 1rdsadmin | rdsadmin | 3(6 rows)通常のDB接続を130確⽴している状態だと、Data API⽤の接続は41に制限
53結果datname | usename | count----------------+------------------+-------| | 5non_dataapi_db | non_dataapi_user | 170dataapi_db | dataapi_user | 1postgres | postgres | 1| rdsadmin | 1rdsadmin | rdsadmin | 3(6 rows)通常のDB接続を170確⽴している状態だと、Data APIの接続エラーが発⽣
54Data APIの基盤はプロキシ型のコネクションプーリング機構を備えており、同時接続への耐性が⾼い
55アジェンダ無駄なコスト• Aurora/Aurora Serverlessとは︖ 2分• Data APIの裏側に関する考察• Data APIについて• Data APIのユースケースに関する考察5分9分9分• まとめ 2分
56Data APIはどのようなユースケースにマッチするのか︖︖
57Data APIのユースケースについて•IoT機器から利⽤•Lambdaから利⽤•AppSyncから利⽤(今回話しません)
58IoT機器からData APIを利⽤する構成AWS CloudVPCData APIEndpoint• AWS SDKがあればDBドライバは不要• IoT機器の限られたリソースでも簡単にRDBへのアクセスが実現可能
59本当に⼤丈夫︖︕
60IoT機器からData APIを利⽤するリスクData API経由で発⾏されるSQLをユーザー側でバリデーションすることは出来ないIoT機器が乗っ取られた場合に任意のSQLを発⾏されるリスクがある
61IoT機器からData APIを利⽤する際の留意点• IoT機器が乗っ取られた場合のリスクを理解し、しっかりとリスクヘッジを⾏う• Data API⽤のDBユーザーの権限は必要最低限に絞る
62LambdaからData APIを利⽤する構成同時接続数に対する耐性が⾼いので、特定のユースケースでは引き続きVPC Lambda × 通常接続よりも優位AWS CloudVPCData APIEndpoint
63LambdaからData APIを利⽤する際の留意点• VPC Lambdaと⽐較するとコールドスタートが遅くなり⾟い• Data APIからAurora ServerlessにアクセスするだけであればLambda実⾏環境にバンドルされたライブラリだけで実現可能※Python3.6,Node.js10で動作を確認• VPC Lambdaから通常の接続⽅式を利⽤する場合は追加でライブラリの導⼊が必要 → コールドスタートに悪影響
64LambdaからData APIを利⽤する際の留意点https://github.com/chanzuckerberg/sqlalchemy-aurora-data-api• 既存のORMライブラリは基本使えないと思った⽅が良い• 複雑処理を実装するのは⾟そう• Data APIに対応したライブラリも出てきてはいる
65発表資料作ってる間に出ました...https://aws.amazon.com/jp/about-aws/whats-new/2019/11/amazon-rds-data-api-client-library-supports-java-preview/
66通常接続 with VPC Lambda と Data APIの⽐較アプリの実装容易性 コールドスタート 同時接続耐性VPC Lambda ORMの恩恵を受けやすい 遅くなりがち 弱Data API ORMの恩恵を受け⾟い 遅くなりにくい 強複雑なクエリが不要で、⼤量の書き込みが発⽣するようなワークロードではData APIの⽅が優位になりそう
67アジェンダ無駄なコスト• Aurora/Aurora Serverlessとは︖ 2分• Data APIの裏側に関する考察• Data APIについて• Data APIのユースケースに関する考察5分9分9分• まとめ 2分
68まとめ• Aurora ServerlessのData APIを利⽤することで同時接続耐性の⾼いシステムを構築しやすくなる• Data APIを利⽤する際はセキュリティをしっかりと考慮する• Data APIはAurora Serverlessが前提となるため、⼀時停⽌〜復帰の遅延が発⽣し得ることを念頭に置いておく
69VPC Lambdaのアーキテクチャ改善でData APIが役⽬を終えた訳ではないメリット/デメリットを理解して選択肢の1つとして抑えておきましょう
70ご清聴ありがとうございました
71