Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Ruby on JetsとRDS Proxyを使ってRailsアプリをサーバレス化してみた
Y_uuu
January 09, 2020
Technology
6
2.7k
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
SORACOM ArcでオフィスのIoT化を進行中です⭐
yuuu
1
410
AWSのIoTサービスをおさらいしよう
yuuu
0
63
mrubyを1300円のボードで動かそう
yuuu
0
310
社内をIoT化していくための施策集📔
yuuu
0
850
アクアシャッターf IoT異常通報システム開発記 〜 AWSとSORACOMとmockmock
yuuu
0
390
AWS SAM + Rubyのすゝめ
yuuu
0
370
現代版・ポケベルを支える技術 - SORACOM UG Explorer 2020 LT
yuuu
0
230
AWS AmplifyとmockmockでIoTバックエンドをスピーディに構築する
yuuu
2
720
そのIoTシステム、デバイスが1000台になっても大丈夫ですか?
yuuu
2
1.2k
Other Decks in Technology
See All in Technology
CES_2023_FleetWise_demo.pdf
sparkgene
0
120
日本ディープラーニング協会主催 NeurIPS 2022 技術報告会講演資料
tdailab
0
1.1k
Oracle Transaction Manager for Microservices Free 22.3 製品概要
oracle4engineer
PRO
5
110
目指せCoverage100%! AutoScale環境におけるSavings Plans購入戦略 / JAWS-UG_SRE_Coverage
taishin
0
510
NGINXENG JP#2 - 3-NGINX Plus・プロダクトのアップデート
hiropo20
0
250
ラズパイとGASで加湿器の消し忘れをLINEでリマインド&操作
minako__ph
0
150
組織に対してSREを適用するとどうなるか
kuniim
8
2.8k
開発者と協働できるメトリクスダッシュボードを作ろう!/SRE Lounge 2023
lmi
3
500
創業1年目のスタートアップでAWSコストを抑えるために取り組んでいること / How to Keep AWS Costs Down at a Startup
yuj1osm
3
2.2k
「一通りできるようになった」その先の話
hitomi___kt
0
130
Kaggleシミュレーションコンペの動向
nagiss
0
280
NGINXENG JP#2 - 1-NGINX-エンジニアリング勉強会-きょうの見どころ
hiropo20
0
110
Featured
See All Featured
Unsuck your backbone
ammeep
659
56k
Robots, Beer and Maslow
schacon
154
7.3k
A Tale of Four Properties
chriscoyier
149
21k
Building Applications with DynamoDB
mza
85
5k
Writing Fast Ruby
sferik
613
58k
Put a Button on it: Removing Barriers to Going Fast.
kastner
56
2.5k
A Modern Web Designer's Workflow
chriscoyier
689
180k
How GitHub (no longer) Works
holman
298
140k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
13
1.1k
Web development in the modern age
philhawksworth
197
9.6k
ParisWeb 2013: Learning to Love: Crash Course in Emotional UX Design
dotmariusz
101
6.2k
Creatively Recalculating Your Daily Design Routine
revolveconf
207
11k
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Ͱͷ࣮ デプロイする +&
[email protected]
&/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は技術が好きなエンジニアを 募集しています