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

.NET용 AWS SDK을 사용한 ACL 관리

리소스 생성 시 ACL 설정

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

예를 들어, 다음 C# 코드 예에서는 PUT Bucket 요청을 전송해 버킷을 생성한 뒤 PutObject 요청을 전송해 새 버킷에 새 객체를 넣습니다. 요청 시, 코드로 소유자의 전적인 제어 권한과 Amazon S3 Log Delivery 그룹의 쓰기 권한을 지정합니다. PutObject 호출에는 요청 본문의 객체 데이터와 요청 헤더의 ACL 권한이 포함되어 있습니다(PUT 객체 참조).

Copy
static string bucketName = "*** Provide existing bucket name ***"; static string newBucketName = "*** Provide a name for a new bucket ***"; static string newKeyName = "*** Provide a name for a new key ***"; IAmazonS3 client; client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1); // Retrieve ACL from one of the owner's buckets S3AccessControlList acl = client.GetACL(new GetACLRequest { BucketName = bucketName, }).AccessControlList; // Describe grant for full control for owner. S3Grant grant1 = new S3Grant { Grantee = new S3Grantee { CanonicalUser = acl.Owner.Id }, Permission = S3Permission.FULL_CONTROL }; // Describe grant for write permission for the LogDelivery group. S3Grant grant2 = new S3Grant { Grantee = new S3Grantee { URI = "http://acs.amazonaws.com/groups/s3/LogDelivery" }, Permission = S3Permission.WRITE }; PutBucketRequest request = new PutBucketRequest() { BucketName = newBucketName, BucketRegion = S3Region.US, Grants = new List<S3Grant> { grant1, grant2 } }; PutBucketResponse response = client.PutBucket(request); PutObjectRequest objectRequest = new PutObjectRequest() { ContentBody = "Object data for simple put.", BucketName = newBucketName, Key = newKeyName, Grants = new List<S3Grant> { grant1 } }; PutObjectResponse objectResponse = client.PutObject(objectRequest);

객체 업로드에 대한 자세한 내용은 Amazon S3 객체로 작업을 참조하십시오.

앞서 나온 코드 예에서, 각 S3Grant의 피부여자와 권한 내용을 명시적으로 식별합니다. 또는, 리소스 생성 시, 요청에 표준(사전정의한) ACL(미리 제공된 ACL 참조)을 지정할 수 있습니다. 다음 C# 코드 예에서는 객체를 생성하고 요청 시 LogDeliveryWrite 미리 제공된 ACL 지정, Log Delivery 그룹에 버킷에 대한 WRITE 및 READ_ACP 권한 부여를 지정합니다.

Copy
static string newBucketName = "*** Provide existing bucket name ***"; static string keyName = "*** Provide key name ***"; IAmazonS3 client; client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1); PutBucketRequest request = new PutBucketRequest() { BucketName = newBucketName, BucketRegion = S3Region.US, // Add canned ACL. CannedACL = S3CannedACL.LogDeliveryWrite }; PutBucketResponse response = client.PutBucket(request);

기본 REST API에 대한 자세한 정보는 PUT Bucket을 참조하십시오.

기존 리소스에 ACL 업데이트

AmazonS3Client.PutACL 메서드를 호출해 기존 객체나 버킷에 ACL을 설정할 수 있습니다. ACL 권한 목록으로 S3AccessControlList 클래스의 인스턴스를 생성하고, 그 목록을 PutACL 요청에 포함시킵니다.

다음 C# 코드 예에서는 AmazonS3Client.GetACL 메서드로 기존 ACL을 읽은 뒤 새 권한을 추가해 객체에 수정된 ACL을 설정합니다.

Copy
static string bucketName = "*** Provide existing bucket name ***"; static string keyName = "*** Provide key name ***"; IAmazonS3 client; client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1); // Retrieve ACL for object S3AccessControlList acl = client.GetACL(new GetACLRequest { BucketName = bucketName, Key = keyName }).AccessControlList; // Retrieve owner Owner owner = acl.Owner; // Clear existing grants. acl.Grants.Clear(); // First, add grant to reset owner's full permission // (previous clear statement removed all permissions). S3Grant grant0 = new S3Grant { Grantee = new S3Grantee { CanonicalUser = acl.Owner.Id } }; acl.AddGrant(grant0.Grantee, S3Permission.FULL_CONTROL); // Describe grant for permission using email address. S3Grant grant1 = new S3Grant { Grantee = new S3Grantee { EmailAddress = emailAddress }, Permission = S3Permission.WRITE_ACP }; // Describe grant for permission to the LogDelivery group. S3Grant grant2 = new S3Grant { Grantee = new S3Grantee { URI = "http://acs.amazonaws.com/groups/s3/LogDelivery" }, Permission = S3Permission.WRITE }; // Create new ACL. S3AccessControlList newAcl = new S3AccessControlList { Grants = new List<S3Grant> { grant1, grant2 }, Owner = owner }; // Set new ACL. PutACLResponse response = client.PutACL(new PutACLRequest { BucketName = bucketName, Key = keyName, AccessControlList = newAcl });

