

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

このセクションでは、アクセスコントロールリスト (ACL) を使用して S3 バケットとオブジェクトのアクセス許可を管理する方法について説明します。リソース ACL に許可を追加するには、AWS マネジメントコンソール、AWS Command Line Interface (CLI)、REST API、または AWS SDK を使用します。

バケットに対するアクセス許可とオブジェクトに対するアクセス許可は相互に独立しています。オブジェクトはバケットからアクセス許可を継承しません。例えば、バケットを作成してユーザーに書き込みアクセスを許可した場合、そのユーザーから明示的にアクセスが許可されない限り、そのユーザーのオブジェクトにアクセスできません。

他の 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>

コンソールには、重複した被付与者のアクセス権限がまとめて表示されます。ACL の全リストを表示するには、Amazon S3 REST API、AWS CLI、または AWS SDK を使用します。

次の表は、Amazon S3 コンソールでバケットに設定できる ACL アクセス権限を示しています。


**バケットの Amazon S3 コンソールの ACL アクセス権限**  

| コンソールのアクセス権限 | ACL アクセス許可 | アクセス | 
| --- | --- | --- | 
| オブジェクト − リスト | READ | 被付与者がバケット内のオブジェクトをリストすることを許可します。 | 
| オブジェクト − 書き込み | WRITE | 被付与者がバケット内に新しいオブジェクトを作成できるようにします。既存のオブジェクトのバケット所有者およびオブジェクト所有者については、これらのオブジェクトの削除と上書きも許可します。 | 
| バケット ACL − 読み取り | READ\_ACP | 被付与者がバケット ACL を読み込むことを許可します。 | 
| バケット ACL − 書き込み | WRITE\_ACP | 被付与者が該当するバケットの ACL を書き込むことを許可します。 | 
| 全員 (パブリックアクセス): オブジェクト − リスト | READ | バケット内のオブジェクトに対するパブリック読み取りアクセス権を付与します。リストアクセス権を [Everyone (public access)] (全員 (パブリックアクセス)) に付与すると、世界中のユーザーがバケット内のオブジェクトにアクセスできます。 | 
| 全員 (パブリックアクセス) : バケット ACL − 読み取り | READ\_ACP | バケット ACL のパブリック読み取りアクセス権を付与します。[Everyone (public access)] (全員 (パブリックアクセス)) に読み取りアクセス権を付与すると、世界中のユーザーがバケット ACL にアクセスできます。 | 

ACL アクセス権限の詳細については、[アクセスコントロールリスト (ACL) の概要](acl-overview.md) を参照してください。

**重要**  
汎用バケットで S3 のオブジェクト所有者に [バケット所有者の強制] 設定を使用する場合は、ポリシーを使用して汎用バケットとその中のオブジェクトへのアクセスを許可する必要があります。バケット所有者強制設定が有効になっている場合、アクセスコントロールリスト (ACL) の設定または ACL の更新は失敗し、`AccessControlListNotSupported` エラーコードが返されます。ACL の読み取り要求は引き続きサポートされています。

**バケットに ACL アクセス許可を設定する**

1. AWS マネジメントコンソール にサインインし、Amazon S3 コンソール ([https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)) を開きます。

1. 左のナビゲーションペインで、**[汎用バケット]** を選択します。

1. [**Buckets (バケット)**] リストで、アクセス許可を設定するバケットの名前を選択します。

1. [**Permissions**] を選択します。

1. [**アクセスコントロールリスト**] で、[**編集**] を選択します。

   バケットに対する次の ACL アクセス許可を編集できます。

**オブジェクト**
   + **List (リスト)** − 被付与者がバケット内のオブジェクトをリストすることを許可します
   + **Write** (書き込み) – 被付与者がバケット内に新しいオブジェクトを作成できるようにします。既存のオブジェクトのバケット所有者およびオブジェクト所有者については、これらのオブジェクトの削除と上書きも許可します。

     S3 コンソールでは、S3 ログデリバリーグループとバケット所有者 (AWS アカウント) にのみ書き込みアクセスを許可できます。他の被付与者には、書き込みアクセスを許可しないことを強くお勧めします。ただし、書き込みアクセスを許可する必要がある場合は、AWS CLI、AWS SDK、または REST API を使用できます。

**バケット ACL**
   + **Read (読み込み)** − 被付与者がバケット ACL を読み込むことを許可します
   + **Write (書き込み)** − 被付与者が該当するバケットの ACL を書き込むことを許可します

