【AWS】RDS備忘録

RDSのチュートリアル

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

RDSのベストプラクティス

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_BestPractices.html#CHAP_BestPractices.DiskPerformance

## RDS概要

RDSインスタンスタイプは主に3つあり、それぞれ用途が異なっている。
常時アクティビティが発生するケースはr/t クラス、増減の激しいアクティビティのケースはサーバーレスv2が適している。

 - [サーバーレス v2](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.html)
   高速ケーリング可能対応のRDS
   1 ACUで0.20 USD/時 (144 USD/月)
 - メモリ最適化クラス (r クラスを含む)
   db.r6g.2xlargeインスタンスで914.69 USD/月
 - バースト可能クラス (t クラスを含む)
   db.t3.mediumで91.25 USD/月
 - 最適化された読み取りクラス - 新規*
   db.r6gd.xlargeインスタンスで0.51 USD/時
   *PostgresSQLの読み取り専用DB

 RDSとAuroraの違いは、データベース構造が異なっており、Auroraはコンピューティングインスタンスとストレージが分離しており、データを複数のアベイラビリティーゾーンに複製して、同時にアクセスしている。

![RDS_16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/0d18a8af-0768-733b-bceb-29e7c8610014.png)

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Aurora.Overview.html

## RDSの作成
1. Amazon RDSコンソール画面を開く
1. データベース->データベースの作成を押す
1. データベース作成方法は、標準作成を選択
  ![RDS_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/b793122f-25a8-b0c4-bd5b-80bb392ecf16.png)
1. エンジンは、Aurora (MySQL comparable)を選択
  ![RDS_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/f2fb83d0-64a4-e28b-7cb3-dbbdd1b6442e.png)
1. テンプレートは、開発/テストを選択
  ![RDS_3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/cb4f3646-f493-d460-d60f-165ea2c4f615.png)
1. DB クラスター識別子は、そのまま、database-1
  ![RDS_4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/b48bf6d5-4411-efb7-1dd2-f53bfe60ed43.png)
1. マスターユーザー名は、admin
1. マスターパスワードは、適当な8文字以上
  ![RDS_5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/e710f4b0-e28c-2a57-4296-5a949296dd78.png)
1. もしくはSecret ManagerでKMSキーを管理・発行・ローテーションを行うよう設定する
  ![RDS_6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/532cd17e-720a-7821-916c-154edfcd4a66.png)
1. クラスターストレージ設定は、Aurora スタンダードを選択
  ![RDS_7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/26fb69e5-e8a0-ef7c-6cde-9a5c2727b185.png)
1. インスタンスの設定は、開発段階なら安いバースト可能なtクラスのインスタンスにする
  ![RDS_8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/effd45f8-38db-2536-9611-d531b436b0dd.png)
1. 可用性と耐久性は、別の AZ で Aurora レプリカ/リーダーノードを作成する (可用性のスケーリングに推奨)を選択
  ![RDS_9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/62459ae5-965a-d430-ed87-3209b912bcaf.png)
1. 接続は、一旦EC2 コンピューティングリソースに接続しないでよい。後から、編集可能。
  ![RDS_11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/76ebbee7-2106-a09b-88c8-31e7449e82d6.png)
1. データベース認証で、IAMデータベース認証を設定することもできる。
  ![RDS_12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/14487591-7180-562b-9881-f3c3baac98c9.png)
1. *オプションで、その他の設定をする
1. データベースの作成を押す
![RDS_14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/dd0700f5-02ad-58ea-2774-d1a74e6004af.png)

10~20分ほどで作成され、実行可能になる。

## RDSの設定
1. コンソール画面でデータベース->対象のデータベースを選択する
1. アクションから必要な操作を行う

