

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 設定 ACL
<a name="managing-acls"></a>

本節說明如何使用存取控制清單 (ACL) 來管理 S3 儲存貯體和物件的存取許可。您可以使用 AWS 管理主控台、 AWS Command Line Interface (CLI)、REST API 或 AWS SDKs 將授予新增至資源 ACL。

儲存貯體許可與物件許可各自互相獨立。物件不會繼承其儲存貯體的許可。例如，若您建立儲存貯體，並將寫入存取授予使用者，除非使用者明確授予存取權給您，否則您無法存取該使用者的物件。

您可以授予許可給其他 AWS 帳戶 使用者或預先定義的群組。您要授予許可的使用者或群組稱為「被授予者」**。根據預設，建立儲存貯體 AWS 帳戶 的 擁有者具有完整許可。

您每授予使用者或群組一項許可，就會在與儲存貯體相關聯的 ACL 中新增一個項目。ACL 會列出授予，其中指出被授予者及獲授予之許可。

S3 物件擁有權是一項 Amazon S3 儲存貯體層級設定，您可以用來同時控制上傳至儲存貯體之物件的擁有權，以及停用或啟用 ACL。根據預設，物件擁有權設定為「儲存貯體擁有者強制執行」設定，而且所有 ACL 都會停用。停用 ACL 時，儲存貯體擁有者會擁有儲存貯體中的所有物件，並使用存取管理政策專門管理對這些物件的存取。

 Amazon S3 中的大多數新式使用案例不再需要使用 ACL。建議您將 ACL 保持停用狀態，除非是在必須個別控制每個物件存取的情況。停用 ACL 後，您可以使用政策來控制對儲存貯體中所有物件的存取，無論是誰將物件上傳到您的儲存貯體。如需詳細資訊，請參閱[控制物件的擁有權並停用儲存貯體的 ACL](about-object-ownership.md)。

**重要**  
如果您的一般用途儲存貯體使用 S3 物件擁有權的儲存貯體擁有者強制執行設定，則您必須使用政策將存取權授予一般用途儲存貯體及其中的物件。在啟用儲存貯體擁有者強制執行設定的情況下，請求設定存取控制清單 (ACL) 或更新 ACL 失敗，並傳回 `AccessControlListNotSupported` 錯誤碼。仍支援讀取 ACL 的請求。

