実践!AWS CDK #20 RDS サブネットグループ

題字・息子たち
2021.07.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

今回は RDS の DB サブネットグループを作成します。
これは DB インスタンスの作成に必要なものとなります。

小粒なリソースですが RDS 関連を一気に作ると量が多いため、複数回に分けることにしました。

前回の記事はこちら。

AWS 構成図

いよいよ最後のリソース RDS の作成に着手します。

1

設計

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

リソース名 サブネット
devio-stg-sng-rds devio-stg-subnet-db-1a
devio-stg-subnet-db-1c

実装

RDS に関する処理を行うクラスはこちら。

lib/resource/rds.ts

import * as cdk from '@aws-cdk/core';
import { CfnDBSubnetGroup } 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);
    }

    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;
    }
}

前回同様、まずは RDS に関する Construct を利用するために @aws-cdk/aws-rds をインストールします。

$ npm install @aws-cdk/aws-rds

今回作成するのは DB サブネットグループのみなので、ソースコードはシンプルになっています。
今後、DB インスタンスを作成するまでこのクラスにコードを追加していく形になります。

メインのプログラムはこちら。
ハイライト部分を追記しました。

lib/devio-stack.ts

import * as cdk from '@aws-cdk/core';
import { Vpc } from './resource/vpc';
import { Subnet } from './resource/subnet';
import { InternetGateway } from './resource/internetGateway';
import { ElasticIp } from './resource/elasticIp';
import { NatGateway } from './resource/natGateway';
import { RouteTable } from './resource/routeTable';
import { NetworkAcl } from './resource/networkAcl';
import { IamRole } from './resource/iamRole';
import { SecurityGroup } from './resource/securityGroup';
import { Ec2 } from './resource/ec2';
import { Alb } from './resource/alb';
import { SecretsManager } from './resource/secretsManager';
import { Rds } from './resource/rds';

export class DevioStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // VPC
    const vpc = new Vpc();
    vpc.createResources(this);

    ~ 省略 ~

    // RDS
    const rds = new Rds(
      subnet.db1a,
      subnet.db1c
    );
    rds.createResources(this);
  }
}

テスト

テストコードはこちら。

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'
    }));
});

以下を確認しています。

  • DB サブネットグループのリソースが 1 つあること
  • リソースのプロパティが正しいこと

確認

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

2

サブネットグループが指定した 名前説明 で作成されています。

適切なサブネットも割り当てられていました。

3

この画面ではサブネット名が確認できませんが、正しいサブネットが設定されています。(CIDR ブロックからも確認可)

CloudFormation 版

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

SubnetGroupRds:
  Type: AWS::RDS::DBSubnetGroup
  Properties:
    DBSubnetGroupDescription: Subnet Group for RDS
    SubnetIds:
      - Ref: SubnetDb1a
      - Ref: SubnetDb1c
    DBSubnetGroupName: devio-stg-sng-rds

GitHub

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

おわりに

RDS の構築に必要なリソースをサクッと作りました。次回も引き続き パラメータグループ を作成していきます。

リンク