メニュー
Amazon Simple Storage Service
開発者ガイド (API Version 2006-03-01)

AWS SDK for Java を使用した ACL の管理

リソースの作成時の ACL の設定

リソース(バケットとオブジェクト)の作成時に、リクエストに AccessControlList を追加して、アクセス許可を付与できます(「アクセスコントロールリスト(ACL)の概要」を参照)。アクセス許可ごとに、被付与者とアクセス許可を明示的に指定します。

例えば、次の Java コードは、オブジェクトをアップロードする PutObject リクエストを送信します。このリクエストでは、コードスニペットが 2 つの AWS アカウントと Amazon S3 AllUsers グループにアクセス許可を指定しています。PutObject 呼び出しには、リクエスト本文にオブジェクトデータが含まれ、リクエストヘッダーに ACL 許可が含まれます(PUT Object を参照)。

Copy
String bucketName = "bucket-name"; String keyName = "object-key"; String uploadFileName = "file-name"; AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider()); AccessControlList acl = new AccessControlList(); acl.grantPermission(new CanonicalGrantee("d25639fbe9c19cd30a4c0f43fbf00e2d3f96400a9aa8dabfbbebe1906Example"), Permission.ReadAcp); acl.grantPermission(GroupGrantee.AllUsers, Permission.Read); acl.grantPermission(new EmailAddressGrantee("user@email.com"), Permission.WriteAcp); File file = new File(uploadFileName); s3client.putObject(new PutObjectRequest(bucketName, keyName, file).withAccessControlList(acl));

オブジェクトのアップロードについては、Amazon S3 オブジェクトの使用 を参照してください。

前述のコードでは、各アクセス許可の付与で、被付与者とアクセス許可を明示的に識別しました。または、リソースの作成時に、リクエストに既定(定義済み)の ACL を指定できます(「既定 ACL 」を参照)。次の Java コードスニペットでは、バケットを作成し、Amazon S3 LogDelivery グループに書き込みアクセス許可を付与する既定 ACL LogDeliveryWrite をリクエストに指定します。

Copy
String bucketName = "bucket-name"; AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider()); s3client.createBucket(new CreateBucketRequest (bucketName).withCannedAcl(CannedAccessControlList.LogDeliveryWrite));

基本の REST API については、PUT Bucket を参照してください。

既存のリソースでの ACL の更新

既存のオブジェクトまたはバケットで ACL を設定できます。AccessControlList クラスのインスタンスを作成し、アクセス許可を付与し、適切な ACL 設定メソッドを呼び出します。次の Java コードは既存のオブジェクトに ACL を設定する setObjectAcl メソッドを呼び出します。

Copy
String bucketName = "bucket-name"; String keyName = "object-key"; AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider()); AccessControlList acl = new AccessControlList(); acl.grantPermission(new CanonicalGrantee("d25639fbe9c19cd30a4c0f43fbf00e2d3f96400a9aa8dabfbbebe1906Example"), Permission.ReadAcp); acl.grantPermission(GroupGrantee.AuthenticatedUsers, Permission.Read); acl.grantPermission(new EmailAddressGrantee("user@email.com"), Permission.WriteAcp); Owner owner = new Owner(); owner.setId("852b113e7a2f25102679df27bb0ae12b3f85be6f290b936c4393484beExample"); owner.setDisplayName("display-name"); acl.setOwner(owner); s3client.setObjectAcl(bucketName, keyName, acl);

注記

前述のコードでは、getObjectAcl メソッドを呼び出すことによって、オプションでまず既存の ACL を読み取り、それに新しい許可を追加し、修正した ACL をリソースに設定します。

被付与者とアクセス許可を明示的に指定することによってアクセス許可を付与する代わりに、リクエストに既定 ACL を指定することもできます。次の Java コードは、既存のオブジェクトに ACL を設定します。このリクエストでは、スニペットは規定 ACL AuthenticatedRead を指定し、読み取り許可を Amazon S3 Authenticated Users グループに付与します。

