この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
今回は RDS の DB サブネットグループを作成します。
これは DB インスタンスの作成に必要なものとなります。
小粒なリソースですが RDS 関連を一気に作ると量が多いため、複数回に分けることにしました。
前回の記事はこちら。
AWS 構成図
いよいよ最後のリソース RDS の作成に着手します。
設計
プロパティは以下の通り。
リソース名 | サブネット |
---|---|
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 つあること
- リソースのプロパティが正しいこと
確認
マネジメントコンソール上でリソースを確認してみましょう。
サブネットグループが指定した 名前
、説明
で作成されています。
適切なサブネットも割り当てられていました。
この画面ではサブネット名が確認できませんが、正しいサブネットが設定されています。(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 の構築に必要なリソースをサクッと作りました。次回も引き続き パラメータグループ
を作成していきます。