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

1 分的閱讀內容
0

我正在執行 aws s3 sync 命令,將物件複製到 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:ListBucket 存取權的 IAM 政策範例:

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

以請求者付費方式使用 sync 命令

如果您的儲存貯體屬於另一個 AWS 帳戶,且已啟用請求者付費功能,請確認您的儲存貯體政策和 IAM 權限均授予 ListObjectsV2 權限。如果已正確授與 ListObjectsV2 權限,請檢查您的 sync 命令語法。使用 sync 命令時,必須包含 --request-payer requester 選項。否則,您會收到拒絕存取錯誤。

例如:

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

相關資訊

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

儲存貯體政策和使用者政策

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