**警告**  
強烈建議您避免將寫入存取權授予**每個人 （公開存取）** 或**已驗證使用者群組 （所有已 AWS 驗證的使用者）** 群組。如需詳細資訊了解授予寫入存取權限對這些群組的影響，請參閱「[Amazon S3 預先定義的群組](acl-overview.md#specifying-grantee-predefined-groups)」。

## 使用 S3 主控台來設定儲存貯體的 ACL 許可
<a name="set-bucket-permissions"></a>

主控台會顯示重複被授予者的合併存取授予。若要查看 ACLs 的完整清單，請使用 Amazon S3 REST API AWS CLI或 AWS SDKs。

下表顯示您可以在 Amazon S3 主控台中為儲存貯體設定的 ACL 許可。


**儲存貯體的 Amazon S3 主控台 ACL 許可**  

| 主控台許可 | ACL 許可 | Access (存取) | 
| --- | --- | --- | 
| Objects (物件) – List (列出) | READ | 允許被授予者列出儲存貯體中的物件。 | 
| Objects (物件) - Write (寫入) | WRITE | 允許被授予者在儲存貯體中建立新物件。對於現有物件的儲存貯體和物件擁有者，還允許刪除和覆寫這些物件。 | 
| Bucket ACL (儲存貯體 ACL) - Read (讀取) | READ\_ACP | 允許被授予者讀取儲存貯體 ACL。 | 
| Bucket ACL (儲存貯體 ACL) - Write (寫入) | WRITE\_ACP | 允許被授予者寫入適用儲存貯體的 ACL。 | 
| 每個人（公開存取）：物件 - 列出 | READ | 對儲存貯體中的物件授予公開讀取存取權限。當您將列出存取權限授予每個人（公開存取權限）時，世界上的任何人都可以存取儲存貯體中的物件。 | 
| 每個人 (公開存取權限)：儲存貯體 ACL - 讀取 | READ\_ACP | 對儲存貯體 ACL 授予公開讀取存取權限。當您將讀取存取權限授予每個人（公開存取權限）時，世界上的任何人都可以存取儲存貯體 ACL。 | 

如需 ACL 許可的詳細資訊，請參閱[存取控制清單 (ACL) 概觀](acl-overview.md)。

**重要**  
如果您的一般用途儲存貯體使用 S3 物件擁有權的儲存貯體擁有者強制執行設定，則您必須使用政策將存取權授予一般用途儲存貯體及其中的物件。在啟用儲存貯體擁有者強制執行設定的情況下，請求設定存取控制清單 (ACL) 或更新 ACL 失敗，並傳回 `AccessControlListNotSupported` 錯誤碼。仍支援讀取 ACL 的請求。

**設定儲存貯體的 ACL 許可**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 的 Amazon S3 主控台。

1. 在左側導覽窗格中，選擇**一般用途儲存貯體**。

1. 在**儲存貯體**清單中，選擇要設定許可的儲存貯體名稱。

1. 選擇 **Permissions** (許可)。

1. 在 **Access control list** (存取控制清單) 下，選擇 **Edit** (編輯)。

   您可以編輯儲存貯體的下列 ACL 許可：

**物件**
   + **List** (清單) – 允許承授者列出儲存貯體中的物件。
   + **Write** (寫入) – 允許承授者在儲存貯體中建立新物件。對於現有物件的儲存貯體和物件擁有者，還允許刪除和覆寫這些物件。

     在 S3 主控台中，您只能將寫入存取權授予 S3 日誌交付群組和儲存貯體擁有者 （您的 AWS 帳戶)。強烈建議您不要授予其他承授者的寫入存取權。不過，如果您需要授予寫入存取權，您可以使用 、 AWS CLI開發套件或 REST API。 AWS SDKs 

**儲存貯體 ACL**
   + **Read** (讀取) – 允許承授者讀取儲存貯體 ACL。
   + **Write** (寫入) – 允許承授者寫入適用儲存貯體的 ACL。

1. 若要變更儲存貯體擁有者的許可，請在**儲存貯體擁有者 （您的 AWS 帳戶)** 旁清除或選取下列 ACL 許可：
   + **Objects (物件)** – **List (列出)** 或 **Write (寫入)**
   + **Bucket ACL (儲存貯體)** – **Read (讀取)** 或 **Write (寫入)**

   *擁有者*是指 AWS 帳戶根使用者，而不是 AWS Identity and Access Management IAM 使用者。如需根使用者的詳細資訊，請參閱《IAM 使用者指南》**中的 [AWS 帳戶根使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html)。

1. 若要授予或復原一般公眾 (網際網路上的所有人) 的許可，請在 **Everyone (public access) (所有人 (公開存取))** 旁邊，清除或從下列 ACL 許可中選取：
   + **Objects (物件)** – **List (列出)**
   + **Bucket ACL (儲存貯體)** – **Read (讀取)**
**警告**  
將 S3 儲存貯體的公開存取授予 **Everyone (每個人)** 群組時請小心。當您將存取授予此群組時，全世界的所有人都能存取您的儲存貯體。強烈建議您絕不要授予任何種類的 S3 儲存貯體公用寫入存取。

1. 若要授予或復原具有 之任何人的許可 AWS 帳戶，除了**已驗證使用者群組 （具有 的任何人 AWS 帳戶)** 之外，請清除或選取下列 ACL 許可：
   + **Objects (物件)** – **List (列出)**
   + **Bucket ACL (儲存貯體)** – **Read (讀取)**

