RDS完全ガイド
RDS (Relational Database Service) 完全ガイド
Section titled “RDS (Relational Database Service) 完全ガイド”RDSは、マネージドリレーショナルデータベースサービスです。実務で使える実装例とベストプラクティスを詳しく解説します。
1. RDSとは
Section titled “1. RDSとは”RDSの役割
Section titled “RDSの役割”RDSは、MySQL、PostgreSQL、Auroraなどのリレーショナルデータベースを管理・運用するマネージドサービスです。
アプリケーション ↓(SQLクエリ)RDSインスタンス ├─ データベースエンジン ├─ 自動バックアップ └─ モニタリングなぜRDSが必要か
Section titled “なぜRDSが必要か”問題のある構成(自己管理データベース):
# 問題: EC2上でデータベースを自己管理# 1. データベースのインストールと設定# 2. バックアップの手動管理# 3. セキュリティパッチの適用# 4. パフォーマンスチューニング# 5. 24時間の監視
# 問題点:# 1. 運用負荷が高い# 2. バックアップの管理が複雑# 3. 可用性の確保が困難# 4. スケーリングが困難解決: RDSによるマネージドデータベース
# 解決: RDSインスタンスの作成Resources: DBInstance: Type: AWS::RDS::DBInstance Properties: Engine: mysql EngineVersion: '8.0' DBInstanceClass: db.t3.medium MultiAZ: true BackupRetentionPeriod: 7 StorageEncrypted: true
# メリット:# 1. 運用負荷が低い(AWSが管理)# 2. 自動バックアップ(設定するだけ)# 3. 高い可用性(マルチAZ)# 4. 簡単なスケーリング(設定変更のみ)2. RDSエンジン
Section titled “2. RDSエンジン”エンジンの種類
Section titled “エンジンの種類”特徴: オープンソース、広く使われている用途: Webアプリケーション、CMSバージョン: 5.7, 8.0PostgreSQL
Section titled “PostgreSQL”特徴: 高度な機能、拡張性が高い用途: 複雑なクエリ、地理空間データバージョン: 13, 14, 15Aurora
Section titled “Aurora”特徴: AWS独自、高性能、高可用性用途: 高負荷アプリケーションバージョン: MySQL互換、PostgreSQL互換MariaDB
Section titled “MariaDB”特徴: MySQL互換、コミュニティ主導用途: MySQLからの移行バージョン: 10.3, 10.4, 10.5エンジンの選択
Section titled “エンジンの選択”# 用途別の選択例用途: Webアプリケーション(シンプル)推奨: MySQL
用途: 複雑なクエリ、拡張機能が必要推奨: PostgreSQL
用途: 高負荷、高可用性が必要推奨: Aurora
用途: MySQL互換が必要推奨: MariaDB3. インスタンスクラス
Section titled “3. インスタンスクラス”インスタンスクラスの種類
Section titled “インスタンスクラスの種類”db.t3.micro: 開発・テスト環境db.t3.small: 小規模アプリケーションdb.t3.medium: 中規模アプリケーションdb.m5.large: 本番環境(汎用)db.r5.large: メモリ最適化(大規模データ)db.x1e.xlarge: メモリ最適化(超大規模)インスタンスクラスの選択
Section titled “インスタンスクラスの選択”# 用途別の選択例開発環境: db.t3.micro, db.t3.small小規模本番: db.t3.medium, db.m5.large中規模本番: db.m5.xlarge, db.r5.large大規模本番: db.r5.xlarge, db.x1e.xlarge4. マルチAZ配置
Section titled “4. マルチAZ配置”マルチAZとは
Section titled “マルチAZとは”マルチAZは、異なるアベイラビリティゾーンにスタンバイレプリカを配置し、高可用性を実現する機能です。
プライマリ(us-east-1a) ↓(同期レプリケーション)スタンバイ(us-east-1b)マルチAZの設定
Section titled “マルチAZの設定”Resources: DBInstance: Type: AWS::RDS::DBInstance Properties: Engine: mysql EngineVersion: '8.0' DBInstanceClass: db.t3.medium MultiAZ: true # マルチAZを有効化 StorageType: gp3 AllocatedStorage: 100 MasterUsername: admin MasterUserPassword: !Ref DBPassword BackupRetentionPeriod: 7 PreferredBackupWindow: '03:00-04:00' PreferredMaintenanceWindow: 'mon:04:00-mon:05:00' StorageEncrypted: true VPCSecurityGroups: - !Ref DBSecurityGroup DBSubnetGroupName: !Ref DBSubnetGroupマルチAZのメリット
Section titled “マルチAZのメリット”1. 高可用性: プライマリが障害発生時に自動フェイルオーバー2. データの耐久性: 同期レプリケーションでデータ損失を防止3. メンテナンス: メンテナンス時に自動フェイルオーバー5. リードレプリカ
Section titled “5. リードレプリカ”リードレプリカとは
Section titled “リードレプリカとは”リードレプリカは、読み取り専用のレプリカです。読み取り負荷を分散し、可用性を向上させます。
プライマリ(書き込み) ├─→ リードレプリカ1(読み取り) ├─→ リードレプリカ2(読み取り) └─→ リードレプリカ3(読み取り)リードレプリカの設定
Section titled “リードレプリカの設定”Resources: DBInstance: Type: AWS::RDS::DBInstance Properties: Engine: mysql EngineVersion: '8.0' DBInstanceClass: db.t3.medium MasterUsername: admin MasterUserPassword: !Ref DBPassword
ReadReplica1: Type: AWS::RDS::DBInstance Properties: SourceDBInstanceIdentifier: !Ref DBInstance DBInstanceClass: db.t3.medium PubliclyAccessible: false AvailabilityZone: us-east-1b
ReadReplica2: Type: AWS::RDS::DBInstance Properties: SourceDBInstanceIdentifier: !Ref DBInstance DBInstanceClass: db.t3.medium PubliclyAccessible: false AvailabilityZone: us-east-1cリードレプリカの活用
Section titled “リードレプリカの活用”// アプリケーションでの読み取り分散const readReplicas = [ 'read-replica-1.region.amazonaws.com', 'read-replica-2.region.amazonaws.com', 'read-replica-3.region.amazonaws.com'];
// 読み取りクエリはリードレプリカにfunction getUsers() { const replica = readReplicas[Math.floor(Math.random() * readReplicas.length)]; return query(replica, 'SELECT * FROM users');}
// 書き込みクエリはプライマリにfunction createUser(user) { return query(primaryDB, 'INSERT INTO users ...');}6. バックアップとリストア
Section titled “6. バックアップとリストア”自動バックアップ
Section titled “自動バックアップ”Resources: DBInstance: Type: AWS::RDS::DBInstance Properties: BackupRetentionPeriod: 7 # 7日間保持 PreferredBackupWindow: '03:00-04:00' # バックアップ時間 CopyTagsToSnapshot: true # スナップショットにタグをコピー手動スナップショット
Section titled “手動スナップショット”# スナップショットの作成aws rds create-db-snapshot \ --db-instance-identifier my-db \ --db-snapshot-identifier my-db-snapshot-20240101
# スナップショットの一覧表示aws rds describe-db-snapshots \ --db-instance-identifier my-db
# スナップショットからリストアaws rds restore-db-instance-from-db-snapshot \ --db-instance-identifier my-db-restored \ --db-snapshot-identifier my-db-snapshot-20240101ポイントインタイムリカバリー(PITR)
Section titled “ポイントインタイムリカバリー(PITR)”Resources: DBInstance: Type: AWS::RDS::DBInstance Properties: BackupRetentionPeriod: 7 # PITRは自動的に有効化される(バックアップ保持期間内)# PITRでのリストアaws rds restore-db-instance-to-point-in-time \ --source-db-instance-identifier my-db \ --target-db-instance-identifier my-db-restored \ --restore-time 2024-01-01T12:00:00Z7. Aurora
Section titled “7. Aurora”Auroraとは
Section titled “Auroraとは”Auroraは、AWS独自の高性能データベースエンジンです。MySQLやPostgreSQLと互換性があります。
Auroraクラスター
Section titled “Auroraクラスター”Resources: AuroraCluster: Type: AWS::RDS::DBCluster Properties: Engine: aurora-mysql EngineVersion: '8.0.mysql_aurora.3.02.0' DatabaseName: mydb MasterUsername: admin MasterUserPassword: !Ref DBPassword BackupRetentionPeriod: 7 PreferredBackupWindow: '03:00-04:00' PreferredMaintenanceWindow: 'mon:04:00-mon:05:00' StorageEncrypted: true DBSubnetGroupName: !Ref DBSubnetGroup VpcSecurityGroupIds: - !Ref DBSecurityGroup
AuroraInstance1: Type: AWS::RDS::DBInstance Properties: Engine: aurora-mysql DBClusterIdentifier: !Ref AuroraCluster DBInstanceClass: db.r6g.large PubliclyAccessible: false AvailabilityZone: us-east-1a
AuroraInstance2: Type: AWS::RDS::DBInstance Properties: Engine: aurora-mysql DBClusterIdentifier: !Ref AuroraCluster DBInstanceClass: db.r6g.large PubliclyAccessible: false AvailabilityZone: us-east-1bAurora Serverless
Section titled “Aurora Serverless”Resources: AuroraServerlessCluster: Type: AWS::RDS::DBCluster Properties: Engine: aurora-mysql EngineMode: serverless DatabaseName: mydb MasterUsername: admin MasterUserPassword: !Ref DBPassword ScalingConfiguration: MinCapacity: 2 # ACU(Aurora Capacity Units) MaxCapacity: 16 AutoPause: true SecondsUntilAutoPause: 300 BackupRetentionPeriod: 7 StorageEncrypted: trueAuroraの特徴
Section titled “Auroraの特徴”1. 高性能: 最大5倍のスループット2. 高可用性: 6つのコピーを3つのAZに分散3. 自動スケーリング: ストレージが自動的に拡張4. 高速フェイルオーバー: 30秒以内8. パフォーマンス最適化
Section titled “8. パフォーマンス最適化”パラメータグループ
Section titled “パラメータグループ”Resources: DBParameterGroup: Type: AWS::RDS::DBParameterGroup Properties: DBParameterGroupName: my-custom-params Family: mysql8.0 Description: Custom parameter group Parameters: max_connections: '500' innodb_buffer_pool_size: '{DBInstanceClassMemory*3/4}' query_cache_size: '67108864'パフォーマンスインサイト
Section titled “パフォーマンスインサイト”# パフォーマンスインサイトの有効化aws rds modify-db-instance \ --db-instance-identifier my-db \ --enable-performance-insights \ --performance-insights-retention-period 7スロークエリログ
Section titled “スロークエリログ”Resources: DBParameterGroup: Type: AWS::RDS::DBParameterGroup Properties: Parameters: slow_query_log: '1' long_query_time: '2' log_queries_not_using_indexes: '1'9. セキュリティ
Section titled “9. セキュリティ”Resources: DBInstance: Type: AWS::RDS::DBInstance Properties: StorageEncrypted: true KmsKeyId: !Ref KMSKey # カスタムKMSキーセキュリティグループ
Section titled “セキュリティグループ”Resources: DBSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Database security group VpcId: !Ref VPC SecurityGroupIngress: - IpProtocol: tcp FromPort: 3306 ToPort: 3306 SourceSecurityGroupId: !Ref AppSecurityGroup Description: MySQL access from application servers10. 実務でのベストプラクティス
Section titled “10. 実務でのベストプラクティス”パターン1: 高可用性構成
Section titled “パターン1: 高可用性構成”# マルチAZ + リードレプリカResources: DBInstance: Properties: MultiAZ: true BackupRetentionPeriod: 7
ReadReplica1: Properties: SourceDBInstanceIdentifier: !Ref DBInstance AvailabilityZone: us-east-1b
ReadReplica2: Properties: SourceDBInstanceIdentifier: !Ref DBInstance AvailabilityZone: us-east-1cパター2: コスト最適化
Section titled “パター2: コスト最適化”# 開発環境: 小さいインスタンス、バックアップ短縮Resources: DevDBInstance: Properties: DBInstanceClass: db.t3.micro BackupRetentionPeriod: 1 MultiAZ: false
# 本番環境: 適切なサイズ、バックアップ長期保持Resources: ProdDBInstance: Properties: DBInstanceClass: db.m5.large BackupRetentionPeriod: 30 MultiAZ: true11. よくある問題と解決策
Section titled “11. よくある問題と解決策”問題1: パフォーマンスが低い
Section titled “問題1: パフォーマンスが低い”原因:
- インスタンスクラスが小さい
- パラメータグループが最適化されていない
- インデックスが不足している
解決策:
# インスタンスクラスの確認aws rds describe-db-instances \ --db-instance-identifier my-db \ --query 'DBInstances[0].DBInstanceClass'
# パラメータグループの確認aws rds describe-db-parameters \ --db-parameter-group-name my-params
# スロークエリログの確認aws rds describe-db-log-files \ --db-instance-identifier my-db問題2: 接続できない
Section titled “問題2: 接続できない”原因:
- セキュリティグループでポートが開いていない
- パブリックアクセスが無効になっている
- サブネットグループが正しく設定されていない
解決策:
# セキュリティグループの確認aws rds describe-db-instances \ --db-instance-identifier my-db \ --query 'DBInstances[0].VpcSecurityGroups'
# パブリックアクセスの確認aws rds describe-db-instances \ --db-instance-identifier my-db \ --query 'DBInstances[0].PubliclyAccessible'
# サブネットグループの確認aws rds describe-db-subnet-groups \ --db-subnet-group-name my-subnet-groupこれで、RDSの基礎知識と実務での使い方を理解できるようになりました。