Copy
String bucketName = "bucket-name"; String keyName = "object-key"; AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider()); s3client.setObjectAcl(bucketName, keyName, CannedAccessControlList.AuthenticatedRead);

次の Java サンプルコードでは、最初にバケットを作成します。作成リクエストで public-read 既定 ACL を指定します。次に、AccessControlList インスタンスで ACL を取得し、許可をクリアし、新しい許可を AccessControlList に追加します。最後に、更新された AccessControlList を保存します。つまり、バケット ACL サブリソースを置き換えます。

次の Java コード例は、次のタスクを実行します。

  • バケットを作成します。このリクエストでは、log-delivery-write 既定 ACL を指定し、書き込み許可を LogDelivery Amazon S3 グループに付与します。

  • バケットの ACL を読み取ります。

  • 既存のアクセス許可をクリアし、ACL に新しいアクセス許可を追加します。

  • setBucketAcl を呼び出し、新しい ACL をバケットに追加します。

注記

次のコード例をテストするには、コードを更新して、証明書を提供し、さらにアクセス許可を付与したいアカウントの正規ユーザー ID と E メールアドレスも指定する必要があります。

Copy
import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.AccessControlList; import com.amazonaws.services.s3.model.Bucket; import com.amazonaws.services.s3.model.CannedAccessControlList; import com.amazonaws.services.s3.model.CanonicalGrantee; import com.amazonaws.services.s3.model.CreateBucketRequest; import com.amazonaws.services.s3.model.Grant; import com.amazonaws.services.s3.model.GroupGrantee; import com.amazonaws.services.s3.model.Permission; import com.amazonaws.services.s3.model.Region; public class ACLExample { private static String bucketName = "*** Provide bucket name ***"; public static void main(String[] args) throws IOException { AmazonS3 s3Client = new AmazonS3Client(new ProfileCredentialsProvider()); Collection<Grant> grantCollection = new ArrayList<Grant>(); try { // 1. Create bucket with Canned ACL. CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName, Region.US_Standard).withCannedAcl(CannedAccessControlList.LogDeliveryWrite); Bucket resp = s3Client.createBucket(createBucketRequest); // 2. Update ACL on the existing bucket. AccessControlList bucketAcl = s3Client.getBucketAcl(bucketName); // (Optional) delete all grants. bucketAcl.getGrants().clear(); // Add grant - owner. Grant grant0 = new Grant( new CanonicalGrantee("852b113e7a2f25102679df27bb0ae12b3f85be6f290b936c4393484beExample"), Permission.FullControl); grantCollection.add(grant0); // Add grant using canonical user id. Grant grant1 = new Grant( new CanonicalGrantee("d25639fbe9c19cd30a4c0f43fbf00e2d3f96400a9aa8dabfbbebe1906Example"), Permission.Write); grantCollection.add(grant1); // Grant LogDelivery group permission to write to the bucket. Grant grant3 = new Grant(GroupGrantee.LogDelivery, Permission.Write); grantCollection.add(grant3); bucketAcl.getGrants().addAll(grantCollection); // Save (replace) ACL. s3Client.setBucketAcl(bucketName, bucketAcl); } catch (AmazonServiceException ase) { System.out.println("Caught an AmazonServiceException, which" + " means your request made it " + "to Amazon S3, but was rejected with an error response" + " for some reason."); System.out.println("Error Message: " + ase.getMessage()); System.out.println("HTTP Status Code: " + ase.getStatusCode()); System.out.println("AWS Error Code: " + ase.getErrorCode()); System.out.println("Error Type: " + ase.getErrorType()); System.out.println("Request ID: " + ase.getRequestId()); } catch (AmazonClientException ace) { System.out.println("Caught an AmazonClientException, which means"+ " the client encountered " + "a serious internal problem while trying to " + "communicate with S3, " + "such as not being able to access the network."); System.out.println("Error Message: " + ace.getMessage()); } } }