跳至內容

為什麼無法在兩個 Amazon S3 儲存貯體之間複製物件?

3 分的閱讀內容
0

我想將物件從一個 Amazon Simple Storage Service (Amazon S3) 儲存貯體複製到另一個儲存貯體,但我做不到。

解決方法

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

儲存貯體政策與 IAM 政策

若要在儲存貯體之間複製物件,請確保設定了正確的權限。若要在相同 AWS 帳戶中的儲存貯體之間複製物件,請使用 AWS Identity and Access Management (IAM) 政策來設定權限。若要在不同帳戶的儲存貯體之間複製物件,您必須在相關的 IAM 政策和儲存貯體政策中設定權限。

**注意:**有關如何修改儲存貯體政策的指示,請參閱使用 Amazon S3 主控台新增儲存貯體政策。有關如何修改 IAM 使用者的權限的指示,請參閱變更 IAM 使用者的權限。有關如何修改 IAM 角色權限的指示,請參閱更新角色權限

確認以下所需權限:

  • 您的 IAM 身分識別 (使用者或角色) 必須至少具有對來源儲存貯體執行 s3:GetObject 操作的權限。如果儲存貯體位於相同帳戶中,則使用您的 IAM 身分識別政策設定這些權限。您也可以在 S3 儲存貯體政策中明確允許該 IAM 身分識別。如果儲存貯體位於不同的帳戶中,則使用儲存貯體政策和 IAM 身分識別的政策設定這些權限。
  • 您的 IAM 身分識別必須至少具有對目的地儲存貯體執行 s3:PutObject 操作的權限。如果儲存貯體位於相同帳戶中,則使用您的 IAM 身分識別政策設定這些權限。您也可以在 S3 儲存貯體政策中明確允許該 IAM 身分識別。如果儲存貯體位於不同的帳戶中,則使用儲存貯體政策和 IAM 身分識別的政策設定這些權限。
  • 檢查相關的儲存貯體政策和 IAM 政策,確認沒有與您所需的權限相衝突的明確拒絕陳述式。明確的拒絕陳述式優先於允許陳述式
  • 對於特定作業,請確認您的 IAM 身分識別具有執行該作業中所有必要操作的權限。例如,若要執行命令 aws s3 cp,您需要擁有 s3:GetObjects3:PutObject 的權限。若要執行包含 --recursive 選項的 aws s3 cp 命令,您需要擁有 s3:GetObjects3:PutObjects3:ListBucket 的權限。若要執行命令 aws s3 sync,您需要擁有 s3:GetObjects3:PutObjects3:ListBucket 的權限。
    **注意:**如果您使用 AssumeRole API 作業存取 Amazon S3,請確認您正確設定了信任關係
  • 對於特定版本的作業,請確認您的 IAM 身分識別具有執行特定版本相關操作的權限。例如,若要複製物件的特定版本,您需要 s3:GetObjectVersions3:GetObject 的權限。
  • 若要複製包含物件標籤的物件,您的 IAM 身分識別必須擁有 s3:GetObjectTaggings3:PutObjectTagging 權限。您必須擁有來源物件的 s3:GetObjectTagging 權限以及目的地儲存貯體中物件的 s3:PutObjectTagging 權限。
  • 請檢查相關的儲存貯體政策和 IAM 政策,以確認 Resource 元素是否具有正確的路徑。對於儲存貯體級權限,Resource 元素必須指向一個儲存貯體。對於物件級權限,Resource 元素必須指向一個或多個物件。

例如,儲存貯體級操作 (如 s3:ListBucket) 的政策陳述式必須在 Resource 元素中指定儲存貯體:

"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET"

物件級操作 (如 s3:GetObjects3:PutObject) 的政策陳述式必須在 Resource 元素中指定一個或多個物件:

"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"

物件擁有權

如果儲存貯體政策已有正確的權限,但您仍無法在儲存貯體之間複製物件,請檢查該物件是由哪個帳戶擁有。儲存貯體政策僅適用於屬於儲存貯體擁有者的物件。屬於不同帳戶的物件,其存取控制清單 (ACL) 可能會有衝突的權限。

**注意:**物件擁有權和 ACL 問題通常發生在跨帳戶複製 AWS 服務日誌時。服務日誌的範例包括 AWS CloudTrail 日誌和 Elastic Load Balancing 存取日誌。

若要尋找擁有某個物件的帳戶,請依照以下步驟操作:

  1. 開啟 Amazon S3 console (Amazon S3 主控台)。
  2. 前往您無法在儲存貯體之間複製的物件所在位置。
  3. 選擇物件的 Permissions (權限) 索引標籤。
  4. 檢查 Grantee (承授者) 下的值。

