Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Ruby on JetsとRDS Proxyを使ってRailsアプリをサーバレス化してみた
Search
Y_uuu
January 09, 2020
Technology
6
3.6k
Ruby on JetsとRDS Proxyを使ってRailsアプリをサーバレス化してみた
2019/01/09(Thu) 20:20-20:35
AWS re:Invent Recap with Serverless in Fusic にて発表
Y_uuu
January 09, 2020
Tweet
Share
More Decks by Y_uuu
See All by Y_uuu
Porting filesystem-fat to Another Microcontroller: ESP32
yuuu
2
44
Porting PicoRuby to Another Microcontroller: ESP32
yuuu
4
820
RubyKaigi 2025でプロポーザルが初めて採択されるまでにやったこと
yuuu
1
550
地方企業の強みを活かす!AWSを活用したIoTシステムの開発事例とその裏側
yuuu
0
120
あの重機は今どこにある?- 重機管理IoTプロダクトのバックエンドをAWSで構築した話 -
yuuu
0
1k
mruby-esp32におけるペリフェラルAPIの実装検討
yuuu
1
800
育成力 - エンジニアの才能を引き出す環境とチューターの立ち回り -
yuuu
4
4.8k
committee-railsとOpenAPI Generatorでスキーマ駆動なAPI開発をする
yuuu
0
950
mrubyでマイコンの世界に足を踏み入れる
yuuu
2
2k
Other Decks in Technology
See All in Technology
Optuna DashboardにおけるPLaMo2連携機能の紹介 / PFN LLM セミナー
pfn
PRO
1
890
生成AIを活用したZennの取り組み事例
ryosukeigarashi
0
210
Goにおける 生成AIによるコード生成の ベンチマーク評価入門
daisuketakeda
2
110
定期的な価値提供だけじゃない、スクラムが導くチームの共創化 / 20251004 Naoki Takahashi
shift_evolve
PRO
3
330
ZOZOのAI活用実践〜社内基盤からサービス応用まで〜
zozotech
PRO
0
190
『OCI で学ぶクラウドネイティブ 実践 × 理論ガイド』 書籍概要
oracle4engineer
PRO
1
110
o11yで育てる、強い内製開発組織
_awache
3
120
PLaMo2シリーズのvLLM実装 / PFN LLM セミナー
pfn
PRO
2
1k
KMP の Swift export
kokihirokawa
0
340
自作LLM Native GORM Pluginで実現する AI Agentバックテスト基盤構築
po3rin
2
270
生成AIとM5Stack / M5 Japan Tour 2025 Autumn 東京
you
PRO
0
220
Shirankedo NOCで見えてきたeduroam/OpenRoaming運用ノウハウと課題 - BAKUCHIKU BANBAN #2
marokiki
0
150
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
How STYLIGHT went responsive
nonsquared
100
5.8k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.9k
Building an army of robots
kneath
306
46k
Scaling GitHub
holman
463
140k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
Six Lessons from altMBA
skipperchong
28
4k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
188
55k
GraphQLとの向き合い方2022年版
quramy
49
14k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
53k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.2k
Transcript
Ruby on JetsとRDS Proxyを使って Railsアプリをサーバレス化してみた 2019/01/09 20:20-20:35 AWS re:Invent Recap
with Serverless in Fusic 株式会社Fusic 岡嵜雄平
ࣗݾհ 岡嵜 雄平(@Y_uuu) 弊社サービスmockmockに携わるエンジニア re:Invent 2019に参加してきました 普段はRailsでの開発が主 ࣗݾհ
࠷ۙڵຯ͕͋Δ͜ͱ
࠷ۙڵຯ͕͋Δ͜ͱ • ࣾχίΧϨγεςϜ /JDPMF
࠷ۙڵຯ͕͋Δ͜ͱ • 3VCZPO+FUT
࠷ۙڵຯ͕͋Δ͜ͱ • 3%41SPYZ
ͭΛผʑʹΔͱ͕͔͔࣌ؒΔ ˣ ͭಉ࣌ʹΕ͍͍Μ͡ΌͶʁ
ͬͯΈ·ͨ͠
ࠓ͢͜ͱ 3BJMTͰ࡞ͬͨΞϓϦΛ+FUT্Ͱಈ͔͢ 3%41SPYZΛͬͯΈͨ ·ͱΊ
3BJMTͰ࡞ͬͨΞϓϦΛ+FUT্Ͱಈ͔͢
3VCZPO+FUTͱ AWS上で動作するサーバレスアプリケーションを Rubyで書くためのフレームワーク
3VCZPO+FUTͱ • ORMがRailsと同じActiveRecord • MVCやルーティングの書き⽅(メソッド)が同じ • ⼀部のGemが使える Ruby on
Railsと同じように実装できる
3VCZPO+FUTͱ 1コマンドでAWSへデプロイできる
3VCZPO+FUTͱ 1コマンドでAWSへデプロイできる DBにRDS・ DynamoDBの 両⽅が使える
LambdaとRDSは相性が良くない 2019年9⽉までの状況 1. VPCに配置したLambdaの起動に時間がかかる 2. Lambdaスケールアウト時にENIが枯渇する懸念 3. RDSへのコネクション数が上限に達する懸念
LambdaとRDSは相性が良くない 2019年9⽉以降ボトルネックが解消されつつある 1. VPCに配置したLambdaの起動に時間がかかる 9⽉のアップデートで解消 2. Lambdaスケールアウト時にENIが枯渇する懸念 9⽉のアップデートで解消 3.
RDSへのコネクション数が上限に達する懸念 re:Invent 2019でRDS-Proxyが発表
RDBを選択するメリット • ActiveRecordに依存するGemが使えるかもしれない • データの並び替えや検索が楽 • Railsと同じ感覚で⾼速に実装できる • 既存のRDBからのデータの移⾏が楽
ࠓճ3%#Λબ
構成
構成
4FSWFSMFTT
3VCZPO+FUTͰͷ࣮ アプリケーションを作成する HFNJOTUBMMKFUT KFUTOFXOJDPMFTFSWFSMFTT ˞OJDPMFTFSWFSMFTTσΟϨΫτϦʹ֤छϑΝΠϧ͕ࣗಈੜ͞ΕΔ DEOJDPMFTFSWFSMFTT CVOEMFJOTUBMM ZBSOJOTUBMM
3VCZPO+FUTͰͷ࣮ サーバ起動 KFUTTFSWFS ブラウザでアクセス可能
3VCZPO+FUTͰͷ࣮ Scaffoldする KFUTTDBGGPMEVTFSOBNFTUSJOH FNBJMTUSJOH ʜ KFUTECDSFBUF ECNJHSBUF
΄΅3BJMTͱಉ͡
3VCZPO+FUTͰͷ࣮ Railsで作ったNicoleのソースコードを移植
3VCZPO+FUTͰͷ࣮ Railsで作ったNicoleのソースコードを移植
3VCZPO+FUTͰͷ࣮ Railsで作ったNicoleのソースコードを移植
3VCZPO+FUTͰͷ࣮ デプロイする +&54@&/7QSPEVDUJPOKFUTEFQMPZ
΄΅3BJMTͱಉ͡
σϞ https://5mgq0llbxc.execute-api.ap-northeast-1.amazonaws.com/prod/
Jetsでハマったこと • RailsにあってJetsにない機能がいくつかある • asset pipeline(CSS/JSはwebpacker、imagesはpublic配下) • flash •
署名付きcookie • ActiveStorage • simple_format • i18n • (他にもまだありそう)
Jetsでハマったこと • リンクの⽣成について挙動の違いあり • Rails同様xxx_pathとかxxx_urlでリンク⽣成できる • Helperが⽣成されないケース(resourcesのネストやgetなど) • クエリパラメータ未対応(search/paginationに難あり)
Jetsでハマったこと • デプロイ環境で問題が発⽣した際の調査 • CloudWatch Logs頼みなので原因の切り分けが難しい • Lambdaの数が膨⼤なのでログ解析が困難 •
ログ解析基盤が無いと詰むかも
意外と⼤丈夫だったこと • 簡単にデプロイできる • IAMの設定 • Lambdaのサブネット、セキュリティグループの設定 • 他はデフォルトのまま
意外と⼤丈夫だったこと • 想像以上にRailsから移植しやすい • ModelとControllerはほぼコピペでOK • Viewのみリンク周りの修正が必要
ϋϚͬͨ1VMM3FRVFTUͷνϟϯε ͩͱࢥ͖ͬͯ߹͍͖͍ͬͯͨ
余談︓Rails Support • 既存のRailsアプリをjets deployできる https://rubyonjets.com/docs/rails/afterburner/ • これを使えばもっと簡単にサーバレス化できたかも…
3%41SPYZΛͬͯΈͨ
おさらい︓現状の構成
現状の構成でのスケールアウト 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
現状の構成でのスケールアウト db.t2.microのMAXコネクションで頭打ちに
AuroraServerlessを使った構成
4FSWFSMFTT
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
AuroraServerless構成でのスケールアウト コネクション数に応じてスケールアウト
RDS-Proxyを使った構成 ※RDS Proxyの最⼤接続数は80%(66×0.8=52)としています
4FSWFSMFTT
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)
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のタイムアウト
RDS-Proxyを使った構成 原因は調査中 • ブラウザでアクセスすると特に異常はない RDS Proxy経由で⼤量のアクセスしたときに 要求を捌ききれていない︖ • エンドポイントをRDSに戻すと特に異常はない
RDS-Proxyを使った構成 原因は調査中 • RDS-Proxyを経由するとRDS側のコネクション数が 40を超えない
RDS-Proxyを使った構成 原因は調査中 • RDS(MySQL)のmax_connectionsは66
RDS-Proxyを使った構成 原因は調査中 • DatabaseConnectionsCurrentlySessionPinnedが発⽣ • 接続の再利⽤効率の低下を引き起こす可能性があるとのこと 参考︓Managing Connections with
Amazon RDS Proxy (Preview) https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-proxy.html
RDS-Proxyを使った構成 原因は調査中 • PinningとRDSのコネクション数が増えない現象の 因果関係は確認中 • Pinningの回避策は模索中
RDS-Proxyを使った構成 原因は調査中 • AWSサポートとのやり取り継続中です • 原因が特定できたら何らかの⽅法で共有します
·ͱΊ
まとめ • Ruby on Jetsを使ってRailsアプリケーションを サーバレス化することができた • Aurora Serverlessを使ってLambdaの
スケールアウト対策ができることがわかった • RDS-Proxyについては引き続き検証を続ける
Thank you! Fusicは技術が好きなエンジニアを 募集しています