実践!AWS CDK #20 RDS サブネットグループ
はじめに
今回は RDS の DB サブネットグループを作成します。
これは DB インスタンスの作成に必要なものとなります。
小粒なリソースですが RDS 関連を一気に作ると量が多いため、複数回に分けることにしました。
前回の記事はこちら。
AWS 構成図
いよいよ最後のリソース RDS の作成に着手します。
設計
プロパティは以下の通り。
リソース名 | サブネット |
---|---|
devio-stg-sng-rds | devio-stg-subnet-db-1a devio-stg-subnet-db-1c |
実装
RDS に関する処理を行うクラスはこちら。
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 インスタンスを作成するまでこのクラスにコードを追加していく形になります。
メインのプログラムはこちら。
ハイライト部分を追記しました。
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); } }
テスト
テストコードはこちら。
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 つあること
- リソースのプロパティが正しいこと
確認
マネジメントコンソール上でリソースを確認してみましょう。
サブネットグループが指定した 名前
、説明
で作成されています。
適切なサブネットも割り当てられていました。
この画面ではサブネット名が確認できませんが、正しいサブネットが設定されています。(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 の構築に必要なリソースをサクッと作りました。次回も引き続き パラメータグループ
を作成していきます。