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

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

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

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

例えば以下の C# コード例は、PUT Bucket リクエストを送信してバケットを作成し、その後 PutObject リクエストを送信して新しいオブジェクトを新しいバケットに入れます。リクエスト内で、所有者に対しては完全なコントロールを与え、Amazon S3 Log Delivery グループには WRITE アクセス許可を指定しています。PutObject 呼び出しには、リクエスト本文にオブジェクトデータが含まれ、リクエストヘッダーに ACL 許可が含まれます(PUT Object を参照)。

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 の更新

既存のオブジェクトまたはバケットで ACL を設定するには、AmazonS3Client.PutACL を呼び出します。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 を設定します。このリクエスト例は、既定 ACL AuthenticatedRead を指定し、読み取り許可を 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 } )); } } }