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.5k
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 PicoRuby to Another Microcontroller: ESP32
yuuu
4
720
RubyKaigi 2025でプロポーザルが初めて採択されるまでにやったこと
yuuu
1
470
地方企業の強みを活かす!AWSを活用したIoTシステムの開発事例とその裏側
yuuu
0
94
あの重機は今どこにある?- 重機管理IoTプロダクトのバックエンドをAWSで構築した話 -
yuuu
0
930
mruby-esp32におけるペリフェラルAPIの実装検討
yuuu
1
730
育成力 - エンジニアの才能を引き出す環境とチューターの立ち回り -
yuuu
4
4.7k
committee-railsとOpenAPI Generatorでスキーマ駆動なAPI開発をする
yuuu
0
900
mrubyでマイコンの世界に足を踏み入れる
yuuu
2
2k
mruby on IoT devices.
yuuu
4
2.5k
Other Decks in Technology
See All in Technology
Definition of Done
kawaguti
PRO
5
380
2025/6/21 日本学術会議公開シンポジウム発表資料
keisuke198619
2
420
OpenTelemetry Collector internals
ymotongpoo
5
560
Copilot Agentを普段使いしてわかった、バックエンド開発で使えるTips
ykagano
1
1.3k
(非公式) AWS Summit Japan と 海浜幕張 の歩き方 2025年版
coosuke
PRO
1
300
Autonomous Database サービス・アップデート (FY25)
oracle4engineer
PRO
2
780
ハノーバーメッセ2025座談会.pdf
iotcomjpadmin
0
120
生成AIをテストプロセスに活用し"よう"としている話 #jasstnano
makky_tyuyan
0
230
Kotlinで学ぶ 代数的データ型
ysknsid25
5
1.1k
BigQuery Remote FunctionでLooker Studioをインタラクティブ化
cuebic9bic
2
110
工具人的一生: 開發很多 AI 工具讓我 慵懶過一生
line_developers_tw
PRO
0
260
Workflows から Agents へ ~ 生成 AI アプリの成長過程とアプローチ~
belongadmin
3
170
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Thoughts on Productivity
jonyablonski
69
4.7k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
35
2.3k
Stop Working from a Prison Cell
hatefulcrawdad
269
20k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
GraphQLとの向き合い方2022年版
quramy
46
14k
Git: the NoSQL Database
bkeepers
PRO
430
65k
Gamification - CAS2011
davidbonilla
81
5.3k
Navigating Team Friction
lara
186
15k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
GitHub's CSS Performance
jonrohan
1031
460k
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は技術が好きなエンジニアを 募集しています