|アクション  |意味  |
|---|---|
|一時的に停止  |2  |
|データベースアクティビティストリームを開始  |リアルタイムモニタリング |
|削除 |  |
|EC2接続のセットアップ  | VPC セキュリティグループを自動的に設定  |
|Lambda接続のセットアップ  |RDS プロキシ経由の接続を設定  |
|AWSリージョンを追加 |  |
|リーダーの追加 |グローバルデータベース  |
|クロスリージョンのリードレプリカの作成 |クロスリージョンのリードレプリカ  |
|プルー/グリーンデプロイの作成-新規 |デプロイ方法  |
|クローンの作成 |複製  |
|昇格 |レプリカの昇格  |
|スナップショットの取得 |スナップショット作成  |
|特定時点への復元 |復元  |
|バックトラック |巻き戻し  |
|Amazon S3にエクスポート-新規 |  |
|レプリカのAuto Scalingの追加 |  |
|RDSプロキシの作成 |RDSプロキシ  |
|ElastiCacheクラスターの作成-新規 |ElastiCache  |

ElastiCacheとRDS Proxyの追加設定をAWSは推奨しているようです。
![RDS_15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/f003533b-1683-ebe4-1963-a5e5d5938e5d.png)

## クエリエディタでコンソール画面からSQL実行

:::note warn
Aurora Serverless v2でかつPostgresSQLのみ利用可能
しかも最近 2023/12/21
https://aws.amazon.com/jp/about-aws/whats-new/2023/12/amazon-aurora-postgresql-rds-data-api/
:::

1. RDSコンソール画面 -> クエリエディタを開く
1. Aurora Serverless v2を立ち上げて、Data API を有効にしている場合は、下記入力画面が表示される。
  データベース名：postgres
  データベースパスワード：8桁
  データベースの名前：インスタンスの名前
  ![RDS_17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/aaab5ba4-4812-314e-a020-d726fa41220b.png)
  ![RDS_18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/ff3962f8-fb92-2e73-e0fb-114ab2872b25.png)
1. 正常にログインできると、下記のようにSQLが打てる画面に遷移する
 ![RDS_19.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/8adc9038-9c0b-c120-fc63-2e9039e25125.png)

## RDSの接続
1. コンソール画面「接続とセキュリティ」タブからDB エンドポイントを確認する
1. 

## データベース認証でSecrets Managerを使用する
1. AWS Secrets Managerを開く
1. 新しいシークレットを保存するを押す
1. Amazon RDS データベースの認証情報を選択
    ![SM1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/02fdc149-0bed-42ab-9c45-ccd3e2d6685e.png)
1. RDSで指定したユーザー名、パスワードを入力する
    ![SM2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/f3db7440-5d35-683a-de19-418cd4754188.png)
1. 対象のRDインスタンス識別子を選択
    ![SM3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/4adb7f01-8e70-7743-2089-e289ced0b29e.png)
1. 次へを押す
1. シークレットの名前を入力する
    ![SM4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/c94a346d-4497-b8fb-8d89-98698b5fa6d1.png)
1. 次へを押す
1. 自動ローテーションを有効にする
1. ローテーションスケジュール を設定する
    ![SM5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/7cc8d9db-5b60-4fab-1f05-efe75a7c4efb.png)
1. Lambda ローテーション関数の関数名を入力する
    ![SM6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/7377a667-1df1-61e4-c98d-1739f7bc5f45.png)
1. 保存を押す
    ![SM7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/4530e3ce-b01d-efbc-c779-271de24d2b96.png)
1. 下記コマンドで認証情報を取得する

AWS CLIの場合
```CLI
aws secretsmanager get-secret-value --secret-id シークレットの名前 --region ap-northeast-1
```
```
{
    "ARN": "arn:aws:secretsmanager:ap-northeast-1:*************:secret:aaaaa-ASUwXN",
    "Name": "aaaaa",
    "VersionId": "******-ad9b-41ea-bf89-c40******",
    "SecretString": "{\"username\":\"admin\",\"password\":\"aaaaaaaa\",\"engine\":\"mysql\",\"host\":\"database-1.cluster-cuuhfadkqugz.ap-northeast-1.rds.amazonaws.com\",\"port\":3306,\"dbClusterIdentifier\":\"database-1\"}",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": "2024-02-08T10:18:59.858000+09:00"
}
```

