如何授予對 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 儲存貯體政策來授予許可給物件和儲存貯體。

解決方式

重要:在開始之前,請確認您在帳戶層級儲存貯體層級沒有任何封鎖公開存取設定。您的設定不得阻止您公開物件。依預設,新的 S3 儲存貯體上的封鎖公開存取設定將設為 True

使用 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

注意:取決於物件的字首,複製物件不需要授予公開讀取存取權。


此文章是否有幫助?


您是否需要帳單或技術支援?