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

2 分的閱讀內容
0

我想在 AWS 帳戶之間複製 Amazon Simple Storage Service (Amazon S3) 物件。然後,我想確保目的地帳戶具備已複製的物件。

解決方案

重要事項:上傳物件的 AWS 帳戶並非總是自動擁有 S3 內的物件。當您變更物件擁有權時,最佳做法是使用強制執行的儲存貯體擁有者設定。但是,此選項會關閉所有儲存貯體 ACL,以及您儲存貯體中任何物件的 ACL。

透過 S3 物件擁有權中強制執行的儲存貯體擁有者設定,相同儲存貯體擁有者會自動擁有 Amazon S3 儲存貯體中的所有物件。強制執行的儲存貯體擁有者功能也會關閉所有存取控制清單 (ACL)。這樣可簡化儲存於 Amazon S3 中資料的存取管理。但是,對於現有的儲存貯體,S3 物件仍然由上傳該物件的 AWS 帳戶所擁有,除非您明確關閉該 ACL

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

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

  1. 在來源帳戶中,建立 AWS Identity and Access Management (AWS 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 許可。如果您遇到錯誤,請嘗試以管理員使用者的身分執行這些步驟。

  1. 在來源帳戶中,將您想用於複製物件至目的地儲存貯體的客戶管理政策附加至該 IAM 身分

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

  3. 在目的地帳戶中,修改目的地儲存貯體的儲存貯體政策,以授予來源帳戶上傳物件的許可。此外,請在儲存貯體政策中納入一個條件,要求物件上傳時將 ACL 設定為 bucket-owner-full-control。您可以使用類似於下列範例的陳述式:

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

{
  "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 許可

  1. 設定 IAM 政策和儲存貯體政策後,來源帳戶中的 IAM 身分必須將物件上傳至目的地儲存貯體。請確認該 ACL 已設定為 bucket-owner-full-control。For example, the source IAM identity must run the cp AWS CLI command with the --acl option:
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 上傳的物件將由目的地儲存貯體帳戶擁有。

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

相關資訊

儲存貯體擁有者授予跨帳戶儲存貯體許可

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

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

AWS 官方
AWS 官方已更新 1 年前