跳至內容

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

2 分的閱讀內容
0

我想要在 AWS 帳戶中複製 Amazon Simple Storage Service (Amazon S3) 物件,並確保目的地帳戶擁有複製的物件。

解決方法

注意: 如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,則請參閱對 AWS CLI 進行錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

上傳物件的 AWS 帳號不會自動擁有 Amazon S3 中的物件。當您變更 S3 物件擁有權設定時,最佳做法是使用強制執行的儲存貯體擁有者設定。強制執行的儲存貯體擁有者設定可簡化儲存在 Amazon S3 中的資料的存取管理。但是,此選項會關閉所有儲存貯體存取控制清單 (ACL),以及您儲存貯體中任何物件的 ACL。

使用 S3 物件擁有權中強制執行的儲存貯體擁有者設定時,相同儲存貯體擁有者會自動擁有 Amazon S3 儲存貯體中的所有物件。對於現有的儲存貯體,上傳 S3 物件的帳戶擁有該物件,除非您明確關閉 ACL

如果您現有的方法依賴 ACL 來共用物件,則請確認使用 ACL 存取物件的主體。如需詳細資訊,請參閱關閉 ACL 的先決條件

如果您無法關閉 ACL,請完成下列步驟以取得物件擁有權,直到您可以調整儲存貯體政策:

  1. 在來源帳戶中,建立一個 AWS Identity and Access Management (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 許可。如果您遇到權限錯誤,請以管理員使用者身分隔離 IAM 相關問題。

  2. 在來源帳戶中,將客戶管理政策附加到 IAM 身分

  3. 在目的地帳戶中,將目的地儲存貯體的 S3 物件擁有權設定為偏好的儲存貯體擁有者。目的地帳戶現在會自動擁有您上傳的新物件,並且 ACL 設定為 bucket-owner-full-control

  4. 在目的地帳戶中,修改目的地的儲存貯體政策,以授予來源帳戶上傳物件的權限。此外,請在儲存貯體政策中納入一個條件,要求物件上傳時將 ACL 設定為 bucket-owner-full-control
    範例政策:

    {
        "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"
            }
        ]
    }

    注意:destination-DOC-EXAMPLE-BUCKET 替換為目的地儲存貯體的名稱,並將 arn:aws:iam::222222222222:user/Jane 替換為來源帳戶的 IAM 身分的 ARN
    上述範例儲存貯體政策僅包含上傳具備所需 ACL 之物件的最低必要權限。根據您的使用案例自訂允許的 S3 動作。

  5. 確定 ACL 已設定為 bucket-owner-full-control,以便來源帳戶的 IAM 身分可以將物件上傳到目的地儲存貯體。例如,來源 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

    在上述範例中,該命令會複製檔案 object.txt。若要複製整個資料夾,請執行下列命令:

    aws s3 cp directory/ s3://bucketname/directory --recursive --acl bucket-owner-full-control
    

    注意: 如果您收到 **AccessDenied **錯誤,請參閱對 Amazon S3 中的拒絕存取 (403 禁止) 錯誤進行疑難排解

**重要:**如果您的 S3 儲存貯體具備已啟用預設加密的 AWS Key Management Service (AWS KMS),則您也必須修改 AWS KMS key 權限。如需指示,請參閱我的 Amazon S3 儲存貯體具備使用自訂 AWS KMS key 的預設加密。如何允許使用者從儲存貯體下載及上傳?

要在 S3 儲存貯體之間複製大量數據,請參閱將大量資料從一個 Amazon S3 儲存貯體傳輸到另一個儲存貯體的最佳方法是什麼? 另請參閱將大量資料上傳到 Amazon S3 時,如何將效能最佳化?

相關資訊

Amazon S3 儲存貯體政策的範例

範例 2: 儲存貯體擁有者授予跨帳戶儲存貯體權限

當物件由其他 AWS 帳戶上傳時,如何變更 Amazon S3 儲存貯體的物件擁有權?

使用資源型政策將存取權委派給另一個帳戶中的 Amazon S3 儲存貯體

AWS 官方已更新 10 個月前