はじめに
医療系クラウドサービスを提供しているレイヤードという会社で働いています。
新サービスを開発中で、社内リソースの問題から外注に開発してもらっていました。
まだ 本番稼働していないにも関わらず、2023年6月25日時点でaws費用が$915、月末予測が$1,200にもなっており 、調査依頼してもはっきりとした回答が無かったので、横槍ですが原因調査した内容の共有です。
調査は弊社エンジニアの采本さんがほとんどやってくれました。
いつもありがとう、頼りにしてます。
アーキテクチャ構成
アプリケーションの構成は以下のとおり。
言語:TypeScript
フロント:Vue.js
バックエンド:Node.js on lambda
データベース:RDS proxy + Aurora serverless v2(reader + writerの2台構成)
料金内訳
最初の「はじめに」で添付した画像の通り、RDSがコストの大半を占めているのは一目瞭然なので、さらに詳細に確認しました。
RDS proxy高いな。。でもバックエンドをlambdaでやる以上しょうがないよね。。。
Aurora serverless v2高いとは思ってたけど、、、それにしても高いな。。。 ホンマか!?
原因
Lambda-RDS Proxy間でコネクションのピン留めという現象が発生していました。
データベースコネクションを固定化して再利用不可
とする(=コネクションが増えていく)現象です。
RDS proxyのログを「pinn」検索したところ、set句発行によるピン留め
と、16kbを超えるSQLの発行によるピン留め
の2つが確認できました。
このピン留めの影響で、アプリケーションを利用していない(無風状態の)時でも、データべースのコネクションが維持され高価なAurora v2のACUの利用率が下がらない
という事象が発生。
本番稼働していないので夜間は誰も使っていないのに、Aurora v2が4ACU程度ずっと使っている状況(設定上minは1)になっていました。
今回のプロジェクトでは、16kbを超えるSQLが多少頻発して本現象が発生していました(この状態で本番稼働していたら金額ヤバかったかもー)。
set句発行によるピン留めは以下のような感じで、特段珍しくも無い変数も対象となるので油断するとヤっちゃいそいうだなと思いました。
- AUTOCOMMIT
- AUTO_INCREMENT_INCREMENT
- CHARACTER SET (or CHAR SET)
- CHARACTER_SET_CLIENT
- CHARACTER_SET_DATABASE
- CHARACTER_SET_FILESYSTEM
- CHARACTER_SET_CONNECTION
- CHARACTER_SET_RESULTS
- CHARACTER_SET_SERVER
- COLLATION_CONNECTION
- COLLATION_DATABASE
- COLLATION_SERVER
- INTERACTIVE_TIMEOUT
- NAMES
- NET_WRITE_TIMEOUT
- QUERY_CACHE_TYPE
- SESSION_TRACK_SCHEMA
- SQL_MODE
- TIME_ZONE
- TRANSACTION_ISOLATION (or TX_ISOLATION)
- TRANSACTION_READ_ONLY (or TX_READ_ONLY)
- WAIT_TIMEOUT
詳しくは、下記参考に貼っているawsのドキュメントをご参考ください。
対応
参考サイトと同じ明示的disconnectで回避はできそうですが、DB接続のオーバーヘッドも大きくなるので考え物ではあります(出来ればアプリケーション側で対策したいですね)。
しかし今回は、外注さんがlambdaを止めてApp Runnerにしたいと言い出したのでRDS proxyが不要になり、本件問題も自動的に解消される事になりました(RDS proxy料金も無くなるのでワーイ)。
おわりに
今回はアーキテクチャ変更により何もせず解決の方向になりましたが、今後Aurora serverless v2は上手に使っていきたい意図もあったので、ある程度納得感のある結果まで調べる事にしました。
とはいえAurora serverless v2はまだまだ基本単価が高く使い辛いので、もうちょっと安くなる事を期待したいですね。
最近は既存Webサービスを、EC2 on ElasticBeanstalkからFargate on ECSに乗り換えるプロジェクトをシコシコ頑張っております。
今更のアーキテクチャではありますが、色々とクセがありましたので折をみて少しずつ書いていきたいと思います。