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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Y_uuu
January 09, 2020
Technology
3.8k
6
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
More Decks by Y_uuu
See All by Y_uuu
PicoRuby for IoT: Connecting to the Cloud with MQTT
yuuu
2
890
Porting filesystem-fat to Another Microcontroller: ESP32
yuuu
2
400
Porting PicoRuby to Another Microcontroller: ESP32
yuuu
4
1.1k
RubyKaigi 2025でプロポーザルが初めて採択されるまでにやったこと
yuuu
1
760
地方企業の強みを活かす!AWSを活用したIoTシステムの開発事例とその裏側
yuuu
0
180
あの重機は今どこにある?- 重機管理IoTプロダクトのバックエンドをAWSで構築した話 -
yuuu
0
1.1k
mruby-esp32におけるペリフェラルAPIの実装検討
yuuu
1
910
育成力 - エンジニアの才能を引き出す環境とチューターの立ち回り -
yuuu
4
5.1k
committee-railsとOpenAPI Generatorでスキーマ駆動なAPI開発をする
yuuu
0
1.1k
Other Decks in Technology
See All in Technology
「守りたい体験」を渡すだけで E2E を生成させられるようになった話
hinac0
2
1k
Kaggleで成長するために意識したこと
prgckwb
2
440
インシデント事例と パッケージの全量解析に学ぶ ソフトウェアサプライチェーンの守り方 / supply-chain-attack-defense
flatt_security
0
880
20260720_クラウド女子会×PyLadiesTokyoコラボ Amazon Bedrock ハンズオン用資料
yuuka51
1
110
アップデートで何が変わった?デモで学んで使いこなすIBM Bob2.0
muehara
0
220
発表と総括 / Presentations and Summary
ks91
PRO
0
190
Multicaで30個のミニプロジェクトをAIエージェント運用して見えてきたこと
eiei114
1
620
AI時代におけるテストの基礎の再定義 / Rethinking the Fundamentals of Testing in the AI Era
mineo_matsuya
12
4.1k
ファミコンでPHPを動かす / PHP on the Famicom
tomzoh
2
600
GoでCコンパイラを作った話
repunit
0
150
なぜ、あなたのエージェントは言うことを聞かないのか
segavvy
1
340
ダッシュボード"開発"について 〜使われるダッシュボードのつくりかた〜
kimichan
0
190
Featured
See All Featured
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.5k
My Coaching Mixtape
mlcsv
0
170
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
190
エンジニアに許された特別な時間の終わり
watany
108
250k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Fireside Chat
paigeccino
42
4k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
190
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
320
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
470
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.1k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
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は技術が好きなエンジニアを 募集しています