話題の記事

[アップデート] 同一リージョン内でS3バケットのレプリケーションが出来るようになりました!

従来はリージョン間でのバケット複製のみでしたが、今回のアップデートで同一リージョン内のバケット複製がサポートされました!
2019.09.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

待望のアップデートがリリースされました!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"
    }
  ]
}

IAM ポリシー

{
    "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)でした!