1. バケット所有者の許可を変更するには、**バケット所有者 (AWS アカウント)**の横で、次の ACL アクセス権限を消去または選択します。
   + [**Objects (オブジェクト)**] − [**List (リスト)**] または [**Write (書き込み)**]
   + [**Bucket ACL (バケット 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 (バケット ACL)**] – [**Read (読み取り)**]
**警告**  
[**全員**] グループに S3 バケットへのパブリックアクセスを付与するときは注意が必要です。このグループにアクセスを付与すると、世界中のすべてのユーザーがバケットにアクセスできます。種類にかかわらず、S3 バケットへのパブリック書き込みアクセスは一切付与しないことを強くお勧めします。

1. AWS アカウント があれば誰でも許可を付与するか取り消すために、**認証済みユーザーグループ (AWS アカウント があれば誰でも可)** の横で、次の ACL アクセス権限を消去または選択します。
   + [**Objects (オブジェクト)**] – [**List (リスト)**]
   + [**Bucket ACL (バケット ACL)**] – [**Read (読み取り)**]

1. Amazon S3 がバケットにサーバーアクセスログを書き込むアクセス許可を付与または取り消すには、[**S3 log delivery group (S3 ログ配信グループ)**] で、次の ACL アクセス許可をクリアまたは選択します。
   + [**Objects (オブジェクト)**] – [**List (リスト)**] または [**Write (書き込み)**] 
   + [**Bucket ACL (バケット ACL)**] – [**Read (読み取り)**] または [**Write (書き込み)**] 

     バケットがアクセスログを受け取るターゲットバケットとして設定されている場合、バケットのアクセス許可は [**ログ配信**] グループのバケットへの書き込みアクセスを許可する必要があります。バケット上のサーバアクセスログ記録を有効にすると、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 (バケット ACL)**] – [**Read (読み取り)**] または [**Write (書き込み)**]
**警告**  
他の AWS アカウントに自分のリソースへのアクセスを許可した場合、その AWS アカウントはアカウント内のユーザーに許可を委任できることに注意してください。これは*クロスアカウントアクセス*と呼ばれています。クロスアカウントアクセスの使用については、[IAM ユーザーガイド](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)の*IAM ユーザーにアクセス許可を委任するロールの作成*を参照してください。

1. 別の AWS アカウント へのアクセスを削除するには、**他の AWS アカウント へのアクセス**で、**削除**を選択します。

1. 変更を保存するには、[**変更の保存**] を選択します。

## S3 コンソールを使用した、オブジェクトの ACL アクセス権限の設定
<a name="set-object-permissions"></a>

コンソールには、重複した被付与者のアクセス権限がまとめて表示されます。ACL の全リストを表示するには、Amazon S3 REST API、AWS CLI、または AWS SDK を使用します。次の表に、Amazon S3 コンソールでオブジェクト用に設定できる ACL アクセス権限を示します。


**オブジェクト用の Amazon S3 コンソールの ACL アクセス権限**  

| コンソールのアクセス権限 | ACL アクセス許可 | アクセス | 
| --- | --- | --- | 
| オブジェクト − 読み取り | READ | 被付与者がオブジェクトデータとそのメタデータを読み込むことを許可します。 | 
| オブジェクト ACL − 読み取り | READ\_ACP | 被付与者がオブジェクト ACL を読み込むことを許可します。 | 
| オブジェクト ACL − 書き込み | WRITE\_ACP | 被付与者が該当するオブジェクトの ACL を書き込むことを許可します | 

ACL アクセス権限の詳細については、[アクセスコントロールリスト (ACL) の概要](acl-overview.md) を参照してください。

**重要**  
汎用バケットで S3 のオブジェクト所有者に [バケット所有者の強制] 設定を使用する場合は、ポリシーを使用して汎用バケットとその中のオブジェクトへのアクセスを許可する必要があります。バケット所有者強制設定が有効になっている場合、アクセスコントロールリスト (ACL) の設定または ACL の更新は失敗し、`AccessControlListNotSupported` エラーコードが返されます。ACL の読み取り要求は引き続きサポートされています。

**オブジェクトに ACL アクセス権限を設定する**

1. AWS マネジメントコンソール にサインインし、Amazon S3 コンソール ([https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)) を開きます。

1. [**Buckets**] (バケット) リストで、オブジェクトが含まれるバケットの名前を選択します。

1. **オブジェクト**のリストで、アクセス許可を設定するオブジェクトの名前を選択します。

1. [**Permissions**] を選択します。

1. [アクセスコントロールリスト (ACL)] で、[**編集**] を選択します。

   オブジェクトに対する次の ACL アクセス許可を編集できます。

**オブジェクト**
   + **Read (読み込み)** − 被付与者がオブジェクトデータとそのメタデータを読み込むことを許可します

**オブジェクト ACL**
   + **読み込み (Read)** − 被付与者がオブジェクト ACL を読み込むことを許可します
   + **Write (書き込み)** − 被付与者が該当するオブジェクトの ACL を書き込むことを許可します S3 コンソールでは、バケット所有者 (AWS アカウント) にのみ書き込みアクセスを許可できます。他の被付与者には、書き込みアクセスを許可しないことを強くお勧めします。ただし、書き込みアクセスを許可する必要がある場合は、AWS CLI、AWS SDK、または REST API を使用できます。

1. 以下のオブジェクトのアクセス許可を管理できます。

   1. 

**オブジェクト所有者へのアクセス**

      *所有者*とは、AWS アカウントのルートユーザーであり、AWS Identity and Access Management IAM ユーザーではありません。ルートユーザーの詳細については、「*IAM ユーザーガイド*」の「[AWS アカウントのルートユーザー](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html)」を参照してください。

      所有者のオブジェクトアクセス許可を変更するには、**オブジェクト所有者へのアクセス**で、**お客様の AWS アカウント (所有者)** を選択します。

      変更するアクセス許可のチェックボックスをオンにして、[**保存**] を選択します。

   1. 

