AWS RDS

データベースAWSMySQLPostgreSQLOracleSQL Serverマネージドサービス高可用性

データベースプラットフォーム

AWS RDS

概要

AWS RDS(Amazon Relational Database Service)は、クラウド環境でリレーショナルデータベースを簡単にセットアップ、運用、スケーリングできる完全マネージド型サービスです。MySQL、PostgreSQL、MariaDB、Oracle、SQL Server、Db2など、主要なデータベースエンジンをサポートし、ハードウェアプロビジョニング、データベースセットアップ、パッチ適用、バックアップなどの時間のかかる管理タスクを自動化します。

詳細

マルチデータベースエンジン対応

AWS RDSは6つの主要なデータベースエンジンをサポートし、既存のアプリケーションとの互換性を維持しながらクラウド移行を実現します。PostgreSQL 11-17、MySQL 5.7-8.0など、各エンジンの複数バージョンに対応し、アプリケーションの要件に応じた選択が可能です。

高可用性アーキテクチャ

Multi-AZ(マルチアベイラビリティゾーン)配置により、プライマリデータベースインスタンスと同期レプリケーションされたスタンバイインスタンスを異なるアベイラビリティゾーンに配置します。自動フェイルオーバー機能により、計画外のダウンタイムを最小化し、99.95%の可用性SLAを提供します。

自動化された運用管理

定期的なバックアップ、ソフトウェアパッチ適用、監視、メトリクス収集を自動化し、運用負荷を大幅に削減します。バックアップは最大35日間保持可能で、任意の時点へのリストアが可能なポイントインタイムリカバリ機能を提供します。

パフォーマンスとスケーラビリティ

リードレプリカにより読み取りトラフィックを分散し、最大15個のリードレプリカを作成可能です。ストレージは最大64TBまで自動拡張し、Provisioned IOPSにより最大40,000 IOPSの高性能を実現します。

メリット・デメリット

メリット

  • 完全マネージド: インフラ管理、パッチ適用、バックアップが自動化
  • 高可用性: Multi-AZ配置による自動フェイルオーバーと99.95% SLA
  • スケーラビリティ: CPUとメモリの垂直スケーリング、リードレプリカによる水平スケーリング
  • セキュリティ: VPC分離、保存時・転送時暗号化、IAM統合
  • 互換性: 主要なデータベースエンジンとの完全互換性
  • 統合: AWSエコシステムとのシームレスな統合
  • コスト効率: リザーブドインスタンスによる最大66%のコスト削減

デメリット

  • ベンダーロックイン: AWS環境への依存度が高い
  • カスタマイズ制限: OSレベルやデータベースの一部設定へのアクセス制限
  • レイテンシ: オンプレミスと比較して若干のレイテンシ増加の可能性
  • データ転送コスト: リージョン間やインターネット経由のデータ転送に追加コスト
  • 複雑な料金体系: インスタンス、ストレージ、I/O、データ転送の組み合わせ

参考ページ

実装の例

RDSインスタンスの作成(AWS CLI)

# PostgreSQLインスタンスの作成
aws rds create-db-instance \
  --db-instance-identifier myapp-db \
  --db-instance-class db.t3.micro \
  --engine postgres \
  --engine-version 15.4 \
  --allocated-storage 20 \
  --storage-type gp2 \
  --master-username postgres \
  --master-user-password mySecretPassword123! \
  --vpc-security-group-ids sg-xxxxxxxxx \
  --db-subnet-group-name my-subnet-group \
  --backup-retention-period 7 \
  --multi-az \
  --no-publicly-accessible

# インスタンスの状態確認
aws rds describe-db-instances \
  --db-instance-identifier myapp-db \
  --query 'DBInstances[0].DBInstanceStatus'

アプリケーションからの接続(Node.js)

// PostgreSQL接続の例
const { Client } = require('pg');

const client = new Client({
  host: 'myapp-db.xxxxxxxxx.us-east-1.rds.amazonaws.com',
  port: 5432,
  database: 'myapp',
  user: 'postgres',
  password: process.env.DB_PASSWORD,
  ssl: {
    rejectUnauthorized: false
  }
});

async function connectDB() {
  try {
    await client.connect();
    console.log('Connected to RDS PostgreSQL');
    
    // テーブル作成
    await client.query(`
      CREATE TABLE IF NOT EXISTS users (
        id SERIAL PRIMARY KEY,
        email VARCHAR(255) UNIQUE NOT NULL,
        name VARCHAR(255),
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
      )
    `);
    
    // データ挿入
    const result = await client.query(
      'INSERT INTO users (email, name) VALUES ($1, $2) RETURNING *',
      ['[email protected]', 'Test User']
    );
    console.log('Inserted user:', result.rows[0]);
    
  } catch (err) {
    console.error('Database connection error:', err);
  } finally {
    await client.end();
  }
}

connectDB();

自動バックアップとリストア

# 手動スナップショットの作成
aws rds create-db-snapshot \
  --db-instance-identifier myapp-db \
  --db-snapshot-identifier myapp-snapshot-$(date +%Y%m%d)

# スナップショットからのリストア
aws rds restore-db-instance-from-db-snapshot \
  --db-instance-identifier myapp-db-restored \
  --db-snapshot-identifier myapp-snapshot-20240115

# ポイントインタイムリストア
aws rds restore-db-instance-to-point-in-time \
  --source-db-instance-identifier myapp-db \
  --target-db-instance-identifier myapp-db-pitr \
  --restore-time 2024-01-15T10:00:00.000Z

リードレプリカの作成と利用

# リードレプリカの作成
aws rds create-db-instance-read-replica \
  --db-instance-identifier myapp-db-read \
  --source-db-instance-identifier myapp-db \
  --db-instance-class db.t3.micro

# アプリケーションでの読み書き分離
const writeClient = new Client({
  host: 'myapp-db.xxx.rds.amazonaws.com',
  // ... 書き込み用設定
});

const readClient = new Client({
  host: 'myapp-db-read.xxx.rds.amazonaws.com',
  // ... 読み取り用設定
});

モニタリングとメトリクス

import boto3
from datetime import datetime, timedelta

cloudwatch = boto3.client('cloudwatch')

# CPU使用率の取得
response = cloudwatch.get_metric_statistics(
    Namespace='AWS/RDS',
    MetricName='CPUUtilization',
    Dimensions=[
        {
            'Name': 'DBInstanceIdentifier',
            'Value': 'myapp-db'
        }
    ],
    StartTime=datetime.utcnow() - timedelta(hours=1),
    EndTime=datetime.utcnow(),
    Period=300,
    Statistics=['Average']
)

for datapoint in response['Datapoints']:
    print(f"Time: {datapoint['Timestamp']}, CPU: {datapoint['Average']}%")