S3Grant 객체를 생성해 피부여자와 권한을 명시적으로 지정하는 대신, 요청에 미리 제공된 ACL을 지정할 수도 있습니다. 다음 C# 코드 예는 새 버킷에 미리 제공된 ACL을 설정합니다. 이 요청 샘플에서는 AuthenticatedRead 미리 제공된 ACL을 지정해 Amazon S3 Authenticated Users 그룹에 읽기 액세스 권한을 부여합니다.

Copy
static string newBucketName = "*** Provide new bucket name ***"; IAmazonS3 client; client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1); PutBucketRequest request = new PutBucketRequest() { BucketName = newBucketName, BucketRegion = S3Region.US, // Add canned ACL. CannedACL = S3CannedACL.AuthenticatedRead }; PutBucketResponse response = client.PutBucket(request);

예시

다음 C# 코드 예는 다음과 같이 작업을 수행합니다.

  • 버킷을 만듭니다. 요청 시 이 코드는 log-delivery-write 표준 ACL을 지정해 LogDelivery Amazon S3 그룹에 쓰기 권한을 부여합니다.

  • 버킷의 ACL을 읽습니다.

  • 기존 권한을 삭제하고 ACL에 새로운 권한을 추가합니다.

  • PutACL 요청을 호출해 버킷에 새로운 ACL을 추가합니다.

실행 예를 생성하고 테스트하는 방법에 대한 자세한 설명은 Amazon S3 .NET 코드 예시 실행을 참조하십시오.

Copy
using System; using System.Collections.Specialized; using System.Configuration; using Amazon.S3; using Amazon.S3.Model; using Amazon.S3.Util; using System.Collections.Generic; namespace s3.amazon.com.docsamples { class ManageACLs { static string bucketName = "*** Provide existing bucket name ***"; static string newBucketName = "*** Provide a name for a new bucket ***"; static string keyName = "*** Provide key name ***"; static string newKeyName = "*** Provide a name for a new key ***"; static string emailAddress = "*** Provide email address ***"; static IAmazonS3 client; public static void Main(string[] args) { try { using (client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1)) { // Add bucket (specify canned ACL). AddBucketWithCannedACL(newBucketName); // Get ACL on a bucket. GetBucketACL(bucketName); // Add (replace) ACL on an object in a bucket. AddACLToExistingObject(bucketName, keyName); Console.WriteLine("Example complete."); } } catch (AmazonS3Exception amazonS3Exception) { if (amazonS3Exception.ErrorCode != null && (amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId") || amazonS3Exception.ErrorCode.Equals("InvalidSecurity"))) { Console.WriteLine("Check the provided AWS Credentials."); Console.WriteLine("For service sign up go to http://aws.amazon.com/s3"); } else { Console.WriteLine( "Error occurred. Message:'{0}' when writing an object" , amazonS3Exception.Message); } } catch (Exception e) { Console.WriteLine(e.Message); } Console.WriteLine("Press any key to continue..."); Console.ReadKey(); } static void AddBucketWithCannedACL(string bucketName) { PutBucketRequest request = new PutBucketRequest() { BucketName = newBucketName, BucketRegion = S3Region.US, // Add canned ACL. CannedACL = S3CannedACL.LogDeliveryWrite }; PutBucketResponse response = client.PutBucket(request); } static void GetBucketACL(string bucketName) { GetACLResponse response = client.GetACL(new GetACLRequest { BucketName = bucketName }); // GetACLResponse response = client.GetACL(request); S3AccessControlList accessControlList = response.AccessControlList; //response.Dispose(); } static void AddACLToExistingObject(string bucketName, string keyName) { // Retrieve ACL for object S3AccessControlList acl = client.GetACL(new GetACLRequest { BucketName = bucketName, Key = keyName }).AccessControlList; // Retrieve owner Owner owner = acl.Owner; // Clear existing grants. acl.Grants.Clear(); // First, add grant to reset owner's full permission // (previous clear statement removed all permissions). S3Grant grant0 = new S3Grant { Grantee = new S3Grantee { CanonicalUser = acl.Owner.Id } }; acl.AddGrant(grant0.Grantee, S3Permission.FULL_CONTROL); // Describe grant for permission using email address. S3Grant grant1 = new S3Grant { Grantee = new S3Grantee { EmailAddress = emailAddress }, Permission = S3Permission.WRITE_ACP }; // Describe grant for permission to the LogDelivery group. S3Grant grant2 = new S3Grant { Grantee = new S3Grantee { URI = "http://acs.amazonaws.com/groups/s3/LogDelivery" }, Permission = S3Permission.WRITE }; // Create new ACL. S3AccessControlList newAcl = new S3AccessControlList { Grants = new List<S3Grant> { grant1, grant2 }, Owner = owner }; // Set new ACL. PutACLResponse response = client.PutACL(new PutACLRequest { BucketName = bucketName, Key = keyName, AccessControlList = newAcl }); // Get and print response. Console.WriteLine(client.GetACL(new GetACLRequest() { BucketName = bucketName, Key = keyName } )); } } }