1. 若要授予或復原 Amazon S3 將伺服器存取日誌寫入儲存貯體的許可，請在 **S3 log delivery group (S3 日誌交付群組)** 下，清除或從下列 ACL 許可中選取：
   + **Objects (物件)** – **List (列出)** 或 **Write (寫入)** 
   + **Bucket ACL (儲存貯體)** – **Read (讀取)** 或 **Write (寫入)** 

     如果儲存貯體設定為要接收存取日誌的目標儲存貯體，儲存貯體許可必須將儲存貯體的寫入存取授予 **Log Delivery (日誌交付)** 群組。當您啟用儲存貯體上的伺服器存取記錄日誌時，Amazon S3 主控台會將寫入存取權限授予您選擇接收日誌之目標儲存貯體的 **Log Delivery (日誌交付)** 群組。如需伺服器存取記錄日誌的詳細資訊，請參閱「[啟用 Amazon S3 伺服器存取記錄日誌](enable-server-access-logging.md)」。

1. 若要授予對另一個 的存取權 AWS 帳戶，請執行下列動作：

   1. 選擇 **Add grantee (新增承授者)**。

   1. 在 **Grantee** (被授予者) 方塊中，輸入其他 AWS 帳戶的正式 ID。

   1. 從下列 ACL 許可中選取：
      + **Objects (物件)** – **List (列出)** 或 **Write (寫入)**
      + **Bucket ACL (儲存貯體)** – **Read (讀取)** 或 **Write (寫入)**
**警告**  
當您授予資源的其他 AWS 帳戶 存取權時，請注意 AWS 帳戶 可以將他們的許可委派給其帳戶下的使用者。這稱為*跨帳戶存取*。如需有關使用跨帳戶存取的資訊，請參閱《IAM 使用者指南》**中的[建立角色將許可委派給 IAM 使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)。

1. 若要移除對另一個 的存取權 AWS 帳戶，請在其他 **的存取權 AWS 帳戶**下，選擇**移除**。

1. 若要儲存您所做的變更，請選擇 **Save changes (儲存變更)**。

## 使用 S3 主控台來設定物件的 ACL 許可
<a name="set-object-permissions"></a>

主控台會顯示重複被授予者的合併存取授予。若要查看 ACLs 的完整清單，請使用 Amazon S3 REST API AWS CLI或 AWS SDKs。下表顯示您可以在 Amazon S3 主控台中為物件設定的 ACL 許可。


**物件的 Amazon S3 主控台 ACL 許可**  

| 主控台許可 | ACL 許可 | Access (存取) | 
| --- | --- | --- | 
| 物件 - 讀取 | READ | 允許被授予者讀取物件資料及其中繼資料。 | 
| 物件 ACL - 讀取 | READ\_ACP | 允許被授予者讀取物件 ACL。 | 
| 物件 ACL - 寫入 | WRITE\_ACP | 允許被授予者寫入適用物件的 ACL | 

如需 ACL 許可的詳細資訊，請參閱[存取控制清單 (ACL) 概觀](acl-overview.md)。

**重要**  
如果您的一般用途儲存貯體使用 S3 物件擁有權的儲存貯體擁有者強制執行設定，則您必須使用政策將存取權授予一般用途儲存貯體及其中的物件。在啟用儲存貯體擁有者強制執行設定的情況下，請求設定存取控制清單 (ACL) 或更新 ACL 失敗，並傳回 `AccessControlListNotSupported` 錯誤碼。仍支援讀取 ACL 的請求。

**設定物件的 ACL 許可**

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

1. 在**儲存貯體**清單中，選擇包含該物件的儲存貯體名稱。

1. 在**物件**清單中，選擇您要設定許可的物件名稱。

1. 選擇**許可**。

1. 在 Access control list (ACL) (存取控制清單 (ACL)) 下，選擇 **Edit** (編輯)。

   您可以編輯物件的下列 ACL 許可：

