AWS CDKによる【RDS】の構築

皆様こんにちは。
AWS CDKを利用してマルチAZ3層アーキテクチャ構築をしていきます。
この記事ではRDSの作成を行います。

目次はこちら

1.RDSとは

Amazon RDS(Relational Database Service)は、AWS が提供するフルマネージドのリレーショナルデータベースサービスです。簡単に説明すると、RDS は以下のような機能を提供します。

機能

  • リレーショナルデータベース管理: SQL ベースのデータベース(MySQL、PostgreSQL、MariaDB、Oracle、SQL Serverなど)を簡単にセットアップし、管理できます。
  • フルマネージド: バックアップ、パッチ適用、スケーリング、障害復旧などの管理作業が自動で行われるため、運用負荷が軽減されます。
  • スケーラブル: データベースの性能を必要に応じて調整できるため、トラフィックの増加にも対応可能です。
  • 高可用性: 複数のアベイラビリティゾーン(AZ)にデータベースを配置することで、耐障害性と高可用性を提供します。

RDS を使用することで、データベースの管理が簡単になり、インフラの運用にかかる手間を大幅に削減できます。
詳細は公式ドキュメントを参照ください。

2.目的

下記条件のRDSを構築する。

  • RDSサブネットグループを作成し、指定したAZでマルチAZ構成にする
  • Secrets Managerでパスワードを管理する
  • EC2とは別のサブネットに配置し、EC2のみと通信を行う。

3.構成図

4.全体構築ソースコード

        # RDSサブネットグループの作成
        self.subnet_group = rds.CfnDBSubnetGroup(self, "kitaya-db-subg",
            db_subnet_group_description="DB Subnet Group",
            subnet_ids=[
                self.protect_subnet_az1.ref,
                self.protect_subnet_az2.ref
            ]
        )
        Tags.of(self.subnet_group).add("Name", "kitaya-db-subg")

        # データベースの認証情報をSecrets Managerで作成
        self.db_secret = secretsmanager.Secret(self, "kitaya-db-Secret",
            secret_name="kitaya-db-Secret",
            generate_secret_string=secretsmanager.SecretStringGenerator(
                exclude_punctuation=True,
                include_space=False,
                password_length=16,
                generate_string_key="password",
                secret_string_template='{"username": "admin"}'
            )
        )
        Tags.of(self.db_secret).add("Name", "kitaya-db-Secret")

        # RDSインスタンスの作成
        self.rds_instance = rds.CfnDBInstance(self, "kitaya-rds-db",
            db_instance_identifier="kitaya-rds-db",
            db_instance_class="db.t3.micro",
            engine="mysql",
            engine_version="8.0.35",
            allocated_storage="20",
            storage_type="gp3",
            multi_az=True,
            master_username="admin",
            master_user_password=self.db_secret.secret_value_from_json("password").unsafe_unwrap(),
            db_subnet_group_name=self.subnet_group.ref,
            vpc_security_groups=[self.rds_sg.security_group_id],
            publicly_accessible=False,
            backup_retention_period=7,
            preferred_backup_window="20:00-21:00",
            port="3306",
            db_name="kitaya_rds",
            deletion_protection=False,
            copy_tags_to_snapshot=False
        )        
        Tags.of(self.rds_instance).add("Name", "kitaya-rds-db")

5.ソースコード詳細

5-1.RDSサブネットグループの作成

指定したAZへの配置にするためにサブネットグループを作成します。

  • "rds.CfnDBSubnetGroup"を使用
    論理ID(テンプレート内で一意)の指定をしたのち、詳細のプロパティを指定しています。

プロパティは下記

使用するプロパティ 設定値 説明
db_subnet_group_description "DB Subnet Group" サブネットグループの説明
subnet_ids ソースコード参照 RDS インスタンスが配置されるサブネットの ID を指定
  • "Tags.of()"メソッドを使用してNameタグをつけます(書式は下記)
    Tags.of("リソース名").add("キー", "値")

  • ソースコード

        # RDSサブネットグループの作成
        self.subnet_group = rds.CfnDBSubnetGroup(self, "kitaya-db-subg",
            db_subnet_group_description="DB Subnet Group",
            subnet_ids=[
                self.protect_subnet_az1.ref,
                self.protect_subnet_az2.ref
            ]
        )
        Tags.of(self.subnet_group).add("Name", "kitaya-db-subg")

5-2.データベースの認証情報をSecrets Managerで作成

パスワード管理のためにデータベースの認証情報をSecrets Managerで作成します。

  • "secretsmanager.Secret"を使用
    論理ID(テンプレート内で一意)の指定をしたのち、詳細のプロパティを指定しています。

プロパティは下記

使用するプロパティ 設定値 説明
secret_name "kitaya-db-Secret" Secrets Manager 内でこのシークレットを識別するための名前
  • generate_secret_stringはシークレットを自動生成するための設定です。
    secretsmanager.SecretStringGenerator を使って、ランダムな文字列を生成します。

プロパティは下記

