S3の双方向レプリケーションを試してみた

2つのリージョンで作成したS3バケットで双方向レプリケーションを利用してマルチマスターな構成を試してみました。

こんにちは、AWS事業本部のニシヤマです。

S3バケットのデータを複製するレプリケーション機能がありますが、こちらをお互いのS3バケットへレプリケーションを行う双方向レプリケーションを試してみました。

Amazon S3で双方向や複数バケットのレプリケーションが可能になりました

前提条件

S3バケットのレプリケーションの利用にはレプリケーション元の、レプリケーション先のの両方のS3バケットでバージョニングする必要があります。

事前準備

それではS3バケットを用意します。手順は省略しますが今回せっかくなので東京リージョン大阪リージョンのS3バケットで試してみたいと思います。

  • test-bidirectionalreplication-tokyo-bucket:東京リージョンのS3バケット
  • test-bidirectionalreplication-osaka-bucket:大阪リージョンのS3バケット

それぞれ別のリージョンに作成できています。

東京リージョンのS3バケット

大阪リージョンのS3バケット

それではレプリケーション設定を行なっていきますが、その前に各リージョンのS3バケットに異なるファイルをアップロードしておきたいと思います。

東京リージョンのS3バケット

大阪リージョンのS3バケット

これで準備できました。それではレプリケーションの設定を実施していきます。

レプリケーション設定

東京リージョンから大阪リージョンへレプリケーション

それではレプリケーション設定を実施してみます。まずは東京リージョン→大阪リージョンへのレプリケーションを設定していきます。

S3バケットの管理>レプリケーションルールでレプリケーションルールの作成をクリックします。

レプリケーションルールを作成画面で以下情報を入力します。

  • レプリケーションルール名を入力し、ルールスコープを選択ではバケット内のすべてのオブジェクトに適用を選択します。
  • 送信先ではこのアカウントのバケットを選択するで先ほどの大阪リージョンのS3バケットを指定します。
  • IAM ロールについては今回自動で作成されたIAMロールを利用します。

上記を選択したら保存をクリックします。

S3にある既存のオブジェクトをレプリケートについて確認があります。今回は既存のオブジェクトも大阪リージョンへレプリケーションするのではい、既存のオブジェクトをレプリケートします。を選択して送信をクリックします。

最後に既存オブジェクトを送信するバッチオペレーションについての確認がありますので、完了レポートの保存先S3バケットを指定して保存をクリックします。

自動的にバッチオペレーションの画面に遷移するので、最新のジョブが完了済みになるのを待ちます。

しばらくすると大阪リージョンのS3バケットに東京リージョンのオブジェクトが同期されました。

大阪リージョンから東京リージョンへレプリケーション

今度は大阪リージョンで設定していきますが、まずは東京リージョンのS3バケットには東京リージョンのオブジェクトしか存在しないことを確認しておきます。

それでは大阪リージョンからもレプリケーションの設定を実施していきます。先ほどの東京リージョンの時と同じ流れで設定してください。

以降は同じ流れなので割愛。

こちらもしばらくすると大阪リージョンのオブジェクトが同期されました。

これで異なるリージョンのS3バケットでの双方向レプリケーションができました。

それぞれのリージョンでオブジェクトを更新してみる

それでは双方向レプリケーション設定後に各S3バケットにオブジェクトをアップロードしていきます。 比較しやすいように左側に大阪リージョン、右に東京リージョンのS3バケットのオブジェクト一覧を表示します。

大阪リージョン(左)に2つのオブジェクトをアップロードします。アップロード直後は東京リージョン(右)にレプリケーションされていません。

少し待つとレプリケーションされました。

今度は東京リージョン(右)に2つのオブジェクトをアップロードします。先ほどと同じくアップロード直後はレプリケーションされていませんが、少し待つと大阪リージョン(左)にレプリケーションされます。

今度は両方のリージョンに同時に異なるオブジェクトをアップロードしてみます。

結果は予想通りですが両方のリージョンで同じオブジェクトを保持する状態になります!

おまけ

おまけ1:両方のS3バケットからレプリケーションを受けるS3バケットを試す

S3バケットのレプリケーション先ですが複数の宛先S3バケットを指定することが可能です。今回の双方向レプリケーションのS3バケットとは別に両方のレプリケーションを受け付けるS3バケットを作成して試したいと思います。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/replication.html

オブジェクトは、単一または複数の送信先バケットにレプリケートできます。

また注意点としてはレプリケーションルールによって作成されたオブジェクトは別のレプリケーションルールによる複製はされません。 今回の構成で言うと、東京リージョン→大阪リージョンで作成されたオブジェクトは大阪リージョン→その他のリージョンへのレプリケーションはされません。 大阪リージョン→東京リージョンへ作成されたオブジェクトも同様です。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/replication-what-is-isnot-replicated.html

