AWS CloudFormationを使った実務で使えるRDSパラメータグループとオプショングループの作成

## はじめに
実務でRDSのパラメータグループとオプショングループを設定する際、大量のパラメータ値を効率的に管理する必要がありました。

手動での設定は手間がかかるため、CloudFormationを活用して自動化することになりました。

しかし、初めて取り組んだ際に苦戦した経験があり、このブログではその時の知見を基に、CloudFormationでRDSのパラメータグループやオプショングループを作成する方法を備忘録としてまとめています。

## 知識整理
今回、必要な知識を簡単に整理していきます。

### CloudFormationとは
AWS CloudFormationは、インフラストラクチャをコード（Infrastructure as Code、IaC）として扱い、自動的にAWSリソースを管理・構築するためのツールです。

![スクリーンショット 2024-09-28 6.46.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/4c6f9825-7f68-f117-aab6-d9f22129e358.png)
引用画像：https://zenn.dev/hi_ka_ru/articles/72af4e42ab3c98

テンプレートを作成することで、サーバーやネットワーク、データベースなどのリソースを一括で作成し、環境を標準化・自動化できます。

https://aws.amazon.com/jp/cloudformation/

### パラメータグループとは
Amazon RDSのパラメータグループは、RDSデータベースのパフォーマンスや動作を制御するための設定を集めたものです。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/parameter-groups-overview.html

各RDSエンジンには、デフォルトのパラメータグループが存在しますが、必要に応じてカスタムパラメータグループを作成して、特定のデータベース要件に合わせた設定を適用することが可能です。

### オプショングループとは
オプショングループは、RDSインスタンスに追加機能を提供するために使用されます。例えば、監視やバックアップ、暗号化など、デフォルトでは含まれていない機能を追加するために使用されます。

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

特にAurora MySQLでは、オプショングループを活用することで、データベースの拡張機能を柔軟に設定できます。

:::note alert
**補足事項**
**PostgreSQLでは、オプショングループ（Option Group）を作成することはできません。** 

Amazon RDSでは、オプショングループは主にMySQL、Oracle、Microsoft SQL Serverなどのデータベースエンジンに対して提供される機能となります。一方、PostgreSQLやAurora PostgreSQLはオプショングループをサポートしておらず、代わりにパラメータグループを使用します。
:::


## 実務で使えるCloudFormationテンプレート
ここでは、実務で使用可能な4つのCloudFormationテンプレートを紹介します。

MySQLとPostgreSQL、そしてAuroraクラスター構成におけるパラメータグループとオプショングループの作成を自動化するためのテンプレートです。

### 1. RDS MySQL 8.0 パラメータグループとオプショングループ

MySQL 8.0を使ったRDSインスタンスで、パラメータグループとオプショングループを設定するテンプレートです。パフォーマンス向上のために、各種設定をカスタマイズすることができます。

```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: "500"
        innodb_flush_log_at_trx_commit: "2"

  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
```


### 2. RDS PostgreSQL 13 パラメータグループ

PostgreSQL 13用のRDSインスタンスでは、オプショングループをサポートしていませんが、パラメータグループを設定することで、データベースのパフォーマンスや挙動を調整可能です。

```yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: CloudFormation template to create RDS PostgreSQL 13 Parameter Group

Parameters:
  DBFamily:
    Description: PostgreSQL DB Parameter Group Family
    Type: String
    Default: postgres13

Resources:
  MyDBParameterGroup:
    Type: AWS::RDS::DBParameterGroup
    Properties:
      Description: PostgreSQL 13 Parameter Group
      Family: !Ref DBFamily
      Parameters:
        max_connections: "200"
        log_statement: "all"
        max_worker_processes: "8"

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

### 3. Aurora MySQL 8.0 クラスターおよびインスタンス用 パラメータグループとオプショングループ

Aurora MySQL 8.0クラスターを使う場合、クラスター全体に適用されるパラメータグループと、個々のインスタンスに適用されるパラメータグループを別々に設定できます。

さらに、オプショングループを使用して、追加機能を実装することも可能です。

```yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: CloudFormation template to create Aurora MySQL 8.0 Cluster and Instance Parameter Group

Parameters:
  DBClusterFamily:
    Description: Aurora MySQL DB Cluster Parameter Group Family
    Type: String
    Default: aurora-mysql8.0

  DBInstanceFamily:
    Description: Aurora MySQL DB Instance Parameter Group Family
    Type: String
    Default: aurora-mysql8.0

Resources:
  MyDBClusterParameterGroup:
    Type: AWS::RDS::DBClusterParameterGroup
    Properties:
      Description: Aurora MySQL 8.0 Cluster Parameter Group
      Family: !Ref DBClusterFamily
      Parameters:
        character_set_server: utf8mb4
        slow_query_log: "1"

  MyDBInstanceParameterGroup:
    Type: AWS::RDS::DBParameterGroup
    Properties:
      Description: Aurora MySQL 8.0 Instance Parameter Group
      Family: !Ref DBInstanceFamily
      Parameters:
        max_connections: "500"

  MyDBOptionGroup:
    Type: AWS::RDS::OptionGroup
    Properties:
      EngineName: aurora-mysql
      MajorEngineVersion: "8.0"
      OptionGroupDescription: Aurora MySQL 8.0 Option Group
      OptionConfigurations: []

