當我在 Amazon S3 儲存貯體上執行同步命令時,為什麼會收到 ListObjectsV2 的存取遭拒錯誤?

上次更新日期:2021 年 11 月 1 日

我正在執行 aws s3 同步命令以將物件複製到或從 Amazon Simple Storage Service (Amazon S3) 儲存貯體中複製物件。但是,我叫用 ListObjectsV2 操作時出現存取遭拒錯誤。如何解決此錯誤?

簡短描述

當您執行 aws s3 sync 命令時,Amazon S3 會發出以下 API 呼叫:ListObjectsV2CopyObjectGetObjectPutObject

更具體來說,會發生以下情況:

1.    Amazon S3 列出來源和目標以檢查物件是否存在。

2.    Amazon S3 然後執行以下 API 呼叫:

儲存貯體到儲存貯體操作的 CopyObject 叫用
儲存貯體到本機操作的 GetObject
本機到儲存貯體操作的 PutObject

注意:此解決方案假設 GetObject 和 PutObject 叫用已授予 AWS Identity Access Management (IAM) 使用者或角色。此解決方案解決如何解決因不正確的 ListBucket 許可或使用不正確的 sync 命令語法與申請者付款而造成的拒絕存取錯誤。

解決方案

設定 IAM 政策

驗證在您將物件複製到或從中複製的 Amazon S3 儲存貯體上,您是否擁有 s3: ListBucket 的許可。您必須擁有此許可才能執行 ListObjectsV2 動作。

注意:s3:ListBucket 是允許使用者在儲存貯體中列出物件的許可名稱。ListObjectsV2 是在儲存貯體中列出物件的 API 呼叫的名稱。

如果 IAM 使用者或角色屬於另一個 AWS 帳戶,則請檢查 IAM 和儲存貯體政策是否允許 s3:ListBucket 動作。您必須擁有 IAM 政策和儲存貯體政策中 s3: ListBucket 的許可。

如果您的使用者或角色屬於儲存貯體擁有者的帳戶,則無需 IAM 和儲存貯體政策即可允許 s3:ListBucket。您僅需要其中一個來允許動作。

重要:如果 IAM 政策或儲存貯體政策已允許 s3:ListBucket 動作,則請檢查其他政策是否有陳述式明確拒絕該動作。明確拒絕陳述式會覆寫允許陳述式。

以下為授予存取權給 s3:ListBucketIAM 政策範例:

{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "Stmt1546506260896",
    "Action": "s3:ListBucket",
    "Effect": "Allow",
    "Resource": "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET"
  }]
}

以下為授予使用者 arn:aws:iam::123456789012:user/testusers3:ListBucket 的存取權的儲存貯體政策範例:

{
  "Id": "Policy1546414473940",
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "Stmt1546414471931",
    "Action": "s3:ListBucket",
    "Effect": "Allow",
    "Resource": "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET",
    "Principal": {
      "AWS": [
        "arn:aws:iam::123456789012:user/testuser"
      ]
    }
  }]
}

將同步指令與申請者付款搭配使用

如果您的儲存貯體屬於另一個 AWS 帳戶,並且啟用了申請者付款,請確認您的儲存貯體政策和 IAM 許可都授與 ListObjectsV2 許可。如果已正確授與 ListObjectsV2 許可,請檢查您的同步命令語法。使用同步命令時,您必須包含 --request-payer requester 選項。否則,您會收到「存取遭拒」錯誤。

例如:

aws s3 sync ./ s3://requester-pays-bucket/ --request-payer requester