**物件**
   + **Read** (讀取) – 允許承授者讀取物件資料及其中繼資料

**物件 ACL**
   + **Read** (讀取) – 允許承授者讀取物件 ACL。
   + **Write** (寫入) – 允許承授者寫入適用物件的 ACL。在 S3 主控台中，您只能將寫入存取權授予儲存貯體擁有者 （您的 AWS 帳戶)。強烈建議您不要授予其他承授者的寫入存取權。不過，如果您需要授予寫入存取權，您可以使用 、 AWS CLI開發套件或 REST API。 AWS SDKs 

1. 您可以管理下列項目的物件存取許可：

   1. 

**其他擁有者的存取**

      *擁有者*是指 AWS 帳戶根使用者，而不是 IAM AWS Identity and Access Management 使用者。如需根使用者的詳細資訊，請參閱《IAM 使用者指南》**中的 [AWS 帳戶根使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html)。

      若要變更擁有者的物件存取許可，請在**物件擁有者的存取**下，選擇** AWS 您的帳戶 （擁有者）**。

      選取您要變更之許可的核取方塊，然後選擇 **Save (儲存)**。

   1. 

**其他 的存取 AWS 帳戶**

      若要從不同的 將許可授予 AWS 使用者 AWS 帳戶，請在**其他 的存取 AWS 帳戶**下，選擇**新增帳戶**。在**輸入 ID** 欄位中，輸入您要授予物件許可 AWS 的使用者正式 ID。如需有關尋找正式 ID 的資訊，請參閱 中的[您的 AWS 帳戶 識別符](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html)*Amazon Web Services 一般參考*。您最多可以新增 99 個使用者。

      選取您要授予使用者之許可的核取方塊，然後選擇 **Save (儲存)**。若要顯示許可的相關資訊，請選擇說明圖示。

   1. 

**公用存取**

      若要將物件的存取權授予一般大眾 (全世界的所有人)，請在 **Public access (公開存取)** 下，選擇 **Everyone (每個人)**。授予公用存取許可表示全世界的所有人都能存取該物件。

      選取您要授予之許可的核取方塊，然後選擇 **Save (儲存)**。
**警告**  
將 Amazon S3 物件的匿名存取權授予**每個人**群組時請謹慎小心。當您將存取權授予此群組時，全世界任何人都能存取您的物件。若必須將存取權授予每個人，強烈建議您只授予 **Read objects (讀取物件)** 許可。
強烈建議您「不要」**將寫入物件許可授予 **Everyone (每個人) **群組。否則所有人都可覆寫物件的 ACL 許可。

## 使用 AWS SDKs
<a name="acl-using-sdk"></a>

此章節提供範例說明如何設定存取控制清單 (ACL) 授與給儲存貯體和物件。

**重要**  
如果您的一般用途儲存貯體使用 S3 物件擁有權的儲存貯體擁有者強制執行設定，則您必須使用政策將存取權授予一般用途儲存貯體及其中的物件。在啟用儲存貯體擁有者強制執行設定的情況下，請求設定存取控制清單 (ACL) 或更新 ACL 失敗，並傳回 `AccessControlListNotSupported` 錯誤碼。仍支援讀取 ACL 的請求。

------
#### [ Java ]

