目次
AWS Elastic Disaster Recovery(DRS)完全ガイド v2.0(2026年最新対応)
RTO分・RPO秒のブロックレベルレプリケーション・クラウドDR統合・低コスト実現
目次
- ドキュメントメタデータ
- 概要と課題
- アーキテクチャと設計原則
- コアコンポーネント
- 主要ユースケース
- 設定・操作の具体例
- 類似サービス比較表
- ベストプラクティス
- トラブルシューティング表
- 2025-2026最新動向
- 学習リソース・参考文献
- 実装例・チェックリスト
- まとめ
ドキュメントメタデータ
- 最終更新: 2026-04-26
- バージョン: v2.0
- 対象者: ディザスタリカバリ責任者、Infrastructure Manager、Cloud Architect
- 難易度: 上級
- 旧サービス: CloudEndure Disaster Recovery(2021 年に DRS に統合)
- 関連サービス: AWS Backup、Application Migration Service(MGN)、EC2、S3、EBS
概要と課題
本質
AWS Elastic Disaster Recovery(DRS) は 「オンプレミス・他クラウド・AWS のサーバーをリアルタイムにブロックレベルでレプリケーションし、分単位のフェイルオーバーで AWS にディザスタリカバリ(DR)を実現するマネージドサービス」 である。RTO(目標復旧時間)分単位・RPO(目標復旧ポイント)秒単位の攻撃的な DR 目標を低コストで実現し、従来の物理 DR サイト・ウォームスタンバイの維持コスト(サーバー・ネットワーク・ストレージ)を大幅に削減する。CloudEndure Disaster Recovery の後継サービス。
このサービスを選ぶ理由
なぜ AWS Elastic Disaster Recovery なのか?
-
従来型 DR の圧倒的なコスト削減
- 従来 DR 方式(ウォームスタンバイ):DR サイトに本番同等のサーバーを常時稼働 本番 100 台 × 本番環境と同等の vCPU・メモリ × 24h × 365 日 = 年間数千万円
- DRS 方式:エージェント + Replication Server(t3.small)+ EBS ストレージのみ 本番 100 台 × $0.028/時間 × 720 時間 + EBS 料金 ≈ 月額 $2,000 + EBS
- コスト削減率:50~80%
-
分単位の RTO と秒単位の RPO
- 従来バックアップ DP(Backup・Restore):RTO 数時間・RPO 数時間
- DRS ブロックレベルの継続的レプリケーション:RTO 5~20 分・RPO 秒単位
- 本番障害 → 数秒で AWS に自動フェイルオーバー可能
-
OS・ハイパーバイザー非依存
- Replication Agent をインストールするだけで物理・仮想・クラウドのどのサーバーからも AWS にレプリケーション可能
- 既存 hypervisor(VMware vSphere・Hyper-V・Xen)・OS(Windows・Linux・UNIX)に依存しない汎用的な DR ソリューション
-
DR テストが本番に影響しない
- DR ドリル実行時に本番のレプリケーションを停止・遅延させない
- テスト環境として Recovery Instance を起動し、本番環境は並行稼働
- 定期的な DR 訓練を安全に実施でき、RTO・フェイルオーバー手順を事前検証
-
Reverse Replication(フェイルバック)で柔軟な復旧
- 本番障害から AWS でフェイルオーバー後、本番環境修復時に逆方向レプリケーション開始
- AWS → 本番環境への failback で、本番環境に復帰可能
- 他クラウド(Azure・GCP)からの DR でマルチクラウド戦略実現
このサービスを選ばない理由
- RTO 数時間で十分 → AWS Backup(CCR)で十分
- オンプレミス拠点あり(同一施設内) → 物理バックアップが低コスト
- アプリ依存性複雑 → AWS Application Migration Service(MGN)+カスタマイズ
アーキテクチャと設計原則
全体構成図(Mermaid 1)
graph TB
subgraph OnPrem["本番環境(オンプレ/他クラウド)"]
SRV["Source Servers<br/>Windows/Linux<br/>Physical/Virtual"]
AGENT["Replication Agent<br/>Block-level Change Capture"]
end
subgraph AWS["AWS(DR サイト)"]
REP_SRV["Replication Servers<br/>(t3.small EC2)"]
STAGING["Staging Area<br/>EBS Volume"]
RECOVERY["Recovery Instances<br/>(フェイルオーバー時)"]
end
subgraph Network["ネットワーク・セキュリティ"]
VPN["AWS VPN / Direct Connect<br/>暗号化通信"]
SG["Security Groups<br/>45-forward only"]
end
SRV -->|Install Agent| AGENT
AGENT -->|Block-level<br/>Continuous Replication| VPN
VPN -->|TLS 1.2+| STAGING
STAGING -->|Staged| REP_SRV
REP_SRV -->|ドリル / 障害| RECOVERY
RECOVERY -->|Optional Reverse<br/>Replication| STAGING
STAGING -->|Copy back| SRV
style AGENT fill:#e8f4f8
style STAGING fill:#fff3cd
style RECOVERY fill:#d4edda
ブロックレベルレプリケーションフロー
┌─ Source Server(本番)
│ ├─ Replication Agent インストール
│ ├─ ディスク変更をリアルタイムキャプチャ(block-level)
│ └─ TLS 暗号化で AWS に転送
│
├─ AWS Replication Server(ステージングエリア)
│ ├─ t3.small EC2(低コスト待機)
│ ├─ EBS ボリュームにレプリケーションデータ保管
│ └─ RPO 秒単位で同期維持
│
└─ フェイルオーバー実行時
├─ Recovery Instance 起動(EC2 + EBS)
├─ ステージング area の最新スナップショットから復元
├─ VPC・Subnet・Security Group を自動設定
└─ 分単位で本番相当環境が AWS 上で起動完了
コアコンポーネント
1. Replication Agent(ソースサーバー側)
定義 本番サーバーにインストールするエージェント、ブロックレベルの変更をキャプチャ・AWS に送信
インストール方式
# Linux 用 Python スクリプト
wget https://aws-elastic-disaster-recovery-{region}.s3.amazonaws.com/latest/linux/aws-replication-installer-init.py
sudo python3 aws-replication-installer-init.py \
--region ap-northeast-1 \
--aws-access-key-id AKIA... \
--aws-secret-access-key ...
# Windows 用 PowerShell
# DownloadAndInstallAgent.ps1 をダウンロード → PowerShell で実行
# インストール後:
# - エージェント自動起動(systemd / Windows Service)
# - ブロックレベルの連続レプリケーション開始
# - DRS Console に "Server is Replicating" 表示
リソース要件
- CPU: 1 vCPU(エージェント CPU 使用率 2-5%)
- RAM: 128 MB 最小(推奨 512 MB)
- ネットワーク: 10 Mbps 最小(推奨 100 Mbps 以上)
- ディスク: 1 GB 最小(ローカルキャッシュ用)
2. Replication Configuration Template
定義 ソースサーバーのレプリケーション動作を制御する設定テンプレート
主要設定項目
- Staging Area Subnet: EBS ボリュームを配置する VPC・Subnet
- Replication Server Instance Type: t3.small(デフォルト・低コスト)/ m5.large など
- Use Dedicated Replication Server: false(共有) / true(専有)
- Bandwidth Throttling: 0(無制限) / 1~1000 Mbps(制限)
- Data Plane Routing: PRIVATE_IP(VPC 内) / PUBLIC_IP(インターネット経由)
- Create Public IP: false / true
- EBS Encryption: true(デフォルト・KMS 暗号化)
- Staging Area Tags: Environment=DR, Cost Center=...
3. Launch Configuration(リカバリー時の起動設定)
定義 フェイルオーバー・ドリル時に Recovery Instance がどう起動するか定義
設定内容
- Launch Disposition: STOPPED(停止したまま) / STARTED(起動状態)
- Target Instance Type Right Sizing:
BASIC(ソース同等) / MEDIUM / HIGH(アップサイジング)
- Copy Private IP: false(新規割り当て) / true(ソース IP 継承)
- Copy Tags: true(ソースタグをコピー)
- Licensing:
byol: false(AWS ライセンス) / true(ユーザー持ち込みライセンス)
- Post-Launch Actions:
cloudWatchLogGroupName: /drs/recovery
s3LogBucket: my-drs-logs
actions: [] # カスタムスクリプト(Systems Manager Run Command など)
4. Recovery Instance(フェイルオーバー後)
定義 フェイルオーバー実行時に AWS 上で起動される EC2 インスタンス
自動設定項目
- Instance Name: {SourceServerName}-Recovery
- VPC / Subnet: 事前設定
- Security Groups: Launch Config で指定
- EBS Volumes: ステージングエリアから復元
- IAM Instance Profile: ユーザー指定
- CloudWatch Monitoring: 自動有効化
5. Recovery Plan(復旧計画・API Only)
定義 複数のソースサーバーをグループ化し、フェイルオーバー順序・Wave(段階)を定義 (Console UI は Wave 1 のみ、複数 Wave は API で定義)
例
{
"recoveryPlanName": "prod-app-recovery",
"sourceServerIDs": ["s-xxx", "s-yyy", "s-zzz"],
"waves": [
{
"waveID": 1,
"waveDelay": 0,
"sourceServerIDs": ["s-xxx"] // DB サーバーを最初に起動
},
{
"waveID": 2,
"waveDelay": 300, // 5 分待機
"sourceServerIDs": ["s-yyy", "s-zzz"] // APP サーバーを次に起動
}
]
}
主要ユースケース
1. オンプレミス基幹システムの分単位 DR(最一般的)
シナリオ データセンター障害 → RTO 15 分で AWS にフェイルオーバー → 本番業務継続
本番環境(オンプレ):
- Oracle Database 12c(ライセンス持ち込み)
- 3 台の UNIX アプリサーバー
- NAS ストレージ 2 TB
DR 要件: RTO 15 分・RPO 5 秒
DRS 構成:
1. Oracle DB サーバーに Replication Agent インストール
2. 3 台の APP サーバーに Replication Agent インストール
3. 本番障害検知 → DRS Console で "Initiate Failover" クリック
4. Recovery Instances 起動・EBS 復元(5 分)
5. Network 切り替え・DNS 更新(5 分)
6. 本番相当環境が AWS で稼働(15 分で完了)
2. データセンター段階的クラウド移行
シナリオ 本番環境のまま AWS レプリケーション開始 → テストして確認 → 本番環境を段階的に AWS に移行
Phase 1: テスト環境レプリケーション(ドリル)
- DRS ドリル実行
- Recovery Instance でアプリケーション動作確認
- ドリル終了 → Recovery Instance 削除・本番は継続
Phase 2: Planned Failover(計画的フェイルオーバー)
- 本番環境でのメンテナンスウィンドウ中に実施
- DRS Failover 実行
- データロス なし(RPO = 秒単位)
Phase 3: Cutover(本番切り替え)
- AWS 上の Recovery Instance を本番環境に昇格
- Reverse Replication で定期バックアップ継続
Phase 4: Failback(本番環境復帰・オプション)
- AWS から オンプレ / 他クラウド に戻すことも可能
3. マルチクラウド DR(Azure / GCP から AWS へ)
シナリオ Azure に本番環境あり → AWS に DR 環境構築
Azure VM:
- Windows Server 2019
- SQL Server 2019
- アプリケーション
AWS DRS:
1. Azure VM に Replication Agent インストール
2. AWS 側で Replication Configuration 設定(VPN または Direct Connect で接続)
3. リアルタイムレプリケーション開始
4. Azure リージョン障害 → AWS にフェイルオーバー
メリット:
- Azure ライセンスの Windows / SQL Server をそのまま AWS で使用(BYOL)
- Azure の本番環境ダウンタイムなし(パラレル稼働)
4-12. (その他 9 ユースケース省略)
設定・操作の具体例
CLI 操作(5 パターン)
1. DRS 初期化・Replication Configuration テンプレート作成
# DRS の初期化(リージョン ごと 1 回)
aws drs initialize-service \
--region ap-northeast-1
# Replication Configuration Template を取得(デフォルトを確認)
aws drs describe-replication-configuration-templates \
--region ap-northeast-1
# テンプレートを更新
TEMPLATE_ID=$(aws drs describe-replication-configuration-templates \
--region ap-northeast-1 \
--query 'items[0].replicationConfigurationTemplateID' \
--output text)
aws drs update-replication-configuration-template \
--replication-configuration-template-id $TEMPLATE_ID \
--staging-area-subnet-id subnet-12345678 \
--staging-area-tags Key=Environment,Value=DR-Staging \
--replication-server-instance-type t3.small \
--use-dedicated-replication-server false \
--bandwidth-throttling 0 \
--create-public-ip false \
--data-plane-routing PRIVATE_IP \
--ebs-encryption true \
--region ap-northeast-1
2. Replication Agent インストール・監視(Linux)
# Step 1: インストーラースクリプトをダウンロード
wget -O /tmp/aws-replication-installer-init.py \
https://aws-elastic-disaster-recovery-ap-northeast-1.s3.amazonaws.com/latest/linux/aws-replication-installer-init.py
# Step 2: インストール実行(IAM credential が必要)
sudo python3 /tmp/aws-replication-installer-init.py \
--region ap-northeast-1 \
--aws-access-key-id AKIAIOSFODNN7EXAMPLE \
--aws-secret-access-key wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY \
--no-prompt
# Step 3: インストール確認
sudo systemctl status aws-replication-agent
# Step 4: DRS Console で Source Server 確認(1~2 分)
aws drs describe-source-servers \
--filters sourceServerIDs={} \
--region ap-northeast-1
3. ドリル(テストフェイルオーバー)実行
# Source Server ID を取得
SERVER_ID=$(aws drs describe-source-servers \
--query 'items[0].sourceServerID' \
--output text \
--region ap-northeast-1)
echo "Source Server ID: $SERVER_ID"
# Drill 開始(本番に影響なし)
aws drs start-recovery \
--source-servers '{"sourceServerIDs": ["'$SERVER_ID'"]}' \
--is-drill true \
--tags Key=DrillDate,Value=$(date +%Y-%m-%d) \
--region ap-northeast-1
# → Recovery Instances が起動開始(5~10 分)
# Status 確認
aws drs describe-recovery-instances \
--filters sourceServerIDs={$SERVER_ID} \
--query 'items[0].[recoveryInstanceID,status,launchStatus]' \
--output table \
--region ap-northeast-1
# Drill 終了(Recovery Instance 削除)
RECOVERY_ID=$(aws drs describe-recovery-instances \
--filters sourceServerIDs={$SERVER_ID} \
--query 'items[0].recoveryInstanceID' \
--output text)
aws drs terminate-recovery-instances \
--recovery-instance-ids $RECOVERY_ID \
--region ap-northeast-1
4. 本番フェイルオーバー実行
# ⚠️ 本番障害発生時のみ実行
SERVER_ID="s-xxx"
# Failover 開始(is-drill: false)
aws drs start-recovery \
--source-servers '{"sourceServerIDs": ["'$SERVER_ID'"]}' \
--is-drill false \
--region ap-northeast-1
# → Recovery Instance が本番環境として起動
# Status 監視
while true; do
STATUS=$(aws drs describe-recovery-instances \
--filters sourceServerIDs={$SERVER_ID} \
--query 'items[0].launchStatus.status' \
--output text \
--region ap-northeast-1)
echo "Status: $STATUS"
if [ "$STATUS" = "LAUNCHED" ]; then
echo "Recovery Instance ready!"
break
fi
sleep 30
done
5. Failback(本番環境復帰)
# 本番環境修復後、AWS から本番環境に戻す
RECOVERY_ID="r-xxx"
# Failback Launch 開始
aws drs start-failback-launch \
--recovery-instance-ids $RECOVERY_ID \
--region ap-northeast-1
# Failback 完了後、Recovery Instance を削除
aws drs terminate-recovery-instances \
--recovery-instance-ids $RECOVERY_ID \
--region ap-northeast-1
# 本番環境のレプリケーション再開(AWS → オンプレ)
# 以降、AWS がセカンダリ DR サイトとして機能
SDK / Infrastructure as Code(5 パターン)
1. CloudFormation での DRS IAM Role 設定
AWSTemplateFormatVersion: '2010-09-09'
Resources:
DRSServiceRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: drs.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSElasticDisasterRecoveryServiceRole
DRSUserRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
AWS: !Sub 'arn:aws:iam::${AWS::AccountId}:root'
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AWSElasticDisasterRecoveryFullAccess
2. Terraform での DRS Setup
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_drs_replication_configuration_template" "example" {
staging_area_subnet_id = aws_subnet.staging.id
replication_server_instance_type = "t3.small"
use_dedicated_replication_server = false
bandwidth_throttling = 0
create_public_ip = false
data_plane_routing = "PRIVATE_IP"
ebs_encryption = "DEFAULT"
tags = {
Name = "drs-config"
Environment = "Production"
}
}
resource "aws_ec2_security_group" "drs_staging" {
name = "drs-staging-sg"
description = "DRS Staging Area Security Group"
vpc_id = aws_vpc.main.id
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = [aws_vpc.main.cidr_block]
}
ingress {
from_port = 1500
to_port = 1500
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"] # Source servers からのレプリケーション
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "drs-staging"
}
}
3. Python SDK(Boto3)での自動フェイルオーバー・復旧
import boto3
import time
from datetime import datetime
def initiate_drs_failover(source_server_id: str, is_drill: bool = False):
"""
DRS Failover を開始(ドリル / 本番)
"""
drs = boto3.client('drs')
failover_type = "DRILL" if is_drill else "PRODUCTION"
print(f"Initiating {failover_type} failover for server: {source_server_id}")
try:
response = drs.start_recovery(
sourceServers=[{'sourceServerID': source_server_id}],
isDrill=is_drill,
tags={'FailoverType': failover_type, 'InitiatedAt': datetime.now().isoformat()}
)
print(f"Failover initiated: {response}")
return response
except Exception as e:
print(f"Error initiating failover: {str(e)}")
return None
def monitor_recovery_instance(source_server_id: str, max_wait_minutes: int = 30):
"""
Recovery Instance の起動を監視
"""
drs = boto3.client('drs')
start_time = time.time()
max_wait_seconds = max_wait_minutes * 60
while True:
try:
response = drs.describe_recovery_instances(
filters={'sourceServerIDs': [source_server_id]}
)
if not response['items']:
print("No recovery instances found yet...")
time.sleep(10)
continue
recovery_instance = response['items'][0]
status = recovery_instance.get('launchStatus', {}).get('status')
print(f"Recovery Instance Status: {status}")
if status == 'LAUNCHED':
print(f"✅ Recovery Instance Ready!")
print(f" Instance ID: {recovery_instance['recoveryInstanceID']}")
print(f" Instance Type: {recovery_instance.get('ec2InstanceID')}")
return recovery_instance
if time.time() - start_time > max_wait_seconds:
print(f"❌ Timeout waiting for recovery instance ({max_wait_minutes} min)")
return None
time.sleep(20)
except Exception as e:
print(f"Error monitoring recovery instance: {str(e)}")
time.sleep(20)
def failback_to_source(recovery_instance_id: str):
"""
AWS から本番環境に Failback
"""
drs = boto3.client('drs')
print(f"Starting failback for recovery instance: {recovery_instance_id}")
try:
response = drs.start_failback_launch(
recoveryInstanceIDs=[recovery_instance_id]
)
print(f"Failback launched: {response}")
return response
except Exception as e:
print(f"Error initiating failback: {str(e)}")
return None
if __name__ == '__main__':
# ドリル実行
source_id = "s-12345678"
print("=== DRS Drill Execution ===")
initiate_drs_failover(source_id, is_drill=True)
recovery = monitor_recovery_instance(source_id)
if recovery:
print("\n✅ Drill completed successfully")
# ドリル終了(Recovery Instance 削除)
drs = boto3.client('drs')
drs.terminate_recovery_instances(
recoveryInstanceIDs=[recovery['recoveryInstanceID']]
)
print("Drill cleanup completed")
4. AWS Systems Manager での自動ドリル実行(月 1 回)
AWSTemplateFormatVersion: '2010-09-09'
Resources:
DRSDrillAutomationDocument:
Type: AWS::SSM::Document
Properties:
DocumentType: Automation
Content:
schemaVersion: '0.3'
description: Monthly DRS Drill Execution
parameters:
SourceServerID:
type: String
description: DRS Source Server ID
mainSteps:
- name: InitiateDrill
action: aws:executeAwsApi
onFailure: Continue
inputs:
Service: drs
Api: StartRecovery
SourceServers:
- sourceServerID: '{{ SourceServerID }}'
IsDrill: true
Tags:
MonthlyDrill: 'true'
- name: WaitForRecovery
action: aws:sleep
inputs:
Duration: PT600S # 10 分待機
- name: CheckRecoveryStatus
action: aws:executeAwsApi
inputs:
Service: drs
Api: DescribeRecoveryInstances
Filters:
sourceServerIDs:
- '{{ SourceServerID }}'
- name: TerminateRecoveryInstance
action: aws:executeAwsApi
onFailure: Continue
inputs:
Service: drs
Api: TerminateRecoveryInstances
RecoveryInstanceIDs:
- '{{ CheckRecoveryStatus.Items[0].RecoveryInstanceID }}'
DRSDrillSchedule:
Type: AWS::Events::Rule
Properties:
ScheduleExpression: 'cron(0 2 1 * ? *)' # 毎月 1 日 02:00 UTC
State: ENABLED
Targets:
- Arn: !Sub 'arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:automation-definition/DRSDrillAutomationDocument:$LATEST'
RoleArn: !GetAtt SSMExecutionRole.Arn
Input: !Sub |
{
"SourceServerID": ["s-12345678"]
}
SSMExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: events.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AWSElasticDisasterRecoveryFullAccess
5. CDK(TypeScript)での DRS 環境セットアップ
import * as cdk from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as iam from 'aws-cdk-lib/aws-iam';
export class DRSStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// VPC / Subnet for DRS Staging Area
const vpc = new ec2.Vpc(this, 'DRSVpc', {
cidr: '10.0.0.0/16',
natGateways: 1,
});
const stagingSubnet = new ec2.Subnet(this, 'StagingSubnet', {
vpcId: vpc.vpcId,
cidrBlock: '10.0.1.0/24',
availabilityZone: this.availabilityZones[0],
});
// Security Group for Replication
const replicationSG = new ec2.SecurityGroup(this, 'ReplicationSG', {
vpc,
description: 'DRS Replication Security Group',
allowAllOutbound: true,
});
replicationSG.addIngressRule(
ec2.Peer.anyIpv4(),
ec2.Port.tcp(1500),
'DRS Replication Port'
);
replicationSG.addIngressRule(
ec2.Peer.anyIpv4(),
ec2.Port.tcp(443),
'HTTPS for DRS API'
);
// IAM Role for DRS
const drsRole = new iam.Role(this, 'DRSRole', {
assumedBy: new iam.ServicePrincipal('drs.amazonaws.com'),
managedPolicies: [
iam.ManagedPolicy.fromAwsManagedPolicyName(
'service-role/AWSElasticDisasterRecoveryServiceRole'
),
],
});
// Output
new cdk.CfnOutput(this, 'StagingSubnetId', {
value: stagingSubnet.subnetId,
exportName: 'DRS-StagingSubnetId',
});
new cdk.CfnOutput(this, 'ReplicationSecurityGroupId', {
value: replicationSG.securityGroupId,
exportName: 'DRS-ReplicationSG',
});
}
}
類似サービス比較表
| 観点 | DRS | MGN(Application Migration Service) | AWS Backup(CCR) | VMware Site Recovery | Zerto | Veeam |
|---|---|---|---|---|---|---|
| 目的 | DR(継続稼働) | 移行(一度限り) | バックアップ | DR | DR | バックアップ + DR |
| 継続的レプリケーション | ✅ 秒単位 RPO | ✅ 移行完了まで | △ スナップショット | ✅ | ✅ | △ |
| RTO | 分単位 | 移行完了後 N/A | 数時間 | 分単位 | 秒~分 | 数時間 |
| Reverse Replication | ✅(Failback) | ❌(移行後無効) | ❌ | ✅ | ✅ | △ |
| OS・HV 非依存 | ✅ | △ | ✅ | △(VMware) | △ | ✅ |
| CloudEndure 後継 | ✅ | ✅ | N/A | ❌ | ❌ | ❌ |
| 料金体系 | Server/hour + EBS | ✅ 移行期間のみ | 従量課金 | 高額ライセンス | 高額ライセンス | ライセンス型 |
| AWS ネイティブ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
| 推奨用途 | AWS DR | AWS 移行 | 定期バックアップ | オンプレ↔Hybrid | DR(高可用) | Multi-datacenter |
ベストプラクティス(✅/❌)
| # | プラクティス | 理由 |
|---|---|---|
| ✅ 1 | 四半期ごとのドリル(テストフェイルオーバー)実施 | RTO・手順検証・スタッフ教育 |
| ✅ 2 | Recovery Plan で Wave ステージング | DB → APP 順など依存関係考慮 |
| ✅ 3 | Launch Config で Post-Launch Actions | Health Check・アプリケーション起動確認 |
| ✅ 4 | Bandwidth Throttling で本番ネットワーク保護 | ピーク時間外にスロットルを解除 |
| ✅ 5 | Staging Area を専用 VPC に配置 | 本番環境との完全分離・セキュリティ |
| ✅ 6 | Reverse Replication で定期バックアップ | AWS → 本番への failback 準備 |
| ✅ 7 | CloudWatch Metrics で RPO・RTO 監視 | Replication Lag・Recovery Time 可視化 |
| ✅ 8 | Systems Manager で自動ドリル実行 | 月 1 回自動化・運用負荷削減 |
| ❌ 1 | ドリルを実施しない | 実フェイルオーバー時に失敗リスク |
| ❌ 2 | 本番ネットワーク帯域を DRS に無制限使用 | 本番業務への影響 |
| ❌ 3 | Failover 後の動作確認なし | Application Level の問題検出漏れ |
トラブルシューティング表
| エラー / 症状 | 原因 | 対策 |
|---|---|---|
| Replication Agent がインストールできない | 権限不足 / Python version 不一致 | sudo 権限確認 / Python 3.6+ インストール |
| “Server is NOT replicating” | ネットワーク不通 / Security Group ブロック | DRS Replication Port(1500)・HTTPS(443)のインバウンド確認 |
| Recovery Instance が起動しない | Staging Subnet に EBS 容量不足 | Subnet の AZ・VPC CIDR・EBS quota 確認 |
| RPO が数時間に増加 | ネットワーク遅延 / ディスク I/O 飽和 | Bandwidth Throttling 解除 / Source Server CPU・I/O 確認 |
| “Unable to reach Replication Server” | Replication Server EC2 が stopped | DRS Console → Replication Servers で status 確認・restart |
| Failover 後のアプリが起動しない | Post-Launch Actions 未設定 / Security Group ルール不足 | Launch Config で Health Check スクリプト追加・SG ルール確認 |
| Failback が遅い | Reverse Replication の Bandwidth 制限 | Bandwidth Throttling を 0(無制限)に設定 |
2025-2026 最新動向
1. Container・Kubernetes Workload Support(2026 計画)
# Kubernetes ノードのブロックレベルレプリケーション
aws drs start-recovery \
--source-servers '{"kubernetesNodes": ["node-1", "node-2"]}'
2. Database-Specific Recovery Plans
RDS・Aurora のネイティブ統合
- DRS + RDS Backup での統合 failover
3. AI/ML による Optimal Failover Timing
CloudWatch Metrics + ML でベストなフェイルオーバータイミングを提案
学習リソース・参考文献
AWS 公式ドキュメント
-
What is AWS Elastic Disaster Recovery
-
DRS User Guide
-
DRS API Reference
オープンソース・ベンダー
-
AWS Disaster Recovery Whitepaper
-
CloudEndure Documentation(旧サービス参考)
実装例・チェックリスト
実装例:オンプレ基幹システムの分単位 DR 構築スクリプト
(省略:詳細なセットアップスクリプト)
採用チェックリスト
- [ ] RTO 分単位が必須(時間単位では許容できない)
- [ ] RPO 秒単位が必須(hour 単位では許容できない)
- [ ] オンプレミス・他クラウド・AWS のサーバーを複数運用
- [ ] 物理 DR サイトの維持コストが高い(削減したい)
- [ ] 定期的な DR ドリルを実施したい(安全に)
- [ ] Failback で本番環境に戻す可能性あり
- [ ] 規制要件で RTO・RPO が明記されている
- [ ] AWS VPN / Direct Connect の接続環境がある
まとめ
AWS Elastic Disaster Recovery(DRS)は 「RTO 分・RPO 秒のブロックレベルリアルタイムレプリケーション DR サービス」。Replication Agent でオンプレ・他クラウド・AWS のサーバーから秒単位の連続レプリケーション実行、障害時は分単位で AWS にフェイルオーバー。従来の物理 DR サイト・ウォームスタンバイの維持コストを 50~80% 削減しながら、分単位の RTO と秒単位の RPO を実現。定期的なドリルも本番影響なく実施でき、Failback で本番環境への復帰も可能な、エンタープライズグレードのディザスタリカバリソリューション。
最終更新:2026-04-26 バージョン:v2.0