皆様こんにちは。
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.感想
今回はあまりエラーを出すことなくスムーズに作成できた。
今後の構築でも活かしていきたい。