使用するプロパティ 設定値 説明
exclude_punctuation True パスワードに句読点(!, @, # など)を含めないように指定
include_space False パスワードに空白を含めないように指定
password_length 16 生成されるパスワードの長さを指定
generate_string_key="password "password" 生成されたパスワードをシークレットのキーを指定
secret_string_template ‘{"username": "admin"}’ シークレットのテンプレートとして使用する JSON 文字列です。ここでは、username フィールドが "admin" であることが指定されています。
  • "Tags.of()"メソッドを使用してNameタグをつけます(書式は下記)
    Tags.of("リソース名").add("キー", "値")

  • ソースコード

        # データベースの認証情報をSecrets Managerで作成
        self.db_secret = secretsmanager.Secret(self, "kitaya-db-Secret",
            secret_name="kitaya-db-Secret",
            generate_secret_string=secretsmanager.SecretStringGenerator(
                exclude_punctuation=True,
                include_space=False,
                password_length=16,
                generate_string_key="password",
                secret_string_template='{"username": "admin"}'
            )
        )
        Tags.of(self.db_secret).add("Name", "kitaya-db-Secret")

5-3.RDSインスタンスの作成

  • "rds.CfnDBInstance"を使用
    論理ID(テンプレート内で一意)の指定をしたのち、詳細のプロパティを指定しています。

プロパティは下記

使用するプロパティ 設定値 説明
db_instance_identifier kitaya-rds-db データベースインスタンスの識別子。AWS内でこのインスタンスを一意に識別します。
db_instance_class db.t3.micro インスタンスのクラス。リソースのサイズと性能を指定します。db.t3.microは小規模なインスタンスです。
engine mysql データベースエンジンの種類。ここではMySQLが指定されています。
engine_version 8.0.35 MySQLのバージョン。ここではMySQL8.0.35が指定されています。
allocated_storage 20 データベースに割り当てるストレージのサイズ(GB)。ここでは20GBが指定されています。
storage_type gp3 ストレージタイプ。gp3は汎用SSDストレージの最新バージョンです。
multi_az True 高可用性を確保するために、複数のアベイラビリティゾーンにレプリカを配置します。
master_username admin データベースのマスター(管理者)ユーザー名です。
master_user_password self.db_secret.secret_value_from_json("password").unsafe_unwrap() データベースのマスターユーザーのパスワード。SecretsManagerから取得したパスワードを使用します。
db_subnet_group_name self.subnet_group.ref データベースが配置されるサブネットグループの名前です。
vpc_security_groups [self.rds_sg.security_group_id] データベースに関連付けるセキュリティグループのIDのリストです。
publicly_accessible False データベースをインターネットからアクセス可能にするかどうかを指定します。ここではFalseです。
backup_retention_period 7 バックアップの保持期間(日数)。ここでは7日間のバックアップが保持されます。
preferred_backup_window 20:00-21:00 バックアップが実行される時間のウィンドウです。ここでは毎日20:00から21:00の間です。
port 3306 データベースがリッスンするポート番号です。MySQLのデフォルトポートは3306です。
db_name kitaya_rds データベースインスタンス内で作成されるデフォルトのデータベース名です。
deletion_protection False インスタンスの削除保護の設定です。無効の設定です。
※本来であれば有効推奨ですがデバッグのため
copy_tags_to_snapshot False スナップショットにタグをコピーするかどうかの設定です。ここではFalseです。
  • ソースコード
        # RDSインスタンスの作成
        self.rds_instance = rds.CfnDBInstance(self, "kitaya-rds-db",
            db_instance_identifier="kitaya-rds-db",
            db_instance_class="db.t3.micro",
            engine="mysql",
            engine_version="8.0.35",
            allocated_storage="20",
            storage_type="gp3",
            multi_az=True,
            master_username="admin",
            master_user_password=self.db_secret.secret_value_from_json("password").unsafe_unwrap(),
            db_subnet_group_name=self.subnet_group.ref,
            vpc_security_groups=[self.rds_sg.security_group_id],
            publicly_accessible=False,
            backup_retention_period=7,
            preferred_backup_window="20:00-21:00",
            port="3306",
            db_name="kitaya_rds",
            deletion_protection=False,
            copy_tags_to_snapshot=False
        )        
        Tags.of(self.rds_instance).add("Name", "kitaya-rds-db")

6.検証

それぞれマネジメントコンソールで確認していきます。

5-1.Secrets Manager

以下の表示で確認できました。
"シークレットの値を取得する"から情報を取得可能です。

5-2.RDSサブネットグループ

以下表示で確認できました。
サブネットも正しく指定できています。

5-3.RDSインスタンス

以下表示で確認できました。
マルチAZの設定になっています。

以下コマンド入力後、パスワードを入力しEC2からも接続を確認できました。
※EC2構築後に確認

mysql -h エンドポイント -P 3306 -u ユーザー名 -p

6.感想

今回はあまりエラーを出すことなくスムーズに作成できた。
今後の構築でも活かしていきたい。

Last modified: 2024-08-14

Author