【諸説あり！？】RDSを素早く停止する方法を考えてみた！

# はじめに
この度、ANGEL Calendarの企画に参加しております！
記事一覧は下記のOrganizationアカウントの一覧をチェックしてみてください！
[2024-ANGEL-Dojo Organization](https://qiita.com/organizations/2024-angel-dojo) 

# RDSを素早く停止したい
こんにちは！ANGEL Calendar企画&運営のはらしまです！
栄えある2日目&平日初投稿をさせていただきます！
※以前[こちら](https://qiita.com/kharashima/items/50249da74d01c19ad989)の記事をOrganizationアカウントに紐づけて投稿させていただきました。

突然ですが、**AWS RDSって停止するまで時間かかるなあ**と思ったことありませんか？
データベースの再起動を行う際、停止は早ければ早いほど助かりますよね！
今回の記事では、RDSを素早く停止する方法について仮説を立て、それが正しいかどうか実際に検証してみました！
そんな検証してみたんだ:rolling_eyes:という感じで読んでいただければと思います！

### 仮説
本記事では、<font color="red">**停止前にスナップショットを取得しておくこと**</font>で停止が早くなるのではないかという仮説のもと検証を行いました。

### 仮説に至った経緯
知り合いのエンジニアとの雑談中、RDSの話になり、「停止する際にあまりにも時間がかかるよね...※¹」ということが話題に上がりました。
下記の画像の通り、RDSを停止する際には、オプションにてスナップショットを取得するかどうかを指定できます。

![スナップショット _ RDS _ ap-northeast-1 - Google Chrome 2024_08_16 20_13_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3849804/e266b95c-f7b5-bbfa-e82f-4f6fe28e34fe.png)

停止までの時間が長くなる原因の一つとして、**上記オプションを指定していない場合でも、管理側（AWSの基盤側）でスナップショットが必ず取得されている**のではないかという話になりました。
[RDSインスタンスの後続のスナップショットは増分](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups.html)ですので、上記の仮説が正しければ、**スナップショットを事前取得してから一時停止することで、停止までの時間を短くできるはず**※²です！仮説に対して、下記の方法で検証してみました！

※¹あくまでも個人の感想です。
※²事前にバックアップを取っておけば、停止の際のスナップショット作成の時間が短縮され、停止までの時間が短くなるのではないかという予想になります。
### 検証手順
1. 下準備として、シングルAZ構成のRDS(MySQL)を2台と、mysql clientをインストールした接続用EC2を作成し、RDSに対してダミーデータを書き込む※³。スナップショットの有無で停止にかかる時間を計測するため、それぞれのRDS名は下記とした。
    - <font color="red">**yes-snapshot**</font>：停止前に必ずスナップショットを取得する。
     + <font color="#1e90ff">**no-snapshot**</font>：スナップショットを取得せずに停止を行う。
1. 下記の手順を参考に<font color="red">yes-snapshot</font>のスナップショットを取得する。
    + [シングル AZ DB インスタンスの DB スナップショットの作成](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_CreateSnapshot.html)
1. 両方のRDSをスナップショット取得のオプションを付けずに一時的に停止し、時間を計測する※⁴。
     + [DB インスタンスの一時停止: 基本的な手順](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_StopInstance.html)

1回の計測では試行回数が足りないと考えたため、上記の検証を実施後、下記の作業を4回実施しました。また、条件をフラットにさせるため、毎回ダミーデータとスナップショットを取り直すようにしております。

1. 両方のRDSにダミーデータを書き込む。
1. <font color="red">yes-snapshot</font>のみスナップショットを取得する。
1. 両方のRDSをスナップショット取得のオプションを付けずに一時的に停止し、時間を計測する。

※³ダミーデータの作成方法は[こちら](#検証前準備)をチェック！
※⁴時間の計測については下記の式にて計算しております。
```
{AWS CLIにて取得したRDSの「DB instance stopped」ログが出た時刻※⁵} - {RDSの一時停止ボタンを押した時刻}
```
※⁵RDSのログ時刻については[こちらで](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ListEvents.html)確認しております。


### 検証前準備
RDSにダミーデータを書き込むことで、本番に近い形で検証を行います。

1. RDSに接続後、データベース"dummy_database"を作成する。
   ```sql
   CREATE DATABASE dummy_database;
   ```
1. データベース"dummy_database"に移動する。
   ```sql
   USE dummy_database;
   ```
1. テーブル"dummy"を作成する。
   ```sql
   CREATE TABLE dummy (
       id INT AUTO_INCREMENT PRIMARY KEY,
       name VARCHAR(50),
       email VARCHAR(50),
       created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
   );
   ```
1. ダミーデータ生成用のストアドプロシージャを作成する。
   ```sql
   DELIMITER //
   CREATE PROCEDURE generate_dummy_data(IN num_rows INT)
   BEGIN
       DECLARE i INT DEFAULT 1;
       WHILE i <= num_rows DO
           INSERT INTO dummy (name, email)
           VALUES (CONCAT('User', i), CONCAT('user', i, '@example.com'));
           SET i = i + 1;
       END WHILE;
   END//
   DELIMITER ;
   ```
1. ダミーデータを1000件生成する。
   ```sql
   CALL generate_dummy_data(1000);
   ```
1. テーブル"dummy"に保存されているデータの総件数が表示する。(確認作業)
   ```sql
   SELECT COUNT(*) FROM dummy;
   ```
1. テーブル"dummy"に保存されているデータの先頭10件が表示する。(確認作業)
   ```sql
   SELECT * FROM dummy LIMIT 10;
   ```
# 検証結果

実際に検証を行った結果を下記の表に記載いたします！
スナップショット<font color="red">**有り**</font>の場合|停止までにかかった時間
---|---
1回目|8分19秒
2回目|8分47秒
3回目|8分32秒
4回目|8分20秒
5回目|8分27秒
平均|<font color="red">**8分29秒**</font>


スナップショット<font color="#1e90ff">**無し**</font>の場合|停止までにかかった時間
---|---
1回目|8分47秒
2回目|8分26秒
3回目|8分20秒
4回目|8分41秒
5回目|8分43秒
平均|<font color="#1e90ff">**8分35.4秒**</font>


今回の検証では、スナップショットを取得した方が少しだけ停止までの時間を短縮させられることが確認できました:fist:
なお、RDSの停止までにかかる時間につきましては、AWSの基盤側のリソース状況等などの様々な要素で変動いたします。
そのため、今回の検証を同じ結果が常に得られるとは限りませんので、結果につきましてはご参考程度に認識いただけますと幸いです。
# 最後に
ただの雑談から始まった今回の検証ですが、一から自分の頭で考えて、無事結論を出すところまでやり切ることができました。「わからないことや未知の分野に対しても、とりあえずトライして自分の目で確かめてみよう」という姿勢は、AngelDojoを通して徐々に身についてきた気がします。
本記事を読んでいただいたうえで、そうなんだ～と思われた方は[へぇ～ボタン](https://dic.pixiv.net/a/%E3%81%B8%E3%81%87%EF%BD%9E%E3%83%9C%E3%82%BF%E3%83%B3)と「いいね！」を押していただけますと幸いです:relaxed:
Angel Calendarにつきましては明日からもまだまだ投稿が続きますので、ご期待くださいませ:stars::koala:

# 参考文献
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups.html

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_CreateSnapshot.html

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_StopInstance.html

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ListEvents.html

https://dic.pixiv.net/a/%E3%81%B8%E3%81%87%EF%BD%9E%E3%83%9C%E3%82%BF%E3%83%B3