我會使用 Amazon Simple Storage Service (Amazon S3) 儲存貯體來儲存我的網站內容。其他 AWS 帳戶的使用者將網站物件上傳到我的儲存貯體。我的儲存貯體政策正確,但網站無法載入物件。
簡短說明
依預設,儲存貯體具有存取控制清單 (ACL) 時,您並不擁有其他 AWS 帳戶上傳到儲存貯體的物件。因此,您可能無法讀取物件。上傳的帳戶必須明確授予您 (儲存貯體擁有者) 物件的權限。
此外,儲存貯體政策不會套用至儲存貯體中的物件,該物件為其他帳戶所擁有。因此,授予您網站使用者讀取權的儲存貯體政策不會自動套用至其他帳戶上傳的物件。
若要修正此問題,請使用下列其中一種方法:
- 停用 S3 儲存貯體上的 ACL (最佳實務)。
- 讓物件擁有者授予物件公開讀取權。
- 讓物件擁有者授予您對物件的完整控制權。
解決方法
停用 S3 儲存貯體上的 ACL (最佳實務)
若要停用 Amazon S3 儲存貯體上的 ACL,請選擇強制執行的儲存貯體擁有者 物件擁有權設定。您套用此設定時,即會關閉 ACL,而且您會自動擁有儲存貯體中的物件,並對其具有完整控制權。即使是跨帳戶上傳的物件,此物件的擁有權也屬於儲存貯體擁有者。儲存貯體擁有者還會控制儲存貯體政策,該政策會授予套用至這些物件的讀取權。
先決條件
停用 ACL 之前,請參閱停用 ACL 的先決條件。
關閉 ACL
- 開啟 Amazon S3 主控台。
- 選擇「儲存貯體」,然後選取您想要套用「S3 物件擁有權」設定的儲存貯體名稱。
- 選擇「權限」索引標籤。
- 在「物件擁有權」下,選擇「編輯」。
- 在「物件擁有權」下,選擇「強制執行的儲存貯體擁有者」。
- 選擇「儲存」。
如果您的使用案例不允許您停用 ACL,則請使用下列其中一種替代方法。
讓物件擁有者授予物件公開讀取權
**注意事項:**如果您在執行 AWS CLI 命令時收到錯誤,請確定您使用的是最新版本的 AWS CLI。
上傳物件的帳戶可以授與物件公開讀取權。若要這麼做,請執行此 AWS Command Line Interface (AWS CLI) 命令:
aws s3api put-object-acl --bucket docexamplebucket --key example.jpg --acl public read
**注意事項:**將 --bucket 取代為儲存您網站內容的儲存貯體的名稱。
讓物件擁有者授予您對物件的完整控制權
物件擁有者可以自動授予儲存貯體擁有者對物件的完整控制權。若要這麼做,請在目的地儲存貯體上「開啟 S3 物件擁有權」。這樣會授予儲存貯體擁有者在物件擁有者上傳物件時的控制權,並包含 bucket-owner-full-control 標準 ACL。
在儲存貯體擁有者將其「S3 物件擁有權」設定為「偏好的儲存貯體擁有者」後,儲存貯體擁有者即可新增其他儲存貯體政策。這個額外的儲存貯體政策必須要求所有 Amazon S3 PUT 作業都包含 bucket-owner-full-control 標準 ACL。此 ACL 會授予儲存貯體擁有者對新物件的完整控制權。
若要授予儲存貯體擁有者對物件的完整控制權,上傳帳戶必須在物件上傳期間使用 CLI 語法:
aws s3api put-object --bucket docexamplebucket --key example.jpg --acl bucket-owner-full-control
儲存貯體擁有者現在擁有該物件,並且物件會繼承儲存貯體政策中設定的權限。
若為在啟用「S3 物件擁有權」之前上傳的現有物件,物件擁有者必須授予儲存貯體擁有者對物件的權限。然後,儲存貯體擁有者必須複製物件本身。
若要授予儲存貯體擁有者對物件的完整控制權,上傳帳戶必須使用 CLI 語法:
aws s3api put-object-acl --bucket docexamplebucket --key example.jpg --acl bucket-owner-full-control
若要繼承物件的物件擁有權,儲存貯體擁有者必須複製物件本身:
aws s3 cp s3://docexamplebucket/example.jpg s3://docexamplebucket/example.jpg --acl bucket-owner-full-control
儲存貯體擁有者現在擁有該物件,並且物件會繼承儲存貯體政策中設定的權限。
要求跨帳戶上傳授予儲存貯體擁有者對物件的完整控制權
若要要求從其他帳戶的所有上傳內容 (s3:PutObject) 授予儲存貯體擁有者完整物件控制權,請使用儲存貯體政策,如下所示:
{
"Id": "Policy1541018284691",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "RequireBucketOwnerFullControlOnPuts",
"Principal": {
"AWS": [
"arn:aws:iam::111122223333:user/iam_user"
]
},
"Action": [
"s3:PutObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::docexamplebucket/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
}
]
}
透過此儲存貯體政策,從其他帳戶 (111122223333) 的使用者僅可在使用者指定物件的 ACL 時上傳儲存貯體。物件的 ACL 必須授予儲存貯體擁有者完整控制權。然後,其他帳戶使用者必須上傳物件,例如在此命令中:
aws s3 cp path/to/local/file s3://docexamplebucket --acl bucket-owner-full-control
相關資訊
Amazon S3 如何授權請求
存取政策準則
設定網站存取的許可
利用使用者政策控制儲存貯體的存取權