Python SDKの場合
```Python
import boto3
from botocore.exceptions import ClientError

def get_secret():

    secret_name = "aaaaa"
    region_name = "ap-northeast-1"

    # Create a Secrets Manager client
    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region_name=region_name
    )

    try:
        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
        )
    except ClientError as e:
        raise e

    secret = get_secret_value_response['SecretString']
```

## Aurora Serverless v2 の特徴

### 起動・停止・再起動
RDS全般だが起動・停止・再起動で数十分くらいかかる。
再起動する場合は、ダウンタイムの発生に気を付ける。

再起動は5~10分程度
![RDS0124.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/fe57304c-6adc-4184-502b-74f1c7ba42c9.png)

### 容量のスケールダウンの仕様
Aurora Serverless v2の容量のスケールダウンは、以下の仕様がある。
 1. 下記の機能を使用していると、容量が最小容量までスケールダウンしない場合がある。
 2. かつ設定変更後は再起動しないと、設定が変更されないパラメータ(共有メモリパラメータ:max_connectionsやmax_locks_per_transaction 等)がある。
  - Aurora Global Database
  - CloudWatch Logs のエクスポート
  - Aurora PostgreSQL 互換 DB クラスターでの pg_audit の有効化
  - 拡張モニタリング
  - Performance Insights

### Aurora Auto Scalingはサポート外
自動で滑らかに垂直スケーリングするため、Auto Scalingによる水平スケーリングはあまり意味を持たないため、サポート外となっている。

### モニタリング
1. デフォルトでコンソール画面からメトリクスを確認することができる。
    重要なメトリクス
     - ServerlessDatabaseCapacity
       DB インスタンスの容量で表される ACU 値
     - ACUUtilization
       ACU の使用率
     - CPUUtilization
   CPU の使用率
     - FreeableMemory
       未使用のメモリ量
     - TempStorageIops
       DB インスタンスにアタッチされたローカルストレージで実行された IOPS の数
     - TempStorageThroughput
       DB インスタンスに関連するローカルストレージとの間で転送されるデータの量
    
2. Performance Insights を使用したDB 負荷のモニタリング
より詳細にメトリクスをリアルタイムで監視・可視化することができるダッシュボード。
DB クラスターレベルで有効化可能。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.setting-capacity.html#aurora-serverless-v2.viewing.monitoring

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/USER_PerfInsights.Overview.html

#### CloudWatchログへ詳細なログを送る方法

1. RDSコンソール画面を開く
1. コンソール画面左メニューからパラメータグループを選択する
1. パラメータグループの作成を押す
   ![RDS_20.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/c2db2f60-ec24-025e-a294-7f8dd67beb07.png)
1. 対象のデータベースと同じDB ファミリー(クラスターパラメータ)を選択し、適当にグループ名、説明を入力する
   ![RDS_21.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/bce9c308-95c3-735c-cb1e-1cf877b89931.png)
1. 作成を押す
1. 作成したパラメータグループを選択し、編集を押す
1. general_logを検索し、値を1に変更する
   ![RDS_22.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/56012157-bcfd-7fe2-80dc-bb66bb702977.png)
1. 変更を保存を押す
1. 対象のデータベースの変更を押す
1. 追加設定からDB クラスターのパラメータグループを選択する
1. その下のログのエクスポートのセクションで、CloudWatch Logs に公開するログを選択する
   監査ログ, 全般ログ, スロークエリログ, ログ出力
    ![RDS_23.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/4478a157-3966-23a7-ee05-64cd75282281.png)
1. 続行 -> クラスターの変更を押す
1. DB インスタンスを再起動する

### Aurora Serverless v2とAurora RDS Cluster間の変換

 - Aurora RDS Clusterのライターまたはリーダーを Aurora Serverless v2 に変換する場合
   DBインスタンスをAurora Serverless v2へ変換後、クラスター自体を以降するとダウンタイムなしで変換できる
   https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.upgrade.html#aurora-serverless-v2.switch-from-provisioned
 - Aurora Serverless v2 ライターまたはリーダーをAurora RDS Clusterに変換する場合
   Aurora Serverless v2 で使用する Aurora バージョンが使用可能な DB インスタンスに変換可能

## まとめ
今回は、RDSの作成・設定・接続・パスワードの管理について、紹介した。