我正在執行 aws s3 sync 命令,將物件複製到 Amazon Simple Storage Service (Amazon S3) 儲存貯體,或從中複製物件。但是當我進行 ListObjectsV2 API 呼叫時,出現「存取遭拒」錯誤。
簡短說明
當您執行 sync 命令時,Amazon S3 會發出 ListObjectsV2 API 呼叫,以檢查物件是否存在於來源或目的地儲存貯體中。如果物件不存在於任何一個儲存貯體中,則 Amazon S3 會執行下列 API 呼叫:
- CopyObject 呼叫,用於儲存貯體到儲存貯體的作業
- GetObject,用於儲存貯體到本機的作業
- PutObject,用於本機到儲存貯體的作業
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱AWS CLI 錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
設定 IAM 政策
**注意:**此解決方法假設 GetObject 和 PutObject 動作已授與 AWS Identity Access Management (IAM) 使用者或角色。此解決方法可以處理如何解決不當的 ListBucket 權限,或請求者付費使用不正確 sync 命令語法時,所導致的「存取遭拒」錯誤。
請確認您在複製物件的來源和目的地 Amazon S3 儲存貯體上,擁有 s3:ListBucket 權限。您必須擁有此權限,才能執行 ListObjectsV2 API 呼叫動作。
如果您的 IAM 使用者或角色屬於另一個 AWS 帳戶,請檢查您的 IAM 和儲存貯體政策是否允許 s3:ListBucket 動作。您必須在 IAM 政策和儲存貯體政策上,同時擁有 s3:ListBucket 權限。
如果您的使用者或角色屬於儲存貯體擁有者的帳戶,則您不需要 IAM 和儲存貯體政策同時允許 s3:ListBucket。您只需要其中一項政策即可允許 s3:ListBucket 動作。
**重要:**如果 IAM 政策或儲存貯體政策已經允許 s3:ListBucket 動作,請檢查其他政策是否有明確拒絕該動作的陳述式。明確的拒絕陳述式會覆寫允許陳述式。
以下是 IAM 政策的範例,其中授與 s3:ListBucket 權限:
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "Stmt1546506260896",
"Action": "s3:ListBucket",
"Effect": "Allow",
"Resource": "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET"
}]
}
以下是儲存貯體政策的範例,其中授與使用者對 s3:ListBucket 的 arn:aws:iam::123456789012:user/testuser 權限:
{
"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 命令
如果您的儲存貯體屬於另一個帳戶,且已啟用請求者付費功能,請確認您的儲存貯體政策和 IAM 政策均授與 ListObjectsV2 權限。如果已正確授與 ListObjectsV2 權限,請檢查您的 sync 命令語法。如果您在執行 sync 命令時未包含 --request-payer requester 選項,便會出現「存取遭拒」錯誤。
舉例來說,您執行下列 sync 命令,但是用儲存貯體的名稱取代 requester-pays-bucket:
aws s3 sync ./ s3://requester-pays-bucket/ --request-payer requester
相關資訊
儲存貯體擁有者授予跨帳戶儲存貯體許可
Identity-based policies for Amazon S3