Slide 1

Slide 1 text

Ruby on JetsとRDS Proxyを使って Railsアプリをサーバレス化してみた 2019/01/09 20:20-20:35 AWS re:Invent Recap with Serverless in Fusic 株式会社Fusic 岡嵜雄平

Slide 2

Slide 2 text

ࣗݾ঺հ 岡嵜 雄平(@Y_uuu) 弊社サービスmockmockに携わるエンジニア re:Invent 2019に参加してきました 普段はRailsでの開発が主 ࣗݾ঺հ

Slide 3

Slide 3 text

࠷ۙڵຯ͕͋Δ͜ͱ

Slide 4

Slide 4 text

࠷ۙڵຯ͕͋Δ͜ͱ • ࣾ಺χίΧϨγεςϜ /JDPMF

Slide 5

Slide 5 text

࠷ۙڵຯ͕͋Δ͜ͱ • 3VCZPO+FUT

Slide 6

Slide 6 text

࠷ۙڵຯ͕͋Δ͜ͱ • 3%41SPYZ

Slide 7

Slide 7 text

ͭΛผʑʹ΍Δͱ͕͔͔࣌ؒΔ ˣ ͭಉ࣌ʹ΍Ε͹͍͍Μ͡ΌͶʁ

Slide 8

Slide 8 text

΍ͬͯΈ·ͨ͠

Slide 9

Slide 9 text

ࠓ೔࿩͢͜ͱ 3BJMTͰ࡞ͬͨΞϓϦΛ+FUT্Ͱಈ͔͢ 3%41SPYZΛ࢖ͬͯΈͨ ·ͱΊ

Slide 10

Slide 10 text

3BJMTͰ࡞ͬͨΞϓϦΛ+FUT্Ͱಈ͔͢

Slide 11

Slide 11 text

3VCZPO+FUTͱ͸ AWS上で動作するサーバレスアプリケーションを Rubyで書くためのフレームワーク

Slide 12

Slide 12 text

3VCZPO+FUTͱ͸ • ORMがRailsと同じActiveRecord • MVCやルーティングの書き⽅(メソッド)が同じ • ⼀部のGemが使える Ruby on Railsと同じように実装できる

Slide 13

Slide 13 text

3VCZPO+FUTͱ͸ 1コマンドでAWSへデプロイできる

Slide 14

Slide 14 text

3VCZPO+FUTͱ͸ 1コマンドでAWSへデプロイできる DBにRDS・ DynamoDBの 両⽅が使える

Slide 15

Slide 15 text

LambdaとRDSは相性が良くない 2019年9⽉までの状況 1. VPCに配置したLambdaの起動に時間がかかる 2. Lambdaスケールアウト時にENIが枯渇する懸念 3. RDSへのコネクション数が上限に達する懸念

Slide 16

Slide 16 text

LambdaとRDSは相性が良くない 2019年9⽉以降ボトルネックが解消されつつある 1. VPCに配置したLambdaの起動に時間がかかる 9⽉のアップデートで解消 2. Lambdaスケールアウト時にENIが枯渇する懸念 9⽉のアップデートで解消 3. RDSへのコネクション数が上限に達する懸念 re:Invent 2019でRDS-Proxyが発表

Slide 17

Slide 17 text

RDBを選択するメリット • ActiveRecordに依存するGemが使えるかもしれない • データの並び替えや検索が楽 • Railsと同じ感覚で⾼速に実装できる • 既存のRDBからのデータの移⾏が楽

Slide 18

Slide 18 text

ࠓճ͸3%#Λબ୒

Slide 19

Slide 19 text

構成

Slide 20

Slide 20 text

構成

Slide 21

Slide 21 text

4FSWFSMFTT

Slide 22

Slide 22 text

3VCZPO+FUTͰͷ࣮૷ アプリケーションを作成する HFNJOTUBMMKFUT KFUTOFXOJDPMFTFSWFSMFTT ˞OJDPMFTFSWFSMFTTσΟϨΫτϦʹ֤छϑΝΠϧ͕ࣗಈੜ੒͞ΕΔ DEOJDPMFTFSWFSMFTT CVOEMFJOTUBMM ZBSOJOTUBMM

Slide 23

Slide 23 text

3VCZPO+FUTͰͷ࣮૷ サーバ起動 KFUTTFSWFS ブラウザでアクセス可能

Slide 24

Slide 24 text

3VCZPO+FUTͰͷ࣮૷ Scaffoldする KFUTTDBGGPMEVTFSOBNFTUSJOH FNBJMTUSJOH ʜ KFUTECDSFBUF ECNJHSBUF

Slide 25

Slide 25 text

΄΅3BJMTͱಉ͡

Slide 26

Slide 26 text

3VCZPO+FUTͰͷ࣮૷ Railsで作ったNicoleのソースコードを移植

Slide 27

Slide 27 text

3VCZPO+FUTͰͷ࣮૷ Railsで作ったNicoleのソースコードを移植

Slide 28

Slide 28 text

3VCZPO+FUTͰͷ࣮૷ Railsで作ったNicoleのソースコードを移植

Slide 29

Slide 29 text

3VCZPO+FUTͰͷ࣮૷ デプロイする +&54@&/7QSPEVDUJPOKFUTEFQMPZ

Slide 30

Slide 30 text

΄΅3BJMTͱಉ͡

Slide 31

Slide 31 text

σϞ https://5mgq0llbxc.execute-api.ap-northeast-1.amazonaws.com/prod/

Slide 32

Slide 32 text

Jetsでハマったこと • RailsにあってJetsにない機能がいくつかある • asset pipeline(CSS/JSはwebpacker、imagesはpublic配下) • flash • 署名付きcookie • ActiveStorage • simple_format • i18n • (他にもまだありそう)