**その他の AWS アカウントのアクセス**

      別の AWS から AWS アカウント ユーザーに許可を与えるには、**他の AWS アカウント へのアクセス**で、**アカウントの追加**を選択します。[**Enter an ID**] (ID の入力) フィールドに、オブジェクトのアクセス許可を付与する AWS ユーザーの正規 ID を入力します。正規 ID の検索に関する詳細は、*Amazon Web Services 全般のリファレンス* の「[AWS アカウント 識別子](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html)」を参照してください。最大 99 人のユーザーを追加できます。

      ユーザーに付与するアクセス許可のチェックボックスをオンにして、[**保存**] を選択します。アクセス許可についての情報を表示するには、ヘルプアイコンを選択します。

   1. 

**パブリックアクセス**

      オブジェクトへのアクセスを一般のユーザー (世界中のすべてのユーザー) に許可するには、[**パブリックアクセス**] で [**全員**] を選択します。パブリックアクセス許可を付与すると、世界中の誰でもオブジェクトにアクセスできるようになります。

      付与するアクセス許可のチェックボックスをオンにして、[**保存**] を選択します。
**警告**  
[**Everyone (全員)**] グループに Amazon S3 オブジェクトへの匿名アクセスを付与するときは注意が必要です。このグループにアクセスを付与すると、世界中のすべてのユーザーがオブジェクトにアクセスできます。すべてのユーザーにアクセスを付与する必要がある場合は、[**Read objects (オブジェクトの読み取り)**] のみのアクセス許可を付与することを強くお勧めします。
[*全員*] グループにオブジェクト書き込み許可は付与**しない**ことを強くお勧めします。付与すると、すべてのユーザーに対して、オブジェクトの ACL アクセス許可を上書きすることが許可されます。

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

このセクションでは、バケットやオブジェクトでアクセスコントロールリスト (ACL) の付与を設定する方法の例を示します。

**重要**  
汎用バケットで S3 のオブジェクト所有者に [バケット所有者の強制] 設定を使用する場合は、ポリシーを使用して汎用バケットとその中のオブジェクトへのアクセスを許可する必要があります。バケット所有者強制設定が有効になっている場合、アクセスコントロールリスト (ACL) の設定または ACL の更新は失敗し、`AccessControlListNotSupported` エラーコードが返されます。ACL の読み取り要求は引き続きサポートされています。

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

このセクションでは、バケットやオブジェクトでアクセスコントロールリスト (ACL) の付与を設定する方法の例を示します。最初の例では、既定 ACL を使用するバケット (「[既定 ACL](acl-overview.md#canned-acl)」を参照) を作成します。次に、カスタムアクセス許可の付与のリストを作成して、既定の ACL をカスタム付与を含む ACL で置き換えます。2 番目の例では、`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 をクリアする
+ 2 つのアクセス許可として、所有者へのフルアクセスと、メールアドレスで識別されたユーザーへの 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 を指定し、バケットにログを書き込むアクセス許可をログ配信グループに付与します。  
 コード例を設定および実行する方法の詳細については、「*AWS SDK for .NET デベロッパーガイド*」の「[AWS SDK for .NET の開始方法](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html)」 を参照してください。  

```
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 をクリアする。
+ 2 つのアクセス許可として、所有者へのフルアクセスと、メールアドレスで識別されたユーザーへの WRITE\_ACP を追加する。
+ `PutAcl` リクエストを送信して ACL を保存する。
コード例を設定および実行する方法の詳細については、「*AWS SDK for .NET デベロッパーガイド*」の「[AWS SDK for .NET の開始方法](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html)」 を参照してください。  

```
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) ベースのアクセス許可を付与できます。デフォルトでは、すべてのオブジェクトがプライベートです。所有者だけがフルアクセスコントロールを持っています。新しいオブジェクトを追加するときに、個々の AWS アカウントに、または Amazon S3 であらかじめ定義されたグループに許可を付与できます。これらのアクセス許可は、オブジェクトのアクセスコントロールリスト (ACL) に追加されます。詳細については、[アクセスコントロールリスト (ACL) の概要](acl-overview.md) を参照してください。

この操作では、次の 2 つの方法のいずれかを使用してアクセス許可を付与できます。
+ **既定 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>

AWS CLI を使用した ACL の管理の詳細については、*AWS CLI Command Reference* の [put−bucket−acl](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-acl.html) を参照してください。

**重要**  
汎用バケットで S3 のオブジェクト所有者に [バケット所有者の強制] 設定を使用する場合は、ポリシーを使用して汎用バケットとその中のオブジェクトへのアクセスを許可する必要があります。バケット所有者強制設定が有効になっている場合、アクセスコントロールリスト (ACL) の設定または ACL の更新は失敗し、`AccessControlListNotSupported` エラーコードが返されます。ACL の読み取り要求は引き続きサポートされています。