【问题标题】:Status on AWS S3 cross region replication delete operations behaviourAWS S3 跨区域复制删除操作行为的状态
【发布时间】:2018-10-17 11:44:14
【问题描述】:

我惊讶地发现文件删除没有在 S3 存储桶跨区域复制情况下复制,运行这个简单的测试:

  1. CRR 的最简单配置
  2. 上传新文件
  3. 检查是否复制
  4. 删除文件(不是文件的版本)

所以我检查了documentation,我发现了这个声明:

如果您从源存储桶中删除对象,则会发生以下情况:

  • 如果您在未指定对象版本 ID 的情况下发出 DELETE 请求,Amazon S3 会添加一个删除标记。 Amazon S3 处理删除 标记如下:
    • 如果使用最新版本的复制配置,即在复制配置规则中指定 Filter 元素, Amazon S3 不会复制删除标记。
    • 如果不指定 Filter 元素,Amazon S3 会假定复制配置是之前的版本 V1。在较早的 在版本中,Amazon S3 以不同方式处理删除标记的复制。 如需更多信息,请参阅Backward Compatibility

后面的向后兼容链接告诉我:

  • 当您从源存储桶中删除对象而不指定对象版本 ID 时,Amazon S3 会添加一个删除标记。如果您使用 V1 的复制配置 XML,Amazon S3 会复制由用户操作产生的删除标记。[...] 在 V2 中,Amazon S3 不复制删除标记,因此您必须将 DeleteMarkerReplication 元素设置为 Disabled。

所以如果我总结一下:

  • 如果没有过滤器,则将 CRR 配置视为 v1
  • 使用 CRR 配置 v1,复制文件删除,而不是使用 v2

嗯,这是我的配置:

{
    "ReplicationConfiguration": {
        "Role": "arn:aws:iam::271226720751:role/service-role/s3crr_role_for_mybucket_to_myreplica",
        "Rules": [
            {
                "ID": "first replication rule",
                "Status": "Enabled",
                "Destination": {
                    "Bucket": "arn:aws:s3:::myreplica"
                }
            }
        ]
    }
}

并且删除不会被复制。所以这让我觉得我的配置仍然被认为是 V2(即使我没有过滤器)。


那么,有人可以证实这个假设吗? 有人能告诉我是什么吗:

在 V2 中,Amazon S3 不会复制删除标记,因此您必须将 DeleteMarkerReplication 元素设置为 Disabled

真的是什么意思?

【问题讨论】:

  • 看到相同的行为...没有复制删除标记(甚至对象也没有被完全删除)您找到解决方案了吗?

标签: amazon-web-services amazon-s3


【解决方案1】:

复制删除标记时有两种不同的配置,V1和V2。

目前,当您从控制台启用 S3 复制(CRR 或 SRR)时,默认情况下会启用 V2 配置。但是,如果您的用例要求您在从源存储桶中删除复制对象时删除它们,则您需要 V1 配置

这里是V1和V2的区别:

  • V1 配置

删除标记被复制(V1 配置)。对源存储桶和目标存储桶中已删除对象的后续 GET 请求不会返回该对象。

  • V2 配置

不复制删除标记(V2 配置)。对已删除对象的后续 GET 请求仅返回目标存储桶中的对象。

要启用 V1 配置(复制删除标记),请使用以下策略。请记住,某些复制功能,例如基于标签的过滤和复制时间控制 (RTC),仅在 V2 配置中可用。

{
    "Role": " IAM-role-ARN ",
    "Rules": [
        {
            "ID": "Replication V1 Rule",
            "Prefix": "",
            "Status": "Enabled",
            "Destination": {
                "Bucket": "arn:aws:s3:::<destination-bucket>"
            }
        }
    ]
}

以下是详细描述这些行为的博客: https://aws.amazon.com/blogs/storage/managing-delete-marker-replication-in-amazon-s3/

【讨论】:

【解决方案2】:

我看到了完全相同的行为。我无法创建 v1 情况来进行 DeleteMarker 复制。

【讨论】:

  • 你想出解决这个问题的办法了吗?
  • 我记得看到他们将不再支持旧的 v1 方法。
