메뉴
Amazon Simple Storage Service
개발자 안내서 (API Version 2006-03-01)

AWS SDK for Java을 사용한 ACL 관리

리소스 생성 시 ACL 설정

리소스(버킷과 객체) 생성 시, 요청에 AccessControlList를 추가해 권한을 부여(ACL(액세스 제어 목록) 개요 참조)할 수 있습니다. 각 권한의 피부여자와 권한 내용을 명시적으로 지정합니다.

예를 들어, 다음 Java 코드 조각은 PutObject 요청을 전송해 객체를 업로드합니다. 요청에서, 코드 조각에는 두 개의 AWS 계정과 Amazon S3 AllUsers 그룹에 부여하는 권한이 명시되어 있습니다. PutObject 호출에는 요청 본문의 객체 데이터와 요청 헤더의 ACL 권한이 포함되어 있습니다(PUT 객체 참조).

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 코드 조각은 버킷을 생성하고, 요청에 LogDeliveryWrite 미리 제공된 ACL을 지정해 Amazon S3 LogDelivery 그룹에 쓰기 권한을 허용합니다.

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 코드 조각은 setObjectAcl 메서드를 호출해 기존 객체에 ACL을 설정합니다.

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, 이메일 주소도 제공해야 합니다.

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()); } } }