レプリケーション設定でレプリケートされないものは何ですか?

〜省略〜

別のレプリケーションルールによって作成されたレプリカである、レプリケート元バケットのオブジェクト。

では、両方のリージョンのオブジェクトを受け付けるS3バケットを作成します。 今度はバージニアリージョンにしたいと思います。 バージョニングを有効化してS3バケットを作成しました。

東京リージョンからバージニアリージョンにレプリケーション

先に東京リージョンからバージニアリージョンにレプリケーションを設定します。もちろん既存のオブジェクトについてもレプリケートします。

少し待つとオブジェクトがバージニアリージョンのS3バケットにレプリケーションされました。

ここで想定と異なっていたのですが、前述の注意点を踏まえると大阪リージョン→東京リージョンへ作成されたオブジェクトも東京リージョンの既存オブジェクトとしてバージニアリージョンにレプリケーションされていました。

現在東京リージョン→バージニアリージョンにレプリケーションのみを設定しているため、大阪リージョンから直接バージニアリージョンへのレプリケーションは設定していません。この段階で大阪リージョンにオブジェクトをアップロードしてみます。 この場合は、以下のように大阪リージョンからバージニアリージョンへは2つのルールを経由する多段レプリケーションになるのでバージニアリージョンにはオブジェクトは作成されないはずです。

ルール1:大阪リージョン→東京リージョン ルール2:東京リージョン→バージニアリージョン

大阪リージョンへオブジェクトアップロード直後

レプリケーションの結果

結果、大阪リージョン→東京リージョンへ作成されたオブジェクトPachipachiPanchi.txtは注意点に記載の通りバージニアリージョンにレプリケーションされていませんでした。

大阪リージョンからバージニアリージョンにレプリケーション

それでは続いて大阪リージョンからバージニアリージョンにレプリケーションを設定します。先ほど大阪リージョンでアップロードしたオブジェクトがバージニアリージョンにレプリケーションされていないので、既存のオブジェクトについてもレプリケートします。

結果、先ほど大阪リージョンにアップロードし、東京リージョンにレプリケーションされたオブジェクトもバージニアリージョンに複製されました!

その後は、東京リージョンでの変更、大阪リージョンの変更は3つのリージョンのS3バケットで同じ状態になることを確認しました。 当然ですがレプリケーションルールを設定していないバージニアリージョンのS3バケットにアップしたオブジェクトは他のリージョンのS3バケットに反映されませんでした。

おまけ2:一度レプリケーションを解除して同じS3バケットに既存オブジェクトをレプリケーションしてみる

※※※レプリケーションを解除して、再度同じバケットに既存オブジェクトも送信してみる

基本的に双方向レプリケーションを行なった場合にはレプリケーションルールを削除するような状況や、複製されたオブジェクトの削除が必要な状況は起きないかなと思いますが、「一度レプリケーションで作成されたオブジェクトを全て削除して同じS3バケットにレプリケーションを再設定したらどうなるのかな」と思ったので試してみます。

まずは分かりやすくするために全てのレプリケーションルールを削除します。

また、大阪リージョンのオブジェクトを旧バージョンも含め全て削除します。念の為大阪リージョン側のレプリケーションルールも削除しておきました。

それでは再度東京リージョン→大阪リージョンへのレプリケーションルールを設定していきます。今の東京リージョンには東京リージョンにアップロードされたオブジェクト大阪リージョンからレプリケーションされたオブジェクトが混ざっている状態です。

既存のオブジェクトをレプリケートするようにして実行します。

結果ですが、既存のオブジェクトをレプリケートするバッチオペレーションは完了しましたが、レプリケーション設定時に指定したレポートファイルを確認するとfailedのステータスと共に以下のメッセージが表示されており既存のオブジェクト自体は大阪側にレプリケーションされていませんでした。

Currently object can't be replicated if this object previously existed in the destination but was recently deleted. Please try again at a later time

あまり発生する状況ではないと思いますが、一度レプリケーションで作成されたオブジェクトを全て削除して同じS3バケットにレプリケーションをしたい場合は、既存のオブジェクトについてはAWS CLIなどで複製する必要があるようです。

まとめ

いかがでしたでしょうか。S3の双方向レプリケーションを利用することで東京リージョン、大阪リージョンの2つのリージョンでオブジェクトを同期し、マルチマスター的に利用することができる様になりました。また複数のレプリケーション先を指定することで3つ以上のS3バケットでも同期することが可能なようです。 バージョニングの有効化や、複数リージョンでのS3課金により料金的には増えることになりますが、リージョンを跨いでオブジェクト同期させることで今まで以上に安心してS3の運用ができそうですね。

以上、この記事がどなたかの参考になれば幸いです。

参考