此章節提供範例說明如何設定存取控制清單 (ACL) 授與給儲存貯體和物件。第一個範例為以定義的 ACL (請參閱 [固定的 ACL](acl-overview.md#canned-acl)) 建立儲存貯體後，建立自訂許可授與名單，然後用含有自訂授與 ACL 取代定義的 ACL。第二個範例說明如何修改使用 `AccessControlList.grantPermission()` 法修改 ACL。

**Example 建立儲存貯體並指定授予 S3 日誌交付群組許可的固定 ACL**  
此為建立儲存貯體的範例。在此要求中，該範例指定了定義的 ACL 授與日誌傳遞群組許可，以寫入儲存貯體日誌。  

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

import java.io.IOException;
import java.util.ArrayList;

public class CreateBucketWithACL {

    public static void main(String[] args) throws IOException {
        Regions clientRegion = Regions.DEFAULT_REGION;
        String bucketName = "*** Bucket name ***";
        String userEmailForReadPermission = "*** user@example.com ***";

        try {
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withRegion(clientRegion)
                    .build();

            // Create a bucket with a canned ACL. This ACL will be replaced by the
            // setBucketAcl()
            // calls below. It is included here for demonstration purposes.
            CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName, clientRegion.getName())
                    .withCannedAcl(CannedAccessControlList.LogDeliveryWrite);
            s3Client.createBucket(createBucketRequest);

            // Create a collection of grants to add to the bucket.
            ArrayList<Grant> grantCollection = new ArrayList<Grant>();

            // Grant the account owner full control.
            Grant grant1 = new Grant(new CanonicalGrantee(s3Client.getS3AccountOwner().getId()),
                    Permission.FullControl);
            grantCollection.add(grant1);

            // Grant the LogDelivery group permission to write to the bucket.
            Grant grant2 = new Grant(GroupGrantee.LogDelivery, Permission.Write);
            grantCollection.add(grant2);

            // Save grants by replacing all current ACL grants with the two we just created.
            AccessControlList bucketAcl = new AccessControlList();
            bucketAcl.grantAllPermissions(grantCollection.toArray(new Grant[0]));
            s3Client.setBucketAcl(bucketName, bucketAcl);

            // Retrieve the bucket's ACL, add another grant, and then save the new ACL.
            AccessControlList newBucketAcl = s3Client.getBucketAcl(bucketName);
            Grant grant3 = new Grant(new EmailAddressGrantee(userEmailForReadPermission), Permission.Read);
            newBucketAcl.grantAllPermissions(grant3);
            s3Client.setBucketAcl(bucketName, newBucketAcl);
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it and returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

**Example 更新現有物件的 ACL**  
此範例示範更新物件的 ACL。範例會執行下列任務：  
+ 擷取物件的 ACL
+ 藉由移除所有現存許可來清除 ACL
+ 新增兩項許可：擁有者的完全存取許可和 WRITE\_ACP (請參閱[我可以授予哪些許可？](acl-overview.md#permissions)) 利用電子郵件地址辨別使用者。
+ 儲存 ACL 至物件中

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.AccessControlList;
import com.amazonaws.services.s3.model.CanonicalGrantee;
import com.amazonaws.services.s3.model.EmailAddressGrantee;
import com.amazonaws.services.s3.model.Permission;

import java.io.IOException;

public class ModifyACLExistingObject {

    public static void main(String[] args) throws IOException {
        Regions clientRegion = Regions.DEFAULT_REGION;
        String bucketName = "*** Bucket name ***";
        String keyName = "*** Key name ***";
        String emailGrantee = "*** user@example.com ***";

        try {
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withCredentials(new ProfileCredentialsProvider())
                    .withRegion(clientRegion)
                    .build();

            // Get the existing object ACL that we want to modify.
            AccessControlList acl = s3Client.getObjectAcl(bucketName, keyName);

            // Clear the existing list of grants.
            acl.getGrantsAsList().clear();

            // Grant a sample set of permissions, using the existing ACL owner for Full
            // Control permissions.
            acl.grantPermission(new CanonicalGrantee(acl.getOwner().getId()), Permission.FullControl);
            acl.grantPermission(new EmailAddressGrantee(emailGrantee), Permission.WriteAcp);

            // Save the modified ACL back to the object.
            s3Client.setObjectAcl(bucketName, keyName, acl);
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

------
#### [ .NET ]

**Example 建立儲存貯體並指定授予 S3 日誌交付群組許可的固定 ACL**  
此為建立儲存貯體的 C\# 範例。在此要求中，該程式碼也指定了定義的 ACL 授與日誌傳遞群組許可，以便在儲存貯體寫入日誌。  
 如需有關設定和執行程式碼範例的資訊，請參閱《[適用於 .NET 的 AWS SDK 開發人員指南》中的適用於 .NET 的 SDK 入門](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html)。 *AWS *  

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class ManagingBucketACLTest
    {
        private const string newBucketName = "*** bucket name ***"; 
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 client;

        public static void Main()
        {
            client = new AmazonS3Client(bucketRegion);
            CreateBucketUseCannedACLAsync().Wait();
        }

        private static async Task CreateBucketUseCannedACLAsync()
        {
            try
            {
                // Add bucket (specify canned ACL).
                PutBucketRequest putBucketRequest = new PutBucketRequest()
                {
                    BucketName = newBucketName,
                    BucketRegion = S3Region.EUW1, // S3Region.US,
                                                  // Add canned ACL.
                    CannedACL = S3CannedACL.LogDeliveryWrite
                };
                PutBucketResponse putBucketResponse = await client.PutBucketAsync(putBucketRequest);

                // Retrieve bucket ACL.
                GetACLResponse getACLResponse = await client.GetACLAsync(new GetACLRequest
                {
                    BucketName = newBucketName
                });
            }
            catch (AmazonS3Exception amazonS3Exception)
            {
                Console.WriteLine("S3 error occurred. Exception: " + amazonS3Exception.ToString());
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception: " + e.ToString());
            }
        }
    }
}
```

**Example 更新現有物件的 ACL**  
此 C\# 範例示範更新現有物件的 ACL。範例會執行下列任務：  
+ 擷取物件的 ACL。
+ 藉由移除所有現存許可來清除 ACL。
+ 新增兩項許可：擁有者的完全存取許可和 WRITE\_ACP 利用電子郵件地址辨別使用者。
+ 藉傳送 `PutAcl` 請求儲存 ACL。
如需有關設定和執行程式碼範例的資訊，請參閱《[適用於 .NET 的 AWS SDK 開發人員指南》中的適用於 .NET 的 SDK 入門](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html)。 *AWS *  

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class ManagingObjectACLTest
    {
        private const string bucketName = "*** bucket name ***"; 
        private const string keyName = "*** object key name ***"; 
        private const string emailAddress = "*** email address ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 client;
        public static void Main()
        {
            client = new AmazonS3Client(bucketRegion);
            TestObjectACLTestAsync().Wait();
        }
        private static async Task TestObjectACLTestAsync()
        {
            try
            {
                    // Retrieve the ACL for the object.
                    GetACLResponse aclResponse = await client.GetACLAsync(new GetACLRequest
                    {
                        BucketName = bucketName,
                        Key = keyName
                    });

                    S3AccessControlList acl = aclResponse.AccessControlList;

                    // Retrieve the owner (we use this to re-add permissions after we clear the ACL).
                    Owner owner = acl.Owner;

                    // Clear existing grants.
                    acl.Grants.Clear();

                    // Add a grant to reset the owner's full permission (the previous clear statement removed all permissions).
                    S3Grant fullControlGrant = new S3Grant
                    {
                        Grantee = new S3Grantee { CanonicalUser = owner.Id },
                        Permission = S3Permission.FULL_CONTROL
                        
                    };

                    // Describe the grant for the permission using an email address.
                    S3Grant grantUsingEmail = new S3Grant
                    {
                        Grantee = new S3Grantee { EmailAddress = emailAddress },
                        Permission = S3Permission.WRITE_ACP
                    };
                    acl.Grants.AddRange(new List<S3Grant> { fullControlGrant, grantUsingEmail });
 
                    // Set a new ACL.
                    PutACLResponse response = await client.PutACLAsync(new PutACLRequest
                    {
                        BucketName = bucketName,
                        Key = keyName,
                        AccessControlList = acl
                    });
            }
            catch (AmazonS3Exception amazonS3Exception)
            {
                Console.WriteLine("An AmazonS3Exception was thrown. Exception: " + amazonS3Exception.ToString());
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception: " + e.ToString());
            }
        }
    }
}
```

------

## 使用 REST API
<a name="acl-using-rest-api"></a>

Amazon S3 API 可讓您在建立儲存貯體或物件時設定 ACL。Amazon S3 也提供在現有儲存貯體或物件上設定 ACL 的 API。這些 API 提供下列方法來設定 ACL：
+ **使用請求標頭設定 ACL –** 當您傳送請求以建立資源 (儲存貯體或物件) 時，您可以使用請求標頭來設定 ACL。您可以使用這些標頭來指定固定的 ACL，或明確指定授予 (明確識別被授予者與許可)。
+ **使用請求內文設定 ACL –** 當您傳送請求以在現有的資源上設定 ACL 時，您可以在請求標頭或內文中設定 ACL。

如需有關 REST API 支援管理 ACL 的資訊，請參閱《Amazon Simple Storage Service API 參考》**中的下列章節：
+  [GetBucketAcl](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETacl.html) 
+  [PutBucketAcl](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTacl.html) 
+  [GetObjectAcl](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGETacl.html) 
+  [PutObjectAcl](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUTacl.html) 
+  [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html) 
+  [CreateBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUT.html) 
+  [CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html) 
+  [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadInitiate.html) 

**重要**  
如果您的一般用途儲存貯體使用 S3 物件擁有權的儲存貯體擁有者強制執行設定，則您必須使用政策將存取權授予一般用途儲存貯體及其中的物件。在啟用儲存貯體擁有者強制執行設定的情況下，請求設定存取控制清單 (ACL) 或更新 ACL 失敗，並傳回 `AccessControlListNotSupported` 錯誤碼。仍支援讀取 ACL 的請求。

### 存取控制清單 (ACL)-特定請求標頭
<a name="acl-headers-rest-api"></a>

您可以使用標頭，授予以存取控制清單 (ACL) 為基礎的許可。所有物件預設皆為私有。只有擁有者有完整的存取控制權。新增物件時，您可以將許可授予個人或 Amazon S3 定義的 AWS 帳戶 預先定義群組。然後，這些許可會新增至物件上的存取控制清單 (ACL)。如需詳細資訊，請參閱[存取控制清單 (ACL) 概觀](acl-overview.md)。

透過此操作，您可以使用下列兩種方法之一授與存取許可：
+ **固定的 ACL (`x-amz-acl`)** — Amazon S3 支援一組預先定義的 ACL，稱為固定的 ACL。每個固定的 ACL 都有一組預先定義的被授與者和許可。如需詳細資訊，請參閱[固定的 ACL](acl-overview.md#canned-acl)。
+ **存取許可** — 若要明確授予特定 AWS 帳戶 或 群組的存取許可，請使用下列標頭。每個標頭映射到 Amazon S3 在 ACL 中支援的特定許可。如需詳細資訊，請參閱[存取控制清單 (ACL) 概觀](acl-overview.md)。在標頭中，您指定取得特定許可的授與者清單。
  + x-amz-grant-read
  + x-amz-grant-write
  + x-amz-grant-read-acp
  + x-amz-grant-write-acp
  + x-amz-grant-full-control

## 使用 AWS CLI
<a name="using-acl-cli"></a>

如需使用 管理 ACLs 的詳細資訊 AWS CLI，請參閱《 *AWS CLI 命令參考*》中的 [put-bucket-acl](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-acl.html)。

**重要**  
如果您的一般用途儲存貯體使用 S3 物件擁有權的儲存貯體擁有者強制執行設定，則您必須使用政策將存取權授予一般用途儲存貯體及其中的物件。在啟用儲存貯體擁有者強制執行設定的情況下，請求設定存取控制清單 (ACL) 或更新 ACL 失敗，並傳回 `AccessControlListNotSupported` 錯誤碼。仍支援讀取 ACL 的請求。