【解决方案3】:

问题来自 AWS 的文档仍然不明确。 要使用 DeleteMarkerReplication,您需要 V1 的配置。为了让 AWS 知道您需要 V1,您需要在配置中指定一个 Prefix 元素,并且没有 DeleteMarkerReplication 元素,因此您的第一次尝试几乎是正确的。

{
"ReplicationConfiguration": {
    "Role": "arn:aws:iam::271226720751:role/service-role/s3crr_role_for_mybucket_to_myreplica",
    "Rules": [
        {
            "ID": "first replication rule",
            "Prefix": "",
            "Status": "Enabled",
            "Destination": {
                "Bucket": "arn:aws:s3:::myreplica"
            }
        }
    ]
}

}

当然,您的策略中需要 s3:ReplicateDelete 权限。

【讨论】:

    【解决方案4】:

    我相信我已经弄清楚了。看起来删除标记是否被复制取决于复制角色中的权限。

    如果您的复制角色在目标上具有s3:ReplicateDelete 权限,则将复制删除标记。如果 if 没有该权限,则他们没有。

    以下是我的复制角色的 Cloudformation YAML,其中 ReplicateDelete 权限已被注释掉作为示例。使用此设置,它不会复制删除标记,取消注释权限,它会。请注意,如果您通过控制台设置复制,则权限基于 AWS 实际创建的内容(它们与文档中的内容略有不同)。

    ReplicaRole:
      Type: AWS::IAM::Role
      Properties:
        #Path: "/service-role/"
        AssumeRolePolicyDocument:
          Version: '2012-10-17'
          Statement:
          - Effect: Allow
            Principal:
              Service:
              - s3.amazonaws.com
            Action:
            - sts:AssumeRole
        Policies:
        - PolicyName: "replication-policy"
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Resource:
                  - !Sub "arn:aws:s3:::${LiveBucketName}"
                  - !Sub "arn:aws:s3:::${LiveBucketName}/*"
                Action:
                  - s3:Get*
                  - s3:ListBucket
              - Effect: Allow
                Resource: !Sub "arn:aws:s3:::${LiveBucketName}-replica/*"
                Action:
                  - s3:ReplicateObject
                  - s3:ReplicateTags
                  - s3:GetObjectVersionTagging
                  #- s3:ReplicateDelete
    

    【讨论】:

      【解决方案5】:

      添加评论作为答案,因为我无法评论 @john-eikenberry's 答案。我已经测试了 John (Action "s3:ReplicateDelete") 建议的答案,但它不起作用。

      编辑:尝试失败:

      我也尝试过启用删除标记的存储桶复制,但失败了。错误信息是:

      调用 PutBucketReplication 时发生错误 (MalformedXML) 操作:您提供的 XML 格式不正确或没有 根据我们发布的架构进行验证

      实验详情:

      现有的复制配置:

      aws s3api get-bucket-replication --bucket my-source-bucket &gt; my-source-bucket.json

      {
          "Role": "arn:aws:iam::account-number:role/s3-cross-region-replication-role",
          "Rules": [
              {
                  "ID": " s3-cross-region-replication-role",
                  "Priority": 1,
                  "Filter": {},
                  "Status": "Enabled",
                  "Destination": {
                      "Bucket": "arn:aws:s3:::my-destination-bucket"
                  },
                  "DeleteMarkerReplication": {
                      "Status": "Disabled"
                  }
              }
          ]
      }
      

      aws s3api put-bucket-replication --bucket my-source-bucket --replication-configuration file://my-source-bucket-updated.json

      {
          "Role": "arn:aws:iam::account-number:role/s3-cross-region-replication-role",
          "Rules": [
              {
                  "ID": " s3-cross-region-replication-role",
                  "Priority": 1,
                  "Filter": {},
                  "Status": "Enabled",
                  "Destination": {
                      "Bucket": "arn:aws:s3:::my-destination-bucket"
                  },
                  "DeleteMarkerReplication": {
                      "Status": "Enabled"
                  }
              }
          ]
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-24
        • 2017-07-19
        • 1970-01-01
        • 2021-01-24
        • 2018-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多