如何授予對 Amazon S3 儲存貯體中某些物件的公開讀取存取權?
上次更新日期:2022 年 2 月 15 日
我希望我的 Amazon Simple Storage Service (Amazon S3) 儲存貯體中的某些物件可以公開讀取。但是,我不想變更同一儲存貯體中的其他物件的許可。我如何做到這一點?
簡短描述
透過以下方式之一授予公開讀取存取權:
- 使用 Amazon S3 主控台更新物件的存取控制清單 (ACL)
- 使用 AWS Command Line Interface (AWS CLI) 更新物件的 ACL
- 使用向特定物件標籤授予公開讀取存取權的儲存貯體政策
- 使用向特定字首授予公開讀取存取權的儲存貯體政策
重要提示:透過儲存貯體和物件 ACL 授予公開存取權並不適用於將 S3 物件擁有權設為 Bucket Owner Enforced (強制執行儲存貯體擁有者) 的儲存貯體。在大多數情況下,ACL 不需要授予許可給物件和儲存貯體。而是使用 AWS Identity Access and Management (IAM) 政策和 S3 儲存貯體政策來授予許可給物件和儲存貯體。
解決方式
使用 Amazon S3 主控台更新物件的 ACL
若要一次公開多個物件,請按照下列步驟操作:
警告:將多個物件設為公開後,無法選擇一次對多個物件復原此動作。若要移除公開存取,您必須進入 Amazon S3 主控台中的每個物件。然後,從物件的 Permissions (許可) 標籤,修改 Public access (公開存取)。您必須對要復原授予的公開存取的每個物件執行此動作。在設為公開之前,請務必仔細檢閱物件清單。
1. 開啟 Amazon S3 主控台。
2. 從儲存貯體清單中,選擇儲存貯體,其中含有您要更新的物件。
3. 導覽至包含物件的資料夾。
4. 從物件清單中,選取您要公開的所有物件。
5. 選擇 Actions (動作),然後選擇 Make public (公開)。
6. 在 Make public (公開) 對話方塊中,確認物件清單正確無誤。
7. 選擇 Make public (公開)。
若要公開個別物件,您可以重複上述程序,或按照下列步驟操作:
1. 從 Amazon S3 主控台中,選擇儲存貯體,其中含有您要更新的物件。
2. 導覽至包含物件的資料夾。
3. 選擇物件名稱上的連結,開啟物件。
4. 選擇 Permissions (許可) 標籤。
5. 選擇 Edit (編輯)。
6. 在 Everyone (所有人) 區段中,選取 Objects Read (物件讀取)。
7. 選取 I understand the effects of these changes on this object (我了解這些變更對這個物件的影響)。
8. 選擇 Save changes (儲存變更)。
使用 AWS CLI 主控台更新物件的 ACL
對於已存放在 Amazon S3 中的物件,您可以執行此命令來更新其 ACL 以進行公開讀取存取:
aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key exampleobject --acl public-read
注意:如果您在執行 AWS CLI 命令時收到錯誤,請確認您使用的是最新的 AWS CLI 版本。
或者,您可以執行此命令,將物件的完整控制權授予 AWS 帳戶擁有者,並將讀取存取權授予其他所有人:
注意:針對 --grant-full-control 的值,請輸入帳戶的正式使用者 ID。
aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key exampleobject --grant-full-control id="008exampleA45666666668889999008853" --grant-read uri=http://acs.amazonaws.com/groups/global/AllUsers
使用向特定物件標籤授予公開讀取存取權的儲存貯體政策
重要:在開始之前,請務必檢閱 S3 物件標記定價。
首先,請新增儲存貯體政策,對具有特定標籤的任何物件允許公開讀取存取。例如,此政策允許對使用鍵值對 public=yes 標記的任何物件進行公開讀取存取:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
"Condition": {
"StringEquals": {
"s3:ExistingObjectTag/public": "yes"
}
}
}
]
}
然後,將標籤新增至您想要公開讀取的物件。您可以使用 Amazon S3 主控台新增或管理物件標籤。或者,您可以使用 AWS CLI。
若要檢查物件是否存在任何現有標籤,請執行此 AWS CLI 命令:
aws s3api get-object-tagging --bucket DOC-EXAMPLE-BUCKET --key exampleobject
若要將標籤新增至沒有任何現有標籤的物件,請執行此命令:
警告:此命令會覆寫任何現有的物件標籤。
aws s3api put-object-tagging --bucket DOC-EXAMPLE-BUCKET --key exampleobject --tagging 'TagSet={Key=public,Value=yes}'
要將標籤新增至包含現有標籤的物件中,請執行以下命令。確保包括新的物件標籤,以及您想要保留的現有標籤。
aws s3api put-object-tagging --bucket DOC-EXAMPLE-BUCKET --key exampleobject --tagging 'TagSet=[{Key=public,Value=n},{Key=exampletag1,Value=one},{Key=exampletag2,Value=two}]'
新增物件標籤後,執行此命令以檢閱所有物件的標籤:
aws s3api get-object-tagging --bucket DOC-EXAMPLE-BUCKET --key exampleobject
使用向特定字首授予公開讀取存取權的儲存貯體政策
警告:以下儲存貯體政策授予對特定字首下所有物件的公開讀取存取。使用此儲存貯體政策之前,請確認您的使用案例支援字首中所有可公開存取的物件。
若要對特定物件字首授予公開讀取存取權,請新增儲存貯體政策,如下所示:
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"AddPerm",
"Effect":"Allow",
"Principal": "*",
"Action":["s3:GetObject"],
"Resource":["arn:aws:s3:::DOC-EXAMPLE-BUCKET/publicprefix/*"]
}
]
}
然後,將物件複製到具有公開讀取存取權的字首中。您可以透過執行類似於以下的命令,將物件複製到字首中:
aws s3 cp s3://DOC-EXAMPLE-BUCKET/exampleobject s3://DOC-EXAMPLE-BUCKET/publicprefix/exampleobject
注意:取決於物件的字首,複製物件不需要授予公開讀取存取權。