如何從另一個 AWS 帳戶複製 S3 物件?

上次更新日期:2022 年 1 月 7 日

我想要跨 AWS 帳戶複製 Amazon Simple Storage Service (Amazon S3) 物件。然後,我想確保目的地帳戶擁有複製的物件。我如何做到這一點?

解決方案

重要提示:Amazon S3 中的物件不再由上傳其的 AWS 帳戶自動擁有。依預設,任何新建立的儲存貯體現在均啟用了 Bucket owner enforced (強制執行儲存貯體擁有者) 設定。變更物件擁有者時,使用 Bucket owner enforced (強制執行儲存貯體擁有者) 設定也是最佳實務。但是,請注意,此選項將停用所有儲存貯體 ACL 和儲存貯體中任何對象上的 ACL。

透過 S3 物件擁有權中的 Bucket owner enforced (強制執行儲存貯體擁有者) 設定,Amazon S3 儲存貯體中的所有物件均會自動由儲存貯體擁有者所擁有。Bucket owner enforced (強制執行儲存貯體擁有者) 功能還可停用所有存取控制清單 (ACL),這簡化了 S3 中存放資料的存取管理。然而,對於現有的儲存貯體,除非您明確停用 ACL,Amazon S3 物件仍歸上傳該物件的 AWS 帳戶所擁有。若要變更現有儲存貯體中物件的物件擁有權,請參閱如何變更 S3 儲存貯體中公有物件的擁有權?

如果共享物件的現有方法需要使用 ACL,則要找出使用 ACL 來存取物件的主體。如需有關如何在停用任何 ACL 之前查看許可的詳細資訊,請參閲停用 ACL 的先決條件

如果您無法停用 ACL,請按照以下步驟取得物件的所有權,直到您可以調整儲存貯體政策為止:

1.    在來源帳戶中,建立 AWS Identity and Access Management (IAM) 客戶受管政策,該政策向 IAM 身分 (使用者或角色) 授予適當的許可。IAM 使用者必須具有從來源儲存貯體中擷取物件並將物件放回目的地儲存貯體的存取權限。您可以使用與下列內容類似的 IAM 政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::source-DOC-EXAMPLE-BUCKET",
                "arn:aws:s3:::source-DOC-EXAMPLE-BUCKET/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET",
                "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*"
            ]
        }
    ]
}

注意:此範例 IAM 政策僅包括在不同帳戶中列出物件和跨儲存貯體複製物件所需的最低許可。您必須根據自己的使用案例自訂允許的 S3 動作。例如,如果使用者必須複製具有物件標籤的物件,您還必須授予 s3:GetObjectTagging 的許可。如果遇到錯誤,請嘗試以管理員使用者身分執行這些步驟。

2.    在來源帳戶中,將客戶受管政策連接至要用於將物件複製到目的地儲存貯體的 IAM 身分

3.    在目的地帳戶中,將目的地儲存貯體上的 S3 物件擁有權設定為儲存貯體擁有者偏好。設定 S3 物件擁有權之後,將存取控制清單 (ACL) 設定為 bucket-owner-full-control 時上傳的新物件將自動由儲存貯體的帳戶擁有。

4.    在目的地帳戶中,修改目的地儲存貯體的儲存貯體政策,以授予來源帳戶上傳物件的許可。此外,在儲存貯體政策中包含一個條件,該條件要求上傳物件才能將 ACL 設定為 bucket-owner-full-control。您可以使用與下列內容類似的陳述式:

注意:destination-DOC-EXAMPLE-BUCKET 取代為目的地儲存貯體的名稱。然後,將 arn:aws:iam::222222222222:user/Jane 取代為來源帳戶中的 IAM 身分的 Amazon 資源名稱 (ARN)

{
    "Version": "2012-10-17",
    "Id": "Policy1611277539797",
    "Statement": [
        {
            "Sid": "Stmt1611277535086",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::222222222222:user/Jane"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        },
        {
            "Sid": "Stmt1611277877767",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::222222222222:user/Jane"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET"
        }
    ]
}

注意:此範例儲存貯體政策僅包括上傳具有所需 ACL 的物件所需的最低許可。您必須根據自己的使用案例自訂允許的 S3 動作。例如,如果使用者必須複製具有物件標籤的物件,您還必須授予 s3:GetObjectTagging 的許可

5.    設定 IAM 政策和儲存貯體政策之後,來源帳戶中的 IAM 身分必須將物件上傳至目的地儲存貯體。確保 ACL 設定為 bucket-owner-full-control。例如,來源 IAM 身分必須使用 --acl 選項執行 cp AWS CLI 命令

aws s3 cp s3://source-DOC-EXAMPLE-BUCKET/object.txt s3://destination-DOC-EXAMPLE-BUCKET/object.txt --acl bucket-owner-full-control

注意:如果您在執行 AWS CLI 命令時收到錯誤,請確保您使用的是最新版 AWS CLI

將 S3 物件擁有權設定為儲存貯體擁有者偏好後,使用 bucket-owner-full-control ACL 上傳的物件將自動由目的地儲存貯體的帳戶擁有。

重要:如果 S3 儲存貯體具有啟用了 AWS Key Management Service (AWS KMS) 的預設加密,您還必須修改 AWS KMS 金鑰許可。如需說明,請參閱我的 Amazon S3 儲存貯體具有使用自訂 AWS KMS 金鑰的預設加密。如何允許使用者從儲存貯體下載和上傳到儲存貯體?