[アップデート] S3 の Cross-Region Replication の対象をタグで制御できるようになりました!

S3 のクロスリージョンレプリケーション(CRR)の機能アップデートにより、レプリケーション対象をオブジェクトタグに基づいて指定することが可能になりましたのでご紹介します。
2018.09.27

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

少し前のアップデートですが、Amazon S3 のクロスリージョンレプリケーションにおいて、レプリケーション対象をオブジェクトタグで制御できるようになりました。

従来は、「バケット単位」か、「プレフィックス」の指定のみでしたが、タグ指定が可能になったことでファイル名(オブジェクトキー名)の自由度が高くなりますね!

さっそくやってみる

では、実際に設定して確認してみましょう!今回は、東京リージョンとオレゴンリージョンに以下のバケットを作成しています。

  • cm-crr-tokyo (ソースバケット)
  • cm-crr-oregon (ターゲットバケット)

設定はソースバケット側から行いますので、S3 管理コンソールからソースバケットのメニューから、[管理] - [レプリケーション] - [ルールの追加] を開きます。

バージョニングが有効ではない場合、以下のような画面が表示されますので [バージョニングの有効化] をクリックし、有効化します。

[ソースの設定] メニューが表示されますので、[プレフィックスまたはタグ] を選択し、タグ名を入力します。今回は REPLICATE というタグにしています。文字を入力すると、[プレフィックス] か [タグ] のいずれかを選択するメニューが表示されますので、[タグ] をクリックします。

[タグ] を選択すると、以下のような画面に変わりますので、続いて値を入力します。今回は、REPLICATE タグの値が true のものだけ、レプリケーションするという設定にしています。

値がセットされたことを確認します。デフォルトでは、KMS 暗号化されているオブジェクトはレプリケーションから除外されています。必要に応じて、有効化および、復号キーを指定してください。今回は、デフォルトのまま [次へ] をクリックします。

次に [送信先の設定] メニューが表示されますので、[送信先バケット] を指定します。送信先バケットのバージョニングが有効ではない場合、以下のように表示されますので [バージョニングの有効化] をクリックし有効化します。その他のオプション指定では、レプリケーション先のストレージクラスを変更したり、所有者の変更が可能ですので、適宜、指定してください。今回はデフォルトまま、[次へ] をクリックします。

次に [オプションを設定] メニューが表示されます。IAM ロールは [新しいロールの作成] を選択、ルール名は任意の値を入力します。ステータスは、このルールを有効状態で作成するか、無効にするかの選択ですので [有効] を選択し、[次へ] をクリックします。

最後に [確認] 画面が表示されますので、[保存]をクリックします。

保存が完了すると、以下のような画面が表示されます。今回、IAM ロールは [新しいロールの作成] を指定していましたので、自動的に s3crr_role_for_<ソースバケット名>_to_<ターゲットバケット名> のロールが作成されました。

作成されたロールにアタッチされていた IAM ポリシー、および信頼関係は以下のとおりです。事前に作成しておきたい場合は、参考にしてください。

IAMポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:Get*",
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::cm-crr-tokyo",
                "arn:aws:s3:::cm-crr-tokyo/*"
            ]
        },
        {
            "Action": [
                "s3:ReplicateObject",
                "s3:ReplicateDelete",
                "s3:ReplicateTags",
                "s3:GetObjectVersionTagging"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::cm-crr-oregon/*"
        }
    ]
}

信頼関係

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "s3.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

これで準備は整いました!

動作確認

2つのローカルファイルをアップロードする際、タグを REPLICATE=trueREPLICATE=false で動作の違いを確認したいと思います。s3 コマンドではタグ付けするオプションが見当たらなかったので、s3api で実行します。

$ aws s3api put-object --bucket cm-crr-tokyo --key test-tag-false --body ./test-tag-false --tagging REPLICATE=false
{
    "VersionId": "v.6HkdNd_0ptewm3fZYzNpd6cymtLhHX",
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\""
}
$ aws s3api put-object --bucket cm-crr-tokyo --key test-tag-true --body ./test-tag-false --tagging REPLICATE=true
{
    "VersionId": "JgHeO_66_ReklHoRcg5YTGs.7ExIrcwm",
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\""
}

まず、東京リージョンで正常にアップロードされたことを確認します。

$ aws s3 ls cm-crr-tokyo
2018-09-27 07:21:47          0 test-tag-false
2018-09-27 07:22:42          0 test-tag-true

問題ないですね。次に、オレゴンリージョンを確認します。

$ aws s3 ls cm-crr-oregon
2018-09-27 07:22:42          0 test-tag-true

REPLICATE=true に設定した、test-tag-true のみがレプリケーションされてますので、タグベースでのレプリケーション制御が出来ていることが確認できましたね!

ちなみに、[プレフィックス] と [タグ] を両方指定した場合の動きも確認してみましょう。たとえば、今回のルールに [プレフィックス: REPLICA-] を追加した場合の例です。

$ aws s3api put-object --bucket cm-crr-tokyo --key NOTREPLICA-test-tag-true --body ./NOTREPLICA-test-tag-true --tagging REPLICATE=true
{
    "VersionId": "cvaWiMlD4_S27LoCOTku1cdyVOOK8wRr",
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\""
}
$ aws s3api put-object --bucket cm-crr-tokyo --key REPLICA-test-tag-true --body ./REPLICA-test-tag-true --tagging REPLICATE=true
{
    "VersionId": "Sgql3gRhp08av3lE0vGH24x_HwBnoPib",
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\""
}
$ aws s3api put-object --bucket cm-crr-tokyo --key REPLICA-test-tag-false --body ./REPLICA-test-tag-false --tagging REPLICATE=false
{
    "VersionId": "xcpfvFOgjltPI3BfKdAPF.PK6oZEBn5M",
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\""
}
$ aws s3 ls cm-crr-tokyo
2018-09-27 07:32:39          0 NOTREPLICA-test-tag-true
2018-09-27 07:32:55          0 REPLICA-test-tag-false
2018-09-27 07:32:47          0 REPLICA-test-tag-true
$ aws s3 ls cm-crr-oregon
2018-09-27 07:32:47          0 REPLICA-test-tag-true

*-test-tag-true は、いずれのファイルもタグは REPLICATE=true を付与しています。しかし、レプリケーションされたものは、プレフィックスもマッチした REPLICA-test-tag-true だけですね。同じく、プレフィックス REPLICA- にマッチしても、タグが REPLICATE=false の場合はレプリケーションされていません。ということで、AND 条件で動作していることが判りましたね!

さいごに

クロスリージョンレプリケーションにおいて、レプリケーション対象をオブジェクトのタグで制御できることをご紹介させていただきました。今回のアップデートによって、クロスリージョンレプリケーションを使う場合でも、オブジェクトキー名の自由度が高まりました。ただし、その反面、どのファイルがレプリケーション対象なのか判りにくくなる可能性があるので、要件に応じて、バケット単位、プレフィックス、タグ を使い分ける必要がありそうですね。

以上!大阪オフィスの丸毛(@marumo1981)でした!