Slide 33

Slide 33 text

Jetsでハマったこと • リンクの⽣成について挙動の違いあり • Rails同様xxx_pathとかxxx_urlでリンク⽣成できる • Helperが⽣成されないケース(resourcesのネストやgetなど) • クエリパラメータ未対応(search/paginationに難あり)

Slide 34

Slide 34 text

Jetsでハマったこと • デプロイ環境で問題が発⽣した際の調査 • CloudWatch Logs頼みなので原因の切り分けが難しい • Lambdaの数が膨⼤なのでログ解析が困難 • ログ解析基盤が無いと詰むかも

Slide 35

Slide 35 text

意外と⼤丈夫だったこと • 簡単にデプロイできる • IAMの設定 • Lambdaのサブネット、セキュリティグループの設定 • 他はデフォルトのまま

Slide 36

Slide 36 text

意外と⼤丈夫だったこと • 想像以上にRailsから移植しやすい • ModelとControllerはほぼコピペでOK • Viewのみリンク周りの修正が必要

Slide 37

Slide 37 text

ϋϚͬͨ఺͸1VMM3FRVFTUͷνϟϯε ͩͱࢥͬͯ෇͖߹͍͖͍ͬͯͨ

Slide 38

Slide 38 text

余談︓Rails Support • 既存のRailsアプリをjets deployできる https://rubyonjets.com/docs/rails/afterburner/ • これを使えばもっと簡単にサーバレス化できたかも…

Slide 39

Slide 39 text

3%41SPYZΛ࢖ͬͯΈͨ

Slide 40

Slide 40 text

おさらい︓現状の構成

Slide 41

Slide 41 text

現状の構成でのスケールアウト Heyで100リクエストしてみる ❯ hey -H "Cookie: rack.session=xxx" -n 100 -c 100 https://5mgq0llbxc.execute-api.ap-northeast-1.amazonaws.com/prod/ ※省略 Status code distribution: [200] 66 responses [502] 34 responses

Slide 42

Slide 42 text

現状の構成でのスケールアウト db.t2.microのMAXコネクションで頭打ちに

Slide 43

Slide 43 text

AuroraServerlessを使った構成

Slide 44

Slide 44 text

4FSWFSMFTT

Slide 45

Slide 45 text

AuroraServerless構成でのスケールアウト Heyで1024リクエストしてみる ❯ hey -H "Cookie: rack.session=xxx" -n 1024 -c 1024 https://5mgq0llbxc.execute-api.ap-northeast-1.amazonaws.com/prod/ ※省略 Status code distribution: [200] 1024 responses

Slide 46

Slide 46 text

AuroraServerless構成でのスケールアウト コネクション数に応じてスケールアウト

Slide 47

Slide 47 text

RDS-Proxyを使った構成 ※RDS Proxyの最⼤接続数は80%(66×0.8=52)としています

Slide 48

Slide 48 text

4FSWFSMFTT

Slide 49

Slide 49 text

RDS-Proxyを使った構成 Heyで50リクエストしてみる ❯ hey -H "Cookie: rack.session=xxx" -n 50 -c 50 https://5mgq0llbxc.execute-api.ap-northeast-1.amazonaws.com/prod/ ※省略 Status code distribution: [200] 24 responses Error distribution: [26] Get https://5mgq0llbxc.execute-api.ap-northeast- 1.amazonaws.com/prod/: net/http: request canceled (Client.Timeout exceeded while awaiting headers)

Slide 50

Slide 50 text

RDS-Proxyを使った構成 Heyで50リクエストしてみる(タイムアウトを120秒に延ばす) ❯ hey -H "Cookie: rack.session=xxx" -n 50 -c 50 –t 120 https://5mgq0llbxc.execute-api.ap-northeast-1.amazonaws.com/prod/ ※省略 Status code distribution: [200] 24 responses [504] 26 responses 29秒で⼀⻫に504が返ってくる= API Gatewayのタイムアウト

Slide 51

Slide 51 text

RDS-Proxyを使った構成 原因は調査中 • ブラウザでアクセスすると特に異常はない RDS Proxy経由で⼤量のアクセスしたときに 要求を捌ききれていない︖ • エンドポイントをRDSに戻すと特に異常はない

Slide 52

Slide 52 text

RDS-Proxyを使った構成 原因は調査中 • RDS-Proxyを経由するとRDS側のコネクション数が 40を超えない

Slide 53

Slide 53 text

RDS-Proxyを使った構成 原因は調査中 • RDS(MySQL)のmax_connectionsは66

Slide 54

Slide 54 text

RDS-Proxyを使った構成 原因は調査中 • DatabaseConnectionsCurrentlySessionPinnedが発⽣ • 接続の再利⽤効率の低下を引き起こす可能性があるとのこと 参考︓Managing Connections with Amazon RDS Proxy (Preview) https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-proxy.html

Slide 55

Slide 55 text

RDS-Proxyを使った構成 原因は調査中 • PinningとRDSのコネクション数が増えない現象の 因果関係は確認中 • Pinningの回避策は模索中

Slide 56

Slide 56 text

RDS-Proxyを使った構成 原因は調査中 • AWSサポートとのやり取り継続中です • 原因が特定できたら何らかの⽅法で共有します

Slide 57

Slide 57 text

·ͱΊ

Slide 58

Slide 58 text

まとめ • Ruby on Jetsを使ってRailsアプリケーションを サーバレス化することができた • Aurora Serverlessを使ってLambdaの スケールアウト対策ができることがわかった • RDS-Proxyについては引き続き検証を続ける

Slide 59

Slide 59 text

Thank you! Fusicは技術が好きなエンジニアを 募集しています