Outputs:
  ClusterParameterGroupName:
    Description: The name of the created Aurora MySQL Cluster Parameter Group
    Value: !Ref MyDBClusterParameterGroup

  InstanceParameterGroupName:
    Description: The name of the created Aurora MySQL Instance Parameter Group
    Value: !Ref MyDBInstanceParameterGroup

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

### 4. Aurora PostgreSQL 13 クラスターおよびインスタンス用 パラメータグループ

Aurora PostgreSQL 13の場合も、クラスターとインスタンスそれぞれに適用するパラメータグループを作成し、データベースの挙動をカスタマイズすることができます。

```yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: CloudFormation template to create Aurora PostgreSQL 13 Cluster and Instance Parameter Group

Parameters:
  DBClusterFamily:
    Description: Aurora PostgreSQL DB Cluster Parameter Group Family
    Type: String
    Default: aurora-postgresql13

  DBInstanceFamily:
    Description: Aurora PostgreSQL DB Instance Parameter Group Family
    Type: String
    Default: aurora-postgresql13

Resources:
  MyDBClusterParameterGroup:
    Type: AWS::RDS::DBClusterParameterGroup
    Properties:
      Description: Aurora PostgreSQL 13 Cluster Parameter Group
      Family: !Ref DBClusterFamily
      Parameters:
        max_connections: "300"
        log_statement: "ddl"

  MyDBInstanceParameterGroup:
    Type: AWS::RDS::DBParameterGroup
    Properties:
      Description: Aurora PostgreSQL 13 Instance Parameter Group
      Family: !Ref DBInstanceFamily
      Parameters:
        max_connections: "200"

Outputs:
  ClusterParameterGroupName:
    Description: The name of the created Aurora PostgreSQL Cluster Parameter Group
    Value: !Ref MyDBClusterParameterGroup

  InstanceParameterGroupName:
    Description: The name of the created Aurora PostgreSQL Instance Parameter Group
    Value: !Ref MyDBInstanceParameterGroup
```

## CloudFormationでの実行手順と作成
Amazon RDSのパラメータグループとオプショングループを作成するには、AWS CloudFormationを使用して以下の手順に従って設定します。

:::note 
**手順**
**AWS Management Console にログイン**
AWSアカウントにログインし、CloudFormationコンソールにアクセスします。

**CloudFormationスタックの作成**
「Create stack（スタックの作成）」を選択し、テンプレートをアップロードするか、テンプレートファイルのS3 URLを入力します。

**テンプレート記述**
CloudFormationテンプレートをYAMLまたはJSON形式で記述し、作成したパラメータグループやオプショングループを定義します。
:::

**CloudFormationの作成画面**

![スクリーンショット 2024-09-28 7.19.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/e61afea7-6ac1-0626-2b23-41e173da727a.png)

**パラメータグループ**

![スクリーンショット 2024-09-28 7.58.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/4bd154bd-1e4d-8ad4-2247-f30a0a3f6b3a.png)


**オプショングループ**

![スクリーンショット 2024-09-28 7.59.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/93329200-f031-cc59-862d-efc74852329c.png)

正常にカスタムのパラメータグループとオプショングループが作成できていることが確認できました！


## まとめ
今回のブログでは、AWS CloudFormationを使って、RDSやAuroraのパラメータグループとオプショングループを自動的に作成するテンプレートの例を紹介しました。

**パラメータ設定は、データベースの性能に大きく影響するため、要件に合わせた適切な設定が必要です。**

CloudFormationを活用することで、手間のかかる設定作業を効率化し、セキュリティとパフォーマンスを維持しながらAWSリソースを運用できるようになります。

## おまけ
ここでは、AWS CloudShellを使用して、カスタムのRDSパラメータグループとオプショングループをCSV形式で取得するためのコマンドをご紹介します。

**RDSパラメータグループの取得**
まず、カスタムのRDSパラメータグループを取得し、CSV形式に変換します。

```
aws rds describe-db-parameter-groups --query 'DBParameterGroups[?DBParameterGroupFamily==`mysql8.0`].{DBParameterGroupName:DBParameterGroupName,Description:Description}' --output text | sed 's/\t/,/g' > parameter_groups.csv
```

**RDSオプショングループの取得**
次に、カスタムのオプショングループを取得するコマンドです。

```
aws rds describe-option-groups --query 'OptionGroupsList[?EngineName==`mysql`].{OptionGroupName:OptionGroupName,Description:OptionGroupDescription}' --output text | sed 's/\t/,/g' > option_groups.csv
```

上記のコマンドはMySQLバージョン8.0のパラメータグループとオプショングループに特化しています。

:::note
他のエンジンやバージョンを取得したい場合は、mysql8.0やmysqlの部分を適宜変更してください。
:::

## 参考記事

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/creating-resources-with-cloudformation.html

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-interface-parametergroup.html