こんにちは!染田です
Amazon S3(以下、S3)のデータを別のリージョンへ移したいとき、まず思い浮かぶのが CRR(クロスリージョンレプリケーション) だと思います。ところが、CRRのルールを設定しても、設定する前からバケットにあるデータは複製されません。既存のデータを複製するには、S3 Batch Replication(以下、Batch Replication)という別の仕組みを使います。
「CRRだけで全部コピーされると思っていた…」とならないよう、今回は2つの仕組みを実際に動かして違いを確かめてみました。
本記事でわかること
- CRRとBatch Replicationの違いと、それぞれの使いどころ
- 既存データと新しいデータが、それぞれどう複製されるか(実際の検証結果)
- Batch ReplicationがCRRのルールを前提にしていること
CRRとBatch Replicationの違い
| 項目 | CRR | Batch Replication |
|---|---|---|
| 複製の対象 | ルールを設定したあとに追加・更新されたデータ | ルールを設定する前からあるデータ |
| 動き方 | ルールがある限り、移行元に追加されたら自動で移行先に反映し続ける | 一括で1回だけ複製する(継続的な同期はしない) |
| 実体 | S3のレプリケーションルール | S3 Batch Operationsのジョブ |
必要なもの
| CRR | Batch Replication |
|---|---|
| S3バケット2つ(移行元・移行先) | CRRの設定(有効なレプリケーションルール) |
| 両方のバケットでバージョニングを有効化 | ジョブを実行するAWS IAMロール(CRR用のロールとは別) |
| レプリケーション用のIAMロール | 完了レポート用のS3バケット(任意) |
完了レポートを出力すると、オブジェクトごとの成功・失敗と失敗の理由をCSVで確認できます。
検証の構成
- 移行元:オレゴン(us-west-2)のバケット
- 移行先:東京(ap-northeast-1)のバケット
- 移行元には、CRRを設定する前に既存データとして
pre-1.txt〜pre-3.txtを置いておきます - CRRを設定したあとに、新しいデータとして
post-1.txtを追加します
検証①:CRRは既存データを複製するか
既存データ(pre-1.txt 〜 pre-3.txt)があるバケットに、CRRのルールを作成します。

ルールを作成すると、「既存のオブジェクトをレプリケートしますか?」と聞かれます。今回はCRRだけの動きを確かめたいので、「いいえ」を選びました。


しばらく待っても、移行先のバケットは空のままでした。CRRだけでは、既存データは複製されないことが確認できました。

検証②:CRRは新しいデータを複製するか
続いて、ルールを設定したあとに post-1.txt を移行元に追加しました。

すると、移行先には post-1.txt だけが複製されました。ルールを設定したあとのデータは、自動で複製されます。

なお、ファイルを上書きした場合も、新しい内容が移行先に反映されました。一度ルールを設定すれば、ずっと同期され続けます。
検証③:Batch Replicationで既存データを複製する
CRRのルールを有効にしたまま、Batch Replicationのジョブを作成します。ポイントは、オブジェクトリストの作り方で 「レプリケーション設定に基づいてオブジェクトリストを生成」 を選ぶことです。これで、レプリケーションのルールに合うオブジェクトが自動で対象に含まれます。

ジョブを実行すると、対象の4件がすべて成功しました。

移行先を確認すると、post-1.txt に加えて、既存データの pre-1.txt 〜 pre-3.txt も複製されていました。

検証④:CRRのルールを無効にしてBatch Replicationを実行する
Batch ReplicationはCRRのルールを使って複製します。では、ルールを無効にしたらどうなるのかを試しました。

ルールを無効にしたままジョブを作成すると、対象0件でジョブが失敗しました。ルールを有効に戻すと、再び実行できました。

検証結果
| # | 分かったこと |
|---|---|
| 1 | Batch ReplicationはCRRの設定が前提。ルールを無効にするとジョブは失敗(対象0件)し、有効に戻すと実行できた |
| 2 | CRRは一度設定すれば、ずっと同期される。追加・上書きしたデータも自動で反映される |
| 3 | Batch Replicationのジョブは1回しか実行できない。もう一度実行するときは、ジョブを複製(クローン)して新しく作る |
使い分けと組み合わせ方
| CRR | Batch Replication | |
|---|---|---|
| 要点 | 設定後の新しいデータを自動で複製。既存データは対象外 | 既存データを一括で複製。CRRの設定が前提 |
| 向いている場面 | 移行後も移行元のデータを反映し続けたいとき、リージョンをまたいで冗長化したいとき | 既存データを移行先へ持っていきたいとき、リージョンを移設するとき |
既存データの移行と、移行後の同期を両方やりたい場合は、次の順番で進めます。
- 両方のバケットでバージョニングを有効にします
- CRRのルールを作成します(これ以降のデータは自動で複製されます)
- Batch Replicationで、既存データを一括で複製します
ルール作成時のダイアログで「はい、既存のオブジェクトをレプリケートします」を選ぶと、2と3をまとめて行うこともできます。
補足:レプリケーションの状況を確認する方法
オブジェクトのプロパティの「管理設定」にある レプリケーションステータス で、複製の状況を確認できます。複製中は PENDING、完了すると COMPLETED に推移します。


まとめ
- CRRは「設定したあと」のデータを自動で複製し続けます(既存データは対象外です)
- Batch Replicationは「設定する前から」あるデータを1回だけ複製します(CRRのルールが前提です)
- 既存データの移行と移行後の同期を両方やるなら、CRRのルールを作り、既存分をBatch Replicationで複製します
S3のリージョン移設やバックアップを検討している方の参考になれば幸いです。


コメント