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

上次更新日期:2021-05-19

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

解決方案

依預設,上傳 S3 物件的帳戶即為其擁有者。即使該目的地儲存貯體為另一帳戶擁有,亦是如此。物件擁有權對於使用儲存貯體政策管理許可非常重要。若要將儲存貯體政策套用於儲存貯體中的物件,物件必須由擁有該儲存貯體的帳戶擁有。

若要確保目的地帳戶擁有從其他帳戶複製的 S3 物件,請執行下列步驟:

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 金鑰的預設加密。如何允許使用者從儲存貯體下載和上傳到儲存貯體?