如果您的帳戶擁有該物件,則在 Grantee (承授者) 下,Object owner (your AWS account) (物件擁有者 (您的 AWS 帳戶)) 的 Canonical ID (規範 ID) 會包含您的 AWS 帳戶。如果另一個帳戶擁有該物件且您可以存取該物件,則以下兩項屬實:

  • Object owner (your AWS account) (物件擁有者 (您的 AWS 帳戶)) 下的 Canonical ID (規範 ID) 包含外部帳戶。
  • Authenticated users group (anyone with an AWS account) (已驗證使用者群組 (任何擁有 AWS 帳戶者)) 下的 Canonical ID (規範 ID) 包含您的 AWS 帳戶。

如果另一個帳戶擁有您無法存取的物件,則 Object owner (your AWS account) (物件擁有者 (您的 AWS 帳戶)) 與其他承授者的 Canonical ID (規範 ID) 欄位皆為空。

如果無法在儲存貯體之間複製的物件歸另一個帳戶所有,則物件擁有者可以採取以下其中一項措施:

  • 物件擁有者可以授予儲存貯體擁有者對該物件的完整控制權。當儲存貯體擁有者擁有該物件後,儲存貯體政策將套用於該物件。作為安全最佳實務,儲存貯體擁有者可以關閉儲存貯體的 ACL,將物件擁有權設定為由儲存貯體擁有者強制執行。
  • 物件擁有者可以保留物件的擁有權,但必須將 ACL 更改為符合您使用案例要求的設定。

AWS KMS 加密

物件可能使用 AWS Key Management Service (KMS) key 加密。在這種情況下,請確認您的 IAM 身分識別對該金鑰具有正確的權限。如果您的 IAM 身分識別和 AWS KMS key 屬於同一帳戶,請確認您的金鑰政策授予了所需的 AWS KMS 權限

如果您的 IAM 身分識別和 AWS KMS key 屬於不同的帳戶,請確認金鑰和 IAM 政策均授予了所需的權限

例如,如果您在兩個儲存貯體之間複製物件 (並且每個儲存貯體都有自己的金鑰),則 IAM 身分識別必須指定以下權限:

  • kms:Decrypt 權限,指的是第一個 KMS 金鑰
  • kms:GenerateDataKeykms:Decrypt 權限,指的是第二個 KMS 金鑰

如需詳細資訊,請參閱 AWS KMS 中的金鑰政策AWS Key Management Service 的操作、資源和條件金鑰

Amazon Archive 儲存類別或 Amazon Glacier 和 Intelligent Archive 儲存類

您無法從 Amazon S3 Glacier 儲存類別複製物件。您必須先從 Amazon S3 Glacier 還原物件,然後才能複製該物件。如需指示,請參閱還原已封存的物件

儲存貯體上已啟用「請求者付款」功能

如果來源儲存貯體或目的地儲存貯體已啟用請求者付款功能,並且您想要從另一個帳戶存取該儲存貯體,請檢查您的請求設定。確保您的請求中包含正確的「請求者付款」參數

  • 對於 AWS Command Line Interface (AWS CLI) 命令,請加入 --request-payer 選項。
  • 對於 GET、HEAD 和 POST 請求,請加入 x-amz-request-payer: requester
  • 對於已簽署網址,請加入 x-amz-request-payer=requester

AWS Organizations 服務控制政策

如果您使用 AWS Organizations,請檢查服務控制政策,以確認其允許存取 Amazon S3。

例如,當您嘗試存取 Amazon S3 時,此政策會導致 403 Forbidden 錯誤。這是因為它明確拒絕存取:

{  
  "Version": "2012-10-17",  
  "Statement": [  
    {  
      "Effect": "Deny",  
      "Action": "S3:*",  
      "Resource": "*"  
    }  
  ]  
}

有關 AWS Organizations 功能的更多資訊,請參閱在您的組織中啟用所有功能

跨區域使用 Amazon S3 VPC 端點時的請求問題

Amazon S3 的 VPC 端點不支援跨不同 AWS 區域的請求。例如,假設您在區域 A 中有一個 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。此執行個體在其關聯的路由表中設定了一個虛擬私有雲端 (VPC) 端點。EC2 執行個體無法將物件從區域 B 複製到區域 A 中的儲存貯體。而您會收到類似以下範例的錯誤訊息:

"An error occurred (AccessDenied) when calling the CopyObject operation: VPC endpoints do not support cross-region requests"

若要對此跨區域請求問題進行疑難排解,請使用下列方法:

  • 從路由表中移除 VPC 端點。如果您移除 VPC 端點,則執行個體必須能夠連接到網際網路。
  • 從不使用 VPC 端點的另一個執行個體執行複製命令。或者,或者,您也可以從既不在區域 A 也不在區域 B 的執行個體執行複製命令。
  • 如果必須使用 VPC 端點,請先傳送 GET 請求,以將物件從來源儲存貯體複製到 EC2 執行個體。然後,傳送 PUT 請求,將物件從 EC2 執行個體複製到目的地儲存貯體。

相關資訊

複製、移動與重新命名物件

如何對來自 Amazon S3 的「403 Access Denied」錯誤進行疑難排解?

AWS 官方已更新 10 個月前