Day6: リレーショナルデータベース:AWS RDS vs Azure Database Services
皆さん、こんにちは。エンジニアのAkrです。
「徹底比較! AWS vs Azure」シリーズ、Day6へようこそ。
今回は、アプリケーションの根幹を支えるリレーショナルデータベースについて比較します。AWSのAmazon RDS(Relational Database Service)と、AzureのAzure Database Servicesです。
マネージドデータベースの基本
リレーショナルデータベースの運用には、パッチ適用、バックアップ、レプリケーション、スケーリングなど多くの手間がかかります。RDSとAzure Database Servicesは、これらをクラウドプロバイダーが自動で管理してくれる**「マネージドサービス」**です。これにより、開発者はデータベースの運用ではなく、スキーマ設計やクエリ最適化といった本質的な作業に集中できます。
マネージドサービスの主なメリット
- 自動バックアップ: 定期的なデータバックアップの自動化
- パッチ管理: セキュリティパッチの自動適用
- 高可用性: 複数ゾーンでの冗長化
- 監視・アラート: パフォーマンス監視とアラート機能
- 自動スケーリング: 負荷に応じたリソース調整
サービス対応表
まず、各プラットフォームでどのデータベースエンジンがサポートされているかを整理します。
データベースエンジン | AWS | Azure |
---|---|---|
MySQL | Amazon RDS for MySQL Amazon Aurora MySQL |
Azure Database for MySQL |
PostgreSQL | Amazon RDS for PostgreSQL Amazon Aurora PostgreSQL |
Azure Database for PostgreSQL |
MariaDB | Amazon RDS for MariaDB | Azure Database for MariaDB |
SQL Server | Amazon RDS for SQL Server | Azure SQL Database Azure SQL Managed Instance |
Oracle | Amazon RDS for Oracle | 未サポート(IaaS VM推奨) |
独自エンジン | Amazon Aurora | Azure SQL Database(SQL Server派生) |
基本仕様比較
Amazon RDS vs Azure Database Services
項目 | AWS RDS | Azure Database Services |
---|---|---|
最大ストレージ | 64TB(Aurora: 128TB) | 4TB(Azure SQL: 100TB) |
最大接続数 | エンジン・インスタンス依存 | サービス層依存 |
可用性SLA | 99.95%(Multi-AZ) | 99.99%(高可用性構成) |
RPO | 5分(自動バックアップ) | 5-10分(サービス依存) |
RTO | 5-10分(Multi-AZ) | 10-15分(高可用性) |
リージョン数 | 25+ | 30+ |
エンジン別詳細比較
MySQL比較
機能 | Amazon Aurora MySQL | Azure Database for MySQL |
---|---|---|
互換性 | MySQL 5.7/8.0 | MySQL 5.7/8.0 |
パフォーマンス | 標準MySQLの5倍 | 標準MySQL同等 |
ストレージ | 自動拡張(10GB-128TB) | 手動拡張(5GB-4TB) |
読み取りレプリカ | 最大15個 | 最大5個 |
料金モデル | インスタンス+I/O課金 | インスタンス+ストレージ課金 |
PostgreSQL比較
機能 | Amazon Aurora PostgreSQL | Azure Database for PostgreSQL |
---|---|---|
互換性 | PostgreSQL 11/12/13/14/15 | PostgreSQL 11/12/13/14/15/16 |
パフォーマンス | 標準PostgreSQLの3倍 | 標準PostgreSQL同等 |
拡張機能 | 制限あり | 豊富な拡張機能サポート |
読み取りレプリカ | 最大15個 | 最大5個 |
Hyperscale | なし | Hyperscale (Citus)対応 |
SQL Server比較
機能 | Amazon RDS for SQL Server | Azure SQL Database |
---|---|---|
エディション | Express/Web/Standard/Enterprise | Basic/Standard/Premium/Critical |
最大DB サイズ | 16TB | 100TB |
Always On | Multi-AZ で類似機能 | 標準搭載 |
ライセンス | BYOL or License Included | BYOL or vCore |
SQL Server Management Studio | 完全対応 | 制限あり(一部機能未対応) |
料金比較(東京・東日本リージョン、2024年概算)
MySQL インスタンス料金比較(月額)
スペック | AWS Aurora MySQL | Azure Database for MySQL |
---|---|---|
2 vCore, 8GB RAM | $190(r6g.large相当) | $180(2 vCore汎用目的) |
4 vCore, 16GB RAM | $380(r6g.xlarge相当) | $360(4 vCore汎用目的) |
8 vCore, 32GB RAM | $760(r6g.2xlarge相当) | $720(8 vCore汎用目的) |
SQL Server料金比較(月額)
スペック | AWS RDS SQL Server | Azure SQL Database |
---|---|---|
2 vCore, 8GB | $580(ライセンス込み) | $450(vCore + ライセンス) |
4 vCore, 16GB | $1,160(ライセンス込み) | $900(vCore + ライセンス) |
Azure Hybrid Benefit適用 | 適用不可 | 最大40%割引 |
高可用性・災害復旧の比較
AWS RDS の高可用性
# RDS Multi-AZ の設定例
import boto3
rds = boto3.client('rds')
# Multi-AZ での DB インスタンス作成
response = rds.create_db_instance(
DBInstanceIdentifier='myapp-prod-db',
DBInstanceClass='db.r6g.large',
Engine='aurora-mysql',
MasterUsername='admin',
MasterUserPassword='SecurePassword123',
MultiAZ=True, # Multi-AZ 有効化
BackupRetentionPeriod=7,
PreferredBackupWindow='03:00-04:00',
PreferredMaintenanceWindow='sun:04:00-sun:05:00'
)
# 読み取りレプリカの作成
read_replica = rds.create_db_instance_read_replica(
DBInstanceIdentifier='myapp-read-replica',
SourceDBInstanceIdentifier='myapp-prod-db',
DBInstanceClass='db.r6g.large'
)
Azure Database の高可用性
# Azure CLI での高可用性 MySQL サーバー作成
az mysql flexible-server create \
--name myapp-prod-db \
--resource-group myapp-rg \
--location eastus \
--admin-user myadmin \
--admin-password SecurePassword123 \
--sku-name Standard_D2ds_v4 \
--tier GeneralPurpose \
--high-availability Enabled \
--backup-retention 7 \
--storage-size 128
# 読み取りレプリカの作成
az mysql flexible-server replica create \
--replica-name myapp-read-replica \
--source-server myapp-prod-db \
--resource-group myapp-rg
パフォーマンス・ベンチマーク比較
Amazon Aurora の性能特徴
-- Aurora の独自機能例:クローン作成
CALL mysql.rds_create_clone_db('production_db', 'test_clone');
-- Aurora の高速バックアップ
-- スナップショットから数分で復元可能
Aurora の優位性:
- ストレージ層の最適化: 6つのコピーを3つのAZに分散
- キャッシュウォーミング: インスタンス故障時の高速復旧
- 並列クエリ: 大容量データの高速処理
Azure SQL Database の性能特徴
-- Azure SQL Database の独自機能
-- 自動チューニング
ALTER DATABASE [myapp_db] SET AUTOMATIC_TUNING (FORCE_LAST_GOOD_PLAN = ON);
-- インメモリOLTP(Premium層)
CREATE TABLE OrderDetails (
OrderID int NOT NULL,
ProductID int NOT NULL,
Quantity int NOT NULL
) WITH (MEMORY_OPTIMIZED = ON);
Azure SQL Database の優位性:
- Query Store: クエリ性能の自動追跡
- 自動チューニング: AI による最適化提案
- インメモリ OLTP: メモリ最適化テーブル
セキュリティ機能比較
AWS RDS のセキュリティ
機能 | 対応状況 | 詳細 |
---|---|---|
暗号化(保存時) | ○ | KMS統合、TDE対応 |
暗号化(転送時) | ○ | SSL/TLS強制 |
ネットワーク分離 | ○ | VPC、Security Groups |
IAM統合 | ○ | データベース認証 |
監査ログ | ○ | CloudTrail、Performance Insights |
Azure Database Services のセキュリティ
機能 | 対応状況 | 詳細 |
---|---|---|
暗号化(保存時) | ○ | Key Vault統合、TDE |
暗号化(転送時) | ○ | TLS 1.2強制 |
ネットワーク分離 | ○ | VNet統合、Private Endpoints |
Azure AD統合 | ○ | シングルサインオン |
Advanced Threat Protection | ○ | AI による脅威検出 |
実践的な移行シナリオ
オンプレミス MySQL から Aurora への移行
# 1. AWS DMS を使用した移行
aws dms create-replication-task \
--replication-task-identifier mysql-to-aurora \
--source-endpoint-arn arn:aws:dms:region:account:endpoint:source \
--target-endpoint-arn arn:aws:dms:region:account:endpoint:target \
--migration-type full-load-and-cdc
# 2. mysqldump を使用したシンプルな移行
mysqldump -h source-server -u username -p database_name | \
mysql -h aurora-cluster.cluster-xxx.region.rds.amazonaws.com -u admin -p
オンプレミス SQL Server から Azure SQL Database への移行
# Azure Database Migration Service を使用
# 1. アセスメントの実行
$assessment = New-AzDataMigrationProject -ResourceGroupName "myRG" `
-ServiceName "myDMS" -ProjectName "SQLServerMigration"
# 2. スキーマ移行
$schemaTask = New-AzDataMigrationTask -ResourceGroupName "myRG" `
-ServiceName "myDMS" -ProjectName "SQLServerMigration" `
-TaskName "SchemaOnly"
# 3. データ移行の実行
$dataTask = New-AzDataMigrationTask -ResourceGroupName "myRG" `
-ServiceName "myDMS" -ProjectName "SQLServerMigration" `
-TaskName "DataMigration"
監視・運用の比較
AWS RDS の監視
# CloudWatch メトリクスの取得
import boto3
from datetime import datetime, timedelta
cloudwatch = boto3.client('cloudwatch')
# CPU使用率の取得
cpu_metrics = cloudwatch.get_metric_statistics(
Namespace='AWS/RDS',
MetricName='CPUUtilization',
Dimensions=[{
'Name': 'DBInstanceIdentifier',
'Value': 'myapp-prod-db'
}],
StartTime=datetime.utcnow() - timedelta(hours=1),
EndTime=datetime.utcnow(),
Period=300,
Statistics=['Average', 'Maximum']
)
# Performance Insights での詳細分析
pi = boto3.client('pi')
pi_data = pi.get_resource_metrics(
ServiceType='RDS',
Identifier='db-ABCDEFGHIJKLMNOPQRSTUVWX',
MetricQueries=[{
'Metric': 'db.SQL.Innodb_rows_read.avg',
'GroupBy': {'Group': 'db.sql.Innodb_rows_read.avg'}
}],
StartTime=datetime.utcnow() - timedelta(hours=1),
EndTime=datetime.utcnow()
)
Azure Database の監視
# Azure Monitor メトリクスの取得
az monitor metrics list \
--resource /subscriptions/xxx/resourceGroups/myRG/providers/Microsoft.DBforMySQL/flexibleServers/myserver \
--metric "cpu_percent,memory_percent,connections_active" \
--start-time 2024-01-01T00:00:00Z \
--end-time 2024-01-01T23:59:59Z
# Query Performance Insight の有効化
az mysql flexible-server parameter set \
--resource-group myRG \
--server-name myserver \
--name query_store_capture_mode \
--value ALL
サーバーレス・オートスケーリング比較
AWS Aurora Serverless v2
# Aurora Serverless v2 の設定
aurora_serverless = rds.create_db_cluster(
DBClusterIdentifier='serverless-cluster',
Engine='aurora-mysql',
EngineMode='provisioned', # v2では provisioned
ServerlessV2ScalingConfiguration={
'MinCapacity': 0.5, # 最小 0.5 ACU
'MaxCapacity': 16.0 # 最大 16 ACU
},
MasterUsername='admin',
MasterUserPassword='SecurePassword123'
)
Azure SQL Database Serverless
-- Azure SQL Database サーバーレスの作成
-- Auto-pause/resume 機能付き
CREATE DATABASE [MyAppDB]
(
EDITION = 'GeneralPurpose',
SERVICE_OBJECTIVE = 'GP_S_Gen5_2', -- サーバーレス構成
COMPUTE_MODEL = 'Serverless',
AUTO_PAUSE_DELAY = 60 -- 60分でオートポーズ
);
コスト最適化戦略
AWS RDS のコスト最適化
# リザーブドインスタンスの活用
reserved_instances = rds.describe_reserved_db_instances()
# ストレージ最適化
def optimize_rds_storage():
instances = rds.describe_db_instances()
for instance in instances['DBInstances']:
# 使用率チェック
if instance['AllocatedStorage'] > actual_usage * 1.5:
# ストレージを縮小(要ダウンタイム)
rds.modify_db_instance(
DBInstanceIdentifier=instance['DBInstanceIdentifier'],
AllocatedStorage=int(actual_usage * 1.2),
ApplyImmediately=False
)
# Aurora の I/O 最適化モード(2024年新機能)
aurora_optimized = rds.create_db_cluster(
DBClusterIdentifier='optimized-cluster',
Engine='aurora-mysql',
StorageType='aurora-iopt1' # I/O最適化ストレージ
)
Azure Database のコスト最適化
# Azure Hybrid Benefit の適用
az sql db update \
--resource-group myRG \
--server myserver \
--name mydb \
--license-type BasePrice # Hybrid Benefit適用
# 予約インスタンスの購入
az reservations catalog show \
--reserved-resource-type SqlDatabases \
--location eastus
# 自動スケーリングの設定
az monitor autoscale create \
--resource-group myRG \
--name myautoscale \
--resource /subscriptions/xxx/resourceGroups/myRG/providers/Microsoft.Sql/servers/myserver \
--min-count 2 \
--max-count 10 \
--count 2
実際の選択基準・意思決定フレームワーク
技術的要件による選択
要件 | AWS RDS推奨度 | Azure Database推奨度 | 理由 |
---|---|---|---|
MySQL高性能 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | Aurora の圧倒的性能 |
PostgreSQL拡張 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Azureの豊富な拡張機能 |
SQL Server | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ライセンスコストとAHB |
Oracle | ⭐⭐⭐⭐⭐ | ⭐ | RDSのみ対応 |
マルチクラウド | ⭐⭐⭐⭐ | ⭐⭐⭐ | RDSの方が移植性高い |
ビジネス要件による選択
要件 | AWS RDS | Azure Database | 備考 |
---|---|---|---|
コスト最重視 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | Aurora Serverless v2 |
Microsoft統合 | ⭐⭐ | ⭐⭐⭐⭐⭐ | Azure AD、Office 365 |
既存AWSインフラ | ⭐⭐⭐⭐⭐ | ⭐⭐ | VPC、IAM統合 |
データ分析統合 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Azure Synapse統合 |
エンタープライズ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Azure のコンプライアンス |
移行のベストプラクティス
Phase 1: 評価・計画
# データベース評価ツールの例
def database_assessment():
# 現在のワークロード分析
queries = analyze_query_patterns()
storage = calculate_storage_requirements()
performance = measure_performance_metrics()
# 移行コスト見積もり
aws_cost = calculate_aws_cost(queries, storage, performance)
azure_cost = calculate_azure_cost(queries, storage, performance)
return {
'recommendation': 'aws' if aws_cost < azure_cost else 'azure',
'cost_difference': abs(aws_cost - azure_cost),
'migration_complexity': assess_complexity()
}
Phase 2: 移行実行
# ゼロダウンタイム移行の例(MySQL)
# 1. ソースDBのバイナリログ有効化
# 2. 初期データ同期
# 3. 継続的レプリケーション
# 4. カットオーバー
# AWS DMS を使用した継続的レプリケーション
aws dms start-replication-task \
--replication-task-arn arn:aws:dms:region:account:task:taskid \
--start-replication-task-type reload-target
まとめ:2024年時点での選択指針
データベースエンジン別推奨
エンジン | 推奨プラットフォーム | 理由 |
---|---|---|
MySQL | AWS Aurora MySQL | 5倍の性能、自動拡張ストレージ |
PostgreSQL | Azure Database for PostgreSQL | 豊富な拡張機能、Hyperscale対応 |
SQL Server | Azure SQL Database | Azure Hybrid Benefit、統合環境 |
Oracle | AWS RDS for Oracle | Azureは正式サポートなし |
MariaDB | AWS RDS for MariaDB | 機能・性能面でやや優位 |
組織タイプ別推奨
AWS RDS を選ぶべき組織:
- スタートアップ〜成長企業: Aurora の高性能・低コスト
- MySQL/PostgreSQL中心: Aurora の圧倒的な性能メリット
- マルチクラウド戦略: ベンダーロックイン回避
- 高い技術的自由度: 豊富なエンジン選択肢
Azure Database を選ぶべき組織:
- Microsoft統合企業: Office 365、Azure AD統合
- SQL Server移行: Azure Hybrid Benefit活用
- 大規模データ分析: Azure Synapse統合
- エンタープライズ: 強固なコンプライアンス
総合判定
結論として、MySQL/PostgreSQLで高性能を求める場合は AWS Aurora、SQL Serverからの移行や Microsoft エコシステムとの統合を重視する場合は Azure Database Services が最適な選択となります。
重要なのは、現在のデータベース環境、アプリケーション要件、チームのスキルセット、そして将来の拡張計画を総合的に評価することです。どちらも非常に成熟したサービスのため、基本的な要件は満たしますが、特定の要件において明確な差別化があります。
次回は、NoSQLデータベースに焦点を当て、AWS DynamoDBとAzure Cosmos DBを比較します。お楽しみに!