実践!AWS CDK #21 RDS パラメータグループ

題字・息子たち
2021.07.22

はじめに

今回は RDS の DB クラスターパラメータグループと DB パラメータグループ を作成します。
DB クラスターパラメータグループ が DB クラスターに、DB パラメータグループ が DB インスタンスに適用されるものとなります。

前回の記事はこちら。

AWS 構成図

1

設計

プロパティは以下の通り。

クラスターパラメータグループ

項目
ファミリー aurora-mysql5.7
パラメータ time_zone: UTC

クラスターパラメータグループはパラメータの指定が必須となっています。よってここでは time_zone の値をデフォルト値 UTC に設定しておきます。

パラメータグループ

項目
ファミリー aurora-mysql5.7
パラメータ なし

こちらはパラメータの値は必須ではないため、特に指定はしません。

残念ながら、どちらも CDK や CFn で作成する場合はリソース名が設定できません。一定のルールに従って自動で決まります。

実装

RDS に関する処理を行うクラスに、ハイライト部分を追記しました。

lib/resource/rds.ts

import * as cdk from '@aws-cdk/core';
import { CfnDBSubnetGroup, CfnDBClusterParameterGroup, CfnDBParameterGroup } from '@aws-cdk/aws-rds';
import { CfnSubnet } from '@aws-cdk/aws-ec2';
import { Resource } from './abstract/resource';

export class Rds extends Resource {
    private readonly subnetDb1a: CfnSubnet;
    private readonly subnetDb1c: CfnSubnet;

    constructor(
        subnetDb1a: CfnSubnet,
        subnetDb1c: CfnSubnet,
    ) {
        super();
        this.subnetDb1a = subnetDb1a;
        this.subnetDb1c = subnetDb1c;
    };

    createResources(scope: cdk.Construct) {
        this.createSubnetGroup(scope);
        this.createClusterParameterGroup(scope);
        this.createParameterGroup(scope);
    }

    private createSubnetGroup(scope: cdk.Construct): CfnDBSubnetGroup {
        const subnetGroup = new CfnDBSubnetGroup(scope, 'SubnetGroupRds', {
            dbSubnetGroupDescription: 'Subnet Group for RDS',
            subnetIds: [this.subnetDb1a.ref, this.subnetDb1c.ref],
            dbSubnetGroupName: this.createResourceName(scope, 'sng-rds')
        });

        return subnetGroup;
    }

    private createClusterParameterGroup(scope: cdk.Construct): CfnDBClusterParameterGroup {
        const clusterParameterGroup = new CfnDBClusterParameterGroup(scope, 'ClusterParameterGroupRds', {
            description: 'Cluster Parameter Group for RDS',
            family: 'aurora-mysql5.7',
            parameters: { time_zone: 'UTC' }
        });

        return clusterParameterGroup;
    }

    private createParameterGroup(scope: cdk.Construct): CfnDBParameterGroup {
        const parameterGroup = new CfnDBParameterGroup(scope, 'ParameterGroupRds', {
            description: 'Parameter Group for RDS',
            family: 'aurora-mysql5.7'
        });

        return parameterGroup;
    }
}

いつものパターンなので特にコメントは無し。

メインのプログラムも変更なしです。

テスト

テストコードはこちら。
ハイライト部分を追記しました。

test/resource/rds.test.ts

import { expect, countResources, haveResource, anything } from '@aws-cdk/assert';
import * as cdk from '@aws-cdk/core';
import * as Devio from '../../lib/devio-stack';

test('Rds', () => {
    const app = new cdk.App();
    const stack = new Devio.DevioStack(app, 'DevioStack');

    expect(stack).to(countResources('AWS::RDS::DBSubnetGroup', 1));
    expect(stack).to(haveResource('AWS::RDS::DBSubnetGroup', {
        DBSubnetGroupDescription: 'Subnet Group for RDS',
        SubnetIds: anything(),
        DBSubnetGroupName: 'undefined-undefined-sng-rds'
    }));

    expect(stack).to(countResources('AWS::RDS::DBClusterParameterGroup', 1));
    expect(stack).to(haveResource('AWS::RDS::DBClusterParameterGroup', {
        Description: 'Cluster Parameter Group for RDS',
        Family: 'aurora-mysql5.7',
        Parameters: { time_zone: 'UTC' }
    }));

    expect(stack).to(countResources('AWS::RDS::DBParameterGroup', 1));
    expect(stack).to(haveResource('AWS::RDS::DBParameterGroup', {
        Description: 'Parameter Group for RDS',
        Family: 'aurora-mysql5.7'
    }));
});

以下を確認しています。

  • DB クラスターパラメータグループのリソースが 1 つあること
  • DB パラメータグループのリソースが 1 つあること
  • 各リソースのプロパティが正しいこと

確認

マネジメントコンソール上でリソースを確認してみましょう。

2

それぞれのパラメータグループが作成されています。

クラスターパラメータグループの time_zone 設定も OK。
このグループには 390 のパラメータが存在するようです。

3

パラメータグループもヨシ。
こちらのパラメータ数は 293。どっちも多すぎ!

4

CloudFormation 版

今回のコードを CFn で書くと以下のようになります。

ClusterParameterGroupRds:
  Type: AWS::RDS::DBClusterParameterGroup
  Properties:
    Description: Cluster Parameter Group for RDS
    Family: aurora-mysql5.7
    Parameters:
      time_zone: UTC
ParameterGroupRds:
  Type: AWS::RDS::DBParameterGroup
  Properties:
    Description: Parameter Group for RDS
    Family: aurora-mysql5.7

GitHub

今回のソースコードは コチラ です。

おわりに

これで RDS 構築の下準備は完了。

次回は クラスター を作成します。

リンク