【问题标题】:Can't get Amazon S3 Cross Region Replication between two accounts to work无法让两个账户之间的 Amazon S3 跨区域复制工作
【发布时间】:2019-08-02 04:13:11
【问题描述】:

我希望有人可以帮助我处理 Amazon S3 跨区域复制查询。我有两个 Amazon AWS 账户,每个账户都有一个位于不同区域的存储桶。我想将数据从一个存储桶复制到另一个存储桶,据我所知,这应该是一个简单的创建过程。但是,我真的很挣扎,我不知道我做错了什么。我在网上遵循了很多说明,包括浏览各种 AWS 教程,查看了很多示例,但我无法复制数据。

我在两个存储桶上都启用了版本控制,并且没有任何数据被加密。但是,我的源存储桶中确实有一个策略,该策略允许通过引用条件访问源数据,以便只能通过特定域访问数据(在这种情况下为图像)。这一切都很好,我怀疑这可能是限制目标存储桶访问的原因。

我已按照在线说明设置复制规则和 IAM 策略。

所以,我的源存储桶策略是:-

{
"Version": "2012-10-17",
"Id": "http referrer policy",
"Statement": [
    {
        "Sid": "Allow get requests originated from list",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::SOURCEBUCKET/*",
        "Condition": {
            "StringLike": {
                "aws:Referer": [
                    "http://www.domain1.com/*",
                    "https://www.domain2.com/*",
                    "http://domain3.com/*"
                ]
            }
        }
    }
]

}

我的目标存储桶策略是:-

{
"Version": "2008-10-17",
"Id": "S3-Console-Replication-Policy",
"Statement": [
    {
        "Sid": "S3ReplicationPolicyStmt1",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::MYSOURCEACCIDNUMBER:root"
        },
        "Action": [
            "s3:List*",
            "s3:GetBucketVersioning",
            "s3:PutBucketVersioning",
            "s3:ReplicateObject",
            "s3:ReplicateDelete"
        ],
        "Resource": [
            "arn:aws:s3:::DESTINATIONBUCKET",
            "arn:aws:s3:::DESTINATIONBUCKET/*"
        ]
    }
]

}

谁能告诉我如何(如果需要)添加到源存储桶策略以启用来自目标存储桶的访问?我很确定问题就在这里。

提前致谢。

【问题讨论】:

    标签: amazon-web-services amazon-s3


    【解决方案1】:

    为了测试这种情况,我做了以下操作:

    • 使用版本控制在 Account-A 中创建 Bucket-A
    • 使用版本控制在 Account-B 中创建 Bucket-B
    • Bucket-A 上配置跨区域复制,选择“创建新角色”(见下文)
    • 将 UI 中提供的目标存储桶策略(与您的上述匹配)添加到 Bucket-B

    进程创建了一个角色,名为s3crr_role_for_bucket-a_to_bucket-b,其中包含:

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

    然后我将一个文件上传到Bucket-A,它成功复制Bucket-B

    因此,该过程似乎运行良好。如果您遇到困难,一些想法是:

    【讨论】:

    • 谢谢约翰。我删除了源存储桶中的规则并重新创建了它。唯一的区别是我让流程创建角色并且确实有效!谢谢。有没有办法将现有文件同步到目标存储桶? IE。复制过程有效,但仅适用于新文件。那么源存储桶中已经存在的所有内容呢?
    • 不,它不会复制任何历史记录。您可以使用AWS Command-Line Interface (CLI)aws s3 sync s3://source-bucket/ s3://destination-bucket 来复制现有内容。
    【解决方案2】:

    当手动创建的相同策略失败时,让复制规则设置创建新的 IAM 角色也对我有用。在比较自动创建的角色和我手动创建的角色时,不同之处在于自动创建的工作角色是 service-role,而我的非工作角色是 instance-role

    仔细检查源存储桶上用于复制的 IAM 角色是服务角色还是常规角色,而不是实例配置文件角色。

    【讨论】:

      猜你喜欢
      • 2016-02-23
      • 2022-09-24
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多