[アップデート] 同一リージョン内でS3バケットのレプリケーションが出来るようになりました!
待望のアップデートがリリースされました!S3 バケットの同一リージョン内でのレプリケーションです!
Amazon S3 introduces Same-Region Replication
これまで異なるリージョンのバケットに対して Cross-Region レプリケーション(CRR)を行うことは出来ましたが、同一リージョンのバケットに対しても Same-Region レプリケーション(SRR)が出来るようになりました。
なにが嬉しいのか
従来は異なるリージョンのバケットしかレプリケーションできなかったので、同一リージョン内で複製したい場合には S3 のマネージド機能ではなく、何らかの作り込みでオブジェクトをコピーする必要がありました。(S3 バッチオペレーションもあるかもしれませんが、ちょっとした複製にはコストがあわないですね)
今回、同一リージョン内のレプリケーションがサポートされたことで、以下のようなことが容易に実装できるようになります。
- 同一リージョン内でバックアップ用途のバケット複製
- ログなどの単一バケット集約
- 異なるアカウント間のオブジェクト連携
個人的に SRR は異なるアカウント間でオブジェクト連携する際に、非常に重宝すると思っています。
注意点
基本的に CRR と同じく以下のようなものがあげられます。
- レプリケーション設定前に存在しているオブジェクトはレプリケーションされません
- 既存オブジェクトは AWS CLI などを使ってコピーする必要があります
- 双方のバケットでバージョニングの有効化が必要
- バケット所有者が権限を持っていない場合はレプリケーションされません
- GLACIER または DEEP_ARCHIVE ストレージクラスに格納されているオブジェクトはレプリケーションされません
- 多段レプリケーションはできません
- ライフサイクル構成によって実行されるアクションはレプリケーションされません
- バケットレベルのサブリソースの更新はレプリケーションされません
- たとえば、ライフサイクル設定を変更したり、通知設定をソースバケットに追加した場合、これらの変更は宛先バケットに適用されません
レプリケーションされるもの、されないものについての詳細は、公式ガイドをチェックしましょう。
試してみる
それでは早速ためしてみましょう。東京リージョン内に以下のような2つのバケットを用意しました。いずれもバージョニングは有効です。
- cm-srr-01(ソース)
- cm-srr-02(ターゲット)
ソースバケット内にはオブジェクトを1つ配置しています。
aws s3 ls s3://cm-srr-01/ 2019-09-19 05:06:16 6 test1
この状態で SRR 設定を行っていきます。ソース側の[管理]-[レプリケーション]を開き、[ルールの追加]をクリックします。
ソースの設定ではプレフィックスやタグでレプリケーション対象をフィルタできますが、今回はバケット内すべてを対象に設定します。
ちなみに CRR の例ですが、タグを使ったレプリケーションの記事は以下を参照ください。
[アップデート] S3 の Cross-Region Replication の対象をタグで制御できるようになりました!
次に送信先バケットを指定します。送信先のバケットでストレージクラスや、所有者を変更することも可能です。
ルール名や、ユーザに代わってオブジェクトをレプリケートするため IAM ロールを指定するか、このメニューから新規作成を選びます。自動作成された場合は以下のようなポリシーをもった、IAM ロールが作成されます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:Get*", "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::cm-srr-01", <<ソースバケット "arn:aws:s3:::cm-srr-01/*" <<ソースバケット/* ] }, { "Action": [ "s3:ReplicateObject", "s3:ReplicateDelete", "s3:ReplicateTags", "s3:GetObjectVersionTagging" ], "Effect": "Allow", "Resource": "arn:aws:s3:::cm-srr-02/*" <<ターゲットバケット/* } ] }
最後に設定内容のサマリーを確認して、保存します。
これで設定は完了です。
レプリケーション確認
レプリケーション後のターゲット側の内容は下記のとおり、何も存在しません。既存オブジェクトはコピーされないので注意しましょう。
$ aws s3 ls s3://cm-srr-02/
それではソース側にオブジェクトを追加します。
$ aws s3 cp test2 s3://cm-srr-01/ upload: ../test2 to s3://cm-srr-01/test2
ターゲット側を確認すると、レプリケーションされていることが確認できましたね!
$ aws s3 ls s3://cm-srr-02/ 2019-09-19 05:23:49 6 test2
検証は以上です!
さいごに
これまで同一リージョン内のバケットを複製する場合には手組みで実装するか、S3 バッチオペレーションなどを使用する必要があり、「なぜ、リージョン間コピーだけがマネージドなんだ・・・」と思っていましたが、ようやく簡単に同一リージョン内で複製出来るようになりました。
同一アカウント内よりも、アカウント間でのファイル連携の際に同一リージョン内で複製したい!!という需要が高いんじゃないかと思います。これまでに手組みでリージョン内の複製をされておりましたら、ぜひマネージド機能への切り替えも検討してみてはいかがでしょうか!
以上!大阪オフィスの丸毛(@marumo1981)でした!