🗂

S3のオブジェクトレプリケーションにかかる時間を検証してみた

2024/02/21に公開

動機

S3レプリケーションでオブジェクトのレプリケーションにどの程度かかるか知る必要があり、調べてみるも以下のような記述しか見つからず、自分で検証するに至りました。

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

大部分のオブジェクトは、15 分以内にレプリケートされます。Amazon S3 がオブジェクトをレプリケートするために要する時間は、さまざまな要因に依存します (レプリケート元とレプリケート先のリージョンペア、オブジェクトのサイズなど)。大きなオブジェクトの場合は、レプリケーションには最大で数時間かかることもあります。

環境

  • レプリケーション用のS3バケット

    • 削除マーカーのレプリケーションは Enabled です。
    • レプリケーション元のS3バケットは us-east-1(バージニア北部) に、レプケーション先のS3バケットは us-east-2(オハイオ)us-west-1(北カリフォルニア) に構築しました。
  • レプリケーションのログ取得と確認

    • CloudTrail, S3バケット, Athena を使用し、いずれも us-east-1(バージニア北部) に構築しました。
  • 各リソースの詳細な設定値は以下のCloudFormationテンプレートの通りです

    レプリケーション元(一部抜粋)
    {
      "Resources": {
        "S3ReplicationBucket": {
          "Type": "AWS::S3::Bucket",
          "Properties": {
            "BucketName": "trials3replicationsrcstaceplicationbucket",
            "ReplicationConfiguration": {
              "Role": {
                "Fn::GetAtt": [
                  "S3ReplicationRole",
                  "Arn"
                ]
              },
              "Rules": [
                {
                  "DeleteMarkerReplication": {
                    "Status": "Enabled"
                  },
                  "Destination": {
                    "Bucket": "arn:aws:s3:::trials3replicationdest1stdest1stackbucket"
                  },
                  "Filter": {},
                  "Id": "Rule1",
                  "Priority": 0,
                  "Status": "Enabled"
                },
                {
                  "DeleteMarkerReplication": {
                    "Status": "Enabled"
                  },
                  "Destination": {
                    "Bucket": "arn:aws:s3:::trials3replicationdest2stdest2stackbucket"
                  },
                  "Filter": {},
                  "Id": "Rule2",
                  "Priority": 1,
                  "Status": "Enabled"
                }
              ]
            },
            "Tags": [
              {
                "Key": "aws-cdk:auto-delete-objects",
                "Value": "true"
              }
            ],
            "VersioningConfiguration": {
              "Status": "Enabled"
            }
          },
          "UpdateReplacePolicy": "Delete",
          "DeletionPolicy": "Delete",
          "Metadata": {
            "aws:cdk:path": "TrialS3ReplicationSrcStack/S3Replication/Bucket/Resource"
          }
        },
        "S3ReplicationRole": {
          "Type": "AWS::IAM::Role",
          "Properties": {
            "AssumeRolePolicyDocument": {
              "Statement": [
                {
                  "Action": "sts:AssumeRole",
                  "Effect": "Allow",
                  "Principal": {
                    "Service": "s3.amazonaws.com"
                  }
                }
              ],
              "Version": "2012-10-17"
            }
          },
          "Metadata": {
            "aws:cdk:path": "TrialS3ReplicationSrcStack/S3Replication/Role/Resource"
          }
        },
        "S3ReplicationRoleDefaultPolicy": {
          "Type": "AWS::IAM::Policy",
          "Properties": {
            "PolicyDocument": {
              "Statement": [
                {
                  "Action": [
                    "s3:GetReplicationConfiguration",
                    "s3:ListBucket"
                  ],
                  "Effect": "Allow",
                  "Resource": {
                    "Fn::GetAtt": [
                      "S3ReplicationBucket",
                      "Arn"
                    ]
                  }
                },
                {
                "Action": [
                  "s3:GetObjectVersionAcl",
                  "s3:GetObjectVersionForReplication",
                  "s3:GetObjectVersionTagging"
                ],
                "Effect": "Allow",
                "Resource": {
                  "Fn::Join": [
                    "",
                    [
                      {
                        "Fn::GetAtt": [
                          "S3ReplicationBucket",
                          "Arn"
                        ]
                      },
                      "/*"
                    ]
                  ]
                }
                },
                {
                  "Action": [
                    "s3:ReplicateDelete",
                    "s3:ReplicateObject",
                    "s3:ReplicateTags"
                  ],
                  "Effect": "Allow",
                  "Resource": [
                    "arn:aws:s3:::trials3replicationdest1stdest1stackbucket/*",
                    "arn:aws:s3:::trials3replicationdest2stdest2stackbucket/*"
                  ]
                }
              ],
              "Version": "2012-10-17"
            },
            "PolicyName": "S3ReplicationRoleDefaultPolicy",
            "Roles": [
              {
                "Ref": "S3ReplicationRole"
              }
            ]
          },
          "Metadata": {
            "aws:cdk:path": "TrialS3ReplicationSrcStack/S3Replication/Role/DefaultPolicy/Resource"
          }
        }
      }
    }
    
    レプリケーション先(一部抜粋)
    {
      "Resources": {
        "Bucket": {
          "Type": "AWS::S3::Bucket",
          "Properties": {
            "BucketName": "trials3replicationdest1stdest1stackbucket",
            "Tags": [
              {
                "Key": "aws-cdk:auto-delete-objects",
                "Value": "true"
              }
            ],
            "VersioningConfiguration": {
              "Status": "Enabled"
            }
          },
          "UpdateReplacePolicy": "Delete",
          "DeletionPolicy": "Delete",
          "Metadata": {
            "aws:cdk:path": "TrialS3ReplicationDest1Stack/Bucket/Resource"
          }
        }
      }
    }
    

方法

  1. 1KBのテキストファイルをレプリケーション元のバケットに PutObject します。
  2. レプリケーション先の全バケットにファイルがレプリケーションされたらレプリケーション元のファイルを DeleteObject します。
  3. レプケーション先の全バケットからファイルが削除されたら再度 1 から同じ手順を複数回繰り返します。

結果

  • レプリケーションにかかる時間は概ね20数秒でした。
  • 平均より時間がかかることが相当数ありました。
PutObject
us-east-2
(秒)
PutObject
us-west-1
(秒)
DeleteObject
us-east-2
(秒)
DeleteObject
us-west-1
(秒)
1回目 22 22 21 21
2回目 20 20 22 22
3回目 22 22 22 21
4回目 22 22 21 31
5回目 21 21 22 22
6回目 22 22 23 32
7回目 21 32 21 21
8回目 22 22 22 25
9回目 22 21 22 22
10回目 21 22 22 22
11回目 22 22 22 22
12回目 22 23 22 32
13回目 22 23 23 24
14回目 22 21 21 22
15回目 21 22 21 21
16回目 21 22 21 22
17回目 22 22 22 22
18回目 22 23 22 22

所感

  • 即時性があるとは言い難く、瞬時の切り替えが要求されるシステムには向かないと思いました。
  • 思ったよりも安定しているようですが、時間がかかる時がそれなりに発生するのだなと改めて認識できました。

Discussion