個人的備忘録：RDS MySQL環境を一発構築！パラメータ・オプション設定まとめ

## はじめに

AWSのRDS MySQL 8.0で効率的にサーバを運用するためには、デフォルトの設定ではなく環境に合わせたチューニングが必要になる場合があります。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

そのため、CloudFormationを使って第一段階でパラメータグループやオプショングループを作成するテンプレートを用意しました。

## 書こうと思ったきっかけ

MySQL RDSの初期構築時に、デフォルト値だと効率が悪かったり、スロークエリを逆に見落とすことがあるため、よく使われるチューニングパラメータをあらかじめ定義したテンプレートを作ろうと考えたためです。

**実際のテンプレート**

https://github.com/2025SpringTeamA/infra-CloudFormation/blob/main/RDS-MySQL-params_pon.yaml

---

### 1. RDS MySQL 8.0 用「DBパラメータグループ」
(リソース名: `MyDBParameterGroup`)

**パラメータ一覧 (設定内容)**：

| パラメータ名 | 設定値 | 説明 |
|:---|:---|:---|
| max_connections | 100 | 同時接続数の上限 |
| innodb_buffer_pool_size | 3221225472 | InnoDBバッファプールサイズ（約3GB） |
| innodb_log_file_size | 536870912 | InnoDBログファイルサイズ（512MB） |
| innodb_flush_log_at_trx_commit | 2 | トランザクションコミット時のログフラッシュ効果(パフォーマンス重視) |
| table_open_cache | 512 | 同時オープン可能なテーブルキャッシュ数 |
| tmp_table_size | 67108864 | 一時テーブルサイズの上限（64MB） |
| max_allowed_packet | 67108864 | 1パケットあたりの最大許可サイズ（64MB） |
| max_execution_time | 30000 | クエリの最大実行時間（ミリ秒）30秒） |
| net_write_timeout | 120 | 書き込みタイムアウト（秒） |
| net_read_timeout | 120 | 読み取りタイムアウト（秒） |
| sort_buffer_size | 3145728 | ソート時バッファサイズ（約3MB） |
| join_buffer_size | 3145728 | JOIN操作時バッファサイズ（約3MB） |
| innodb_io_capacity | 200 | InnoDBストレージIO能力の情報 |
| innodb_read_io_threads | 4 | InnoDB読み込みIOスレッド数 |
| innodb_write_io_threads | 4 | InnoDB書き込みIOスレッド数 |
| log_bin_trust_function_creators | 1 | バイナリログ使用時のファンクション作成許可 |
| slow_query_log | 1 | スロークエリログを有効化 |
| long_query_time | 2 | スロークエリ認識実行時間（2秒） |
| character_set_server | utf8mb4 | デフォルトサーバ文字コード（絵文字対応） |
| collation_server | utf8mb4_0900_ai_ci | デフォルト照合順序（MySQL8.0標準） |
| time_zone | Asia/Tokyo | サーバータイムゾーン（日本時間） |

---

### 2. RDS MySQL 8.0 用「オプショングループ」
(リソース名: `MyDBOptionGroup`)

**オプション一覧 (追加されている内容)**：

| オプション名 | 説明 |
|:---|:---|
| MARIADB_AUDIT_PLUGIN | 監査ログ取得用プラグイン (セキュリティ監査目的) |

(エンジン名：`mysql`、メジャーバージョン：`8.0`で固定)

---

## まとめ

- DBパラメータグループでMySQL8.0を性能、ロギング、タイムゾーン設定などの面で最適化
- オプショングループで監査ログ準備を行い、セキュリティ安全性を小さい手間で向上させる

以上を個人的備忘録としてテンプレートおよび記事にまとめています。

### おまけ：実際のコード

```test.yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: CloudFormation template to create RDS MySQL 8.0 Parameter Group and Option Group

Parameters:
  DBFamily:
    Description: MySQL DB Parameter Group Family
    Type: String
    Default: mysql8.0

  OptionGroupName:
    Description: The name of the Option Group
    Type: String
    Default: my-mysql-option-group

Resources:
  MyDBParameterGroup:
    Type: AWS::RDS::DBParameterGroup
    Properties:
      Description: MySQL 8.0 Parameter Group
      Family: !Ref DBFamily
      Parameters:
        max_connections: "100"
        innodb_buffer_pool_size: "3221225472"
        innodb_log_file_size: "536870912"
        innodb_flush_log_at_trx_commit: "2"
        table_open_cache: "512"
        tmp_table_size: "67108864"
        max_allowed_packet: "67108864"
        max_execution_time : "30000"
        net_write_timeout: "120"
        net_read_timeout : "120"
        sort_buffer_size: "3145728"
        join_buffer_size: "3145728"
        innodb_io_capacity: "200"
        innodb_read_io_threads: "4"
        innodb_write_io_threads: "4"
        log_bin_trust_function_creators: "1"
        slow_query_log: "1"
        long_query_time: "2"
        character_set_server : "utf8mb4"
        collation_server : "utf8mb4_0900_ai_ci"
        time_zone : "Asia/Tokyo"


  MyDBOptionGroup:
    Type: AWS::RDS::OptionGroup
    Properties:
      EngineName: mysql
      MajorEngineVersion: "8.0"
      OptionGroupDescription: MySQL 8.0 Option Group
      OptionConfigurations:
        - OptionName: MARIADB_AUDIT_PLUGIN

Outputs:
  ParameterGroupName:
    Description: The name of the created MySQL Parameter Group
    Value: !Ref MyDBParameterGroup

  OptionGroupName:
    Description: The name of the created MySQL Option Group
    Value: !Ref MyDBOptionGroup
```