すらいむがあらわれた

こまんど >  たたかう  にげる

AWS SDK for .NETでS3上のファイルにOrigin Access Identityを設定する

AWS SDK for .NETで作成済みのOrigin Access IdentityをS3上のファイルに設定する方法です。
AWS Management Consoleや各種ツール(S3 foxなど)で設定することも可能ですが、大量のファイルに自動的にアクセス権を設定する場合は自分でプログラムを書くことになると思います。

S3上のファイルのアクセス権に関するAPIは以下です。

Amazon Simple Storage Service API Referenceより
Get Object ACL
http://docs.amazonwebservices.com/AmazonS3/latest/index.html?RESTObjectGETacl.html
オブジェクト(つまりファイル)に設定されているアクセス権の情報を取得します。

Put Object ACL
http://docs.amazonwebservices.com/AmazonS3/latest/index.html?RESTObjectPUTacl.html
オブジェクト(つまりファイル)のアクセス権を設定します。

そして、以下がAWS.SDK for .NETでこれらの操作を行うサンプルコードです。
https://gist.github.com/raw/713370/a7fadcb26dc3646096f84e26925b8bb5bb383e3e/SetAndGetS3AccessControlList.cs

・GetS3ACL
指定したオブジェクトのアクセス権の情報を取得。

                                                                                      • -

String filePath = "images/test.jpg";
GetACLRequest getACLRequest = new GetACLRequest();
getACLRequest
.WithBucketName(bucketName)
.WithKey(filePath);

                                                                                      • -

この場合、指定したS3バケット上の "images/test.jpg"というファイルのアクセス権を取得します。

・SetS3ACL
指定したオブジェクトのアクセス権を設定。

                                                                                      • -

S3AccessControlList acl = new S3AccessControlList();
S3Grantee grantee = new S3Grantee();
grantee.CanonicalUser = new Amazon.S3.Model.Tuple()
{
First = "User1 CanonicalUserId"
,
Second = "User1 Display Name"
};
acl.AddGrant(grantee, S3Permission.FULL_CONTROL);

S3Grantee grantee2 = new S3Grantee();
grantee2.CanonicalUser = new Amazon.S3.Model.Tuple()
{
First = "User2 CanonicalUserId"
,
Second = "User2 Display Name"
};
acl.AddGrant(grantee2, S3Permission.FULL_CONTROL);

                                                                                      • -

S3AccessControlList に S3Grantee を作って入れていきます。
S3GranteeのIDにはS3CanonicalUserIdを設定します。
DisplayNameには何を入れても設定では反映されません。ですがAWS SDK for .NETでは空白とNUllは受け付けないので何か名前を入れるようにします。
Put Object ACLのリファレンス(http://docs.amazonwebservices.com/AmazonS3/latest/index.html?RESTObjectPUTacl.html)では
DisplayName is optional and ignored in the request.
と記載されています。

                                                                                      • -

acl.Owner = new Owner()
.WithDisplayName("Owner Display Name")
.WithId("Owner CanonicalUserId");

                                                                                      • -

Ownerの情報も指定します。

                                                                                      • -

SetACLRequest setACLResuest = new SetACLRequest();

String filePath = "images/test.jpg";
setACLResuest
.WithKey(filePath)
.WithBucketName(bucketName)
.WithACL(acl);

                                                                                      • -

指定したS3バケット上の "images/test.jpg"というファイルにアクセス権を設定。