我正在執行 aws s3 sync 命令,將物件複製到 Amazon Simple Storage Service (Amazon S3) 儲存貯體,或從中複製物件。但是,當我呼叫 ListObjectsV2 操作時,出現拒絕存取錯誤。如何解決此問題?
簡短說明
當您執行 aws s3 sync 命令時,Amazon S3 會發出以下的 API 呼叫: ListObjectsV2、CopyObject、GetObject 和 PutObject。
更明確地說,會發生下列情況:
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/testuser 對 s3: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
相關資訊
儲存貯體擁有者授予跨帳戶儲存貯體許可
儲存貯體政策和使用者政策