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.4k
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
地方企業の強みを活かす!AWSを活用したIoTシステムの開発事例とその裏側
yuuu
0
58
あの重機は今どこにある?- 重機管理IoTプロダクトのバックエンドをAWSで構築した話 -
yuuu
0
700
mruby-esp32におけるペリフェラルAPIの実装検討
yuuu
1
610
育成力 - エンジニアの才能を引き出す環境とチューターの立ち回り -
yuuu
4
4.5k
committee-railsとOpenAPI Generatorでスキーマ駆動なAPI開発をする
yuuu
0
790
mrubyでマイコンの世界に足を踏み入れる
yuuu
2
1.8k
mruby on IoT devices.
yuuu
4
2.3k
SORACOM ArcでオフィスのIoT化を進行中です⭐
yuuu
1
1.1k
AWSのIoTサービスをおさらいしよう
yuuu
1
280
Other Decks in Technology
See All in Technology
4th place solution Eedi - Mining Misconceptions in Mathematics
rist
0
150
Log Analytics を使った実際の運用 - Sansan Data Hub での取り組み
sansantech
PRO
0
120
Global Databaseで実現するマルチリージョン自動切替とBlue/Greenデプロイ
j2yano
0
170
どちらかだけじゃもったいないかも? ECSとEKSを適材適所で併用するメリット、運用課題とそれらの対応について
tk3fftk
2
280
サイト信頼性エンジニアリングとAmazon Web Services / SRE and AWS
ymotongpoo
7
1.9k
AIエージェント時代のエンジニアになろう #jawsug #jawsdays2025 / 20250301 Agentic AI Engineering
yoshidashingo
9
4.2k
DevinでAI AWSエンジニア製造計画 序章 〜CDKを添えて〜/devin-load-to-aws-engineer
tomoki10
0
220
AI自体のOps 〜LLMアプリの運用、AWSサービスとOSSの使い分け〜
minorun365
PRO
9
1.1k
EMConf JP 2025 懇親会LT / EMConf JP 2025 social gathering
sugamasao
2
210
役員・マネージャー・著者・エンジニアそれぞれの立場から見たAWS認定資格
nrinetcom
PRO
5
6.8k
MLflowはどのようにLLMOpsの課題を解決するのか
taka_aki
0
140
AIエージェント開発のノウハウと課題
pharma_x_tech
9
4.9k
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
68
4.6k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.5k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Testing 201, or: Great Expectations
jmmastey
42
7.2k
Music & Morning Musume
bryan
46
6.4k
KATA
mclloyd
29
14k
Unsuck your backbone
ammeep
669
57k
YesSQL, Process and Tooling at Scale
rocio
172
14k
How to Think Like a Performance Engineer
csswizardry
22
1.4k
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.5k
Why Our Code Smells
bkeepers
PRO
336
57k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
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は技術が好きなエンジニアを 募集しています