RDS延長サポート対応時の棚卸しで実施してみたことをまとめてみる
はじめに
かつまたです。
MySQL 5.7 の RDS が複数残っていて、「これ本当に使われてるんだっけ?」が誰も即答できない、という場面ありませんか。RDS for MySQL 5.7 は 2024 年 2 月に標準サポートが終了していて、今は延長サポートの課金が乗っています。しかも Year 3(3 年目)の単価が一番高く、2027 年 2 月末には強制アップグレードも控えているので、使っていない RDS は早めに消したいという対応が発生することがあります。
いざ棚卸しを始めると使っている/使っていないの線引きが難しかったため、今回はその判断をどう進めたかを備忘録として残しておきます。
対応内容
多方面から調査をしていきます。
1. メトリクスで絞り込み
まず CloudWatch の DatabaseConnections を 15 ヶ月ぶん取得して、ずっとゼロのものを削除候補、接続があるものをアップグレード候補にざっくり仕分けします。
REGION=ap-northeast-1
DB_ID=db-a
aws cloudwatch get-metric-statistics \
--namespace AWS/RDS \
--metric-name DatabaseConnections \
--dimensions Name=DBInstanceIdentifier,Value=$DB_ID \
--start-time $(date -u -d '15 months ago' +%Y-%m-%dT00:00:00Z) \
--end-time $(date -u +%Y-%m-%dT00:00:00Z) \
--period 2592000 \
--statistics Maximum \
--region $REGION \
--query "sort_by(Datapoints,&Timestamp)[].[Timestamp,Maximum]" \
--output table
--period 2592000 は 30 日、つまり月次の最大値を見ています。接続実績がゼロだと、こんな出力になります。
------------------------------------------------
| GetMetricStatistics |
+----------------------------+-----------------+
| 2025-03-01T00:00:00+00:00 | 0.0 |
| 2025-04-01T00:00:00+00:00 | 0.0 |
| 2025-05-01T00:00:00+00:00 | 0.0 |
| ... | ... |
| 2026-05-01T00:00:00+00:00 | 0.0 |
+----------------------------+-----------------+
15 ヶ月すべて Maximum: 0.0 なら、少なくともメトリクスが残っている期間は一度も接続されていない、と言えます。
2. SG 許可元調査
メトリクスがゼロでも、SG に許可ルールが残っていると不安が残るので、その許可 IP が実際どこに紐づいていて、そもそも到達できるのかを 1 つずつ見ていきます。
まず MySQL の場合、3306/TCP の Inbound ルールを確認します。
aws ec2 describe-security-groups \
--group-ids sg-0123456789abcdef0 \
--region $REGION \
--query "SecurityGroups[0].IpPermissions[?ToPort==\`3306\`].IpRanges[].[CidrIp,Description]" \
--output table
出力例
---------------------------------------------------------
| DescribeSecurityGroups |
+--------------------+----------------------------------+
| 10.0.0.0/16 | Internal VPC access |
| 192.0.2.10/32 | External tool A |
| 198.51.100.20/32 | (no description) |
| 203.0.113.5/32 | External tool B |
+--------------------+----------------------------------+
出てきた許可元を、実体と到達可能性で分類していきます。
PubliclyAccessible: False の RDS だと、Public IP 経由の許可ルールはたいてい「設定だけ残っていて到達できない」ものでした。
3. 接続があるものは実接続元を特定
メトリクスで接続が見えているものは、general_log か VPC Flow Logs で実際の接続元を特定します。
本番 RDS に general_log を有効化するのが怖い場合は、スナップショットから復元したクローンに対して有効化すると、本番に影響を与えずにスナップショット時点までのクエリを採れます。
SELECT
DATE_FORMAT(event_time, '%Y-%m-%d %H:%i') AS time_min,
user_host,
COUNT(*) AS query_count
FROM mysql.general_log
WHERE user_host NOT LIKE 'rdsadmin%'
GROUP BY time_min, user_host
ORDER BY time_min DESC
LIMIT 100;
rdsadmin の内部接続は WHERE で除外しておきます。実行するとこんな感じです。
+------------------+-------------------------------------+-------------+
| time_min | user_host | query_count |
+------------------+-------------------------------------+-------------+
| 2026-05-22 14:03 | app_user[app_user] @ [10.0.1.50] | 42 |
| 2026-05-22 14:02 | app_user[app_user] @ [10.0.1.50] | 38 |
| 2026-05-22 09:15 | batch_user[batch_user] @ [10.0.2.7] | 120 |
+------------------+-------------------------------------+-------------+
user_host に出てくる接続元 IP を SG の許可ルールと突き合わせれば、実接続元が確定します。この例だと 10.0.1.50 と 10.0.2.7 が本物の接続元なので、あとはこの IP を持つクライアントの持ち主を辿っていきます。
おわりに
ご覧いただきありがとうございました。
未使用 RDS の棚卸しは、メトリクスだけ・SG だけ・ログだけ、のどれか一つでは判断しきれず、いくつかの角度から数字を積み上げていくしかないな、というのが今回やってみての感想です。
環境によってヒアリング・ログ採取などさまざまな対応方法があると思いますので参考の1つにしていただければ幸いです。
参考
クラスメソッドオペレーションズ株式会社について
クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。
※2026年1月 アノテーション㈱から社名変更しました







