このトピックでは、オブジェクトのアクセス制御リスト (ACL) を管理する方法について説明します。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。同じリージョン内の他の Alibaba Cloud サービスから Object Storage Service (OSS) にアクセスする場合は、内部エンドポイントを使用します。OSS のリージョンとエンドポイントの詳細については、リージョンとエンドポイントをご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、初期化をご参照ください。
オブジェクトの ACL を設定するには、
oss:PutObjectAcl権限が必要です。オブジェクトの ACL をクエリするには、oss:GetObjectAcl権限が必要です。詳細については、RAM ユーザーへのカスタムポリシーのアタッチをご参照ください。
ACL の種類
オブジェクトは、次の 4 種類のアクセス制御リスト (ACL) をサポートしています:
オブジェクトの ACL は、そのオブジェクトが格納されているバケットの ACL よりも優先されます。たとえば、非公開バケット内のオブジェクトの ACL が公開読み取りに設定されている場合、匿名ユーザーを含むすべてのユーザーがそのオブジェクトを読み取ることができます。
ACL の種類 | 説明 | 値 |
バケットから継承 (デフォルト) | オブジェクトは、それが格納されているバケットの ACL を継承します。これはオブジェクトのデフォルトの ACL です。 | CannedAccessControlList.Default |
非公開 | オブジェクトの読み取りと書き込みは、オブジェクト所有者のみが実行できます。他のユーザーはオブジェクトにアクセスできません。 | CannedAccessControlList.Private |
公開読み取り | オブジェクト所有者のみがオブジェクトへの書き込みを行えます。匿名ユーザーを含むすべてのユーザーがオブジェクトを読み取ることができます。 警告 これにより、バケット内のデータへの不正アクセスや高額な料金が発生する可能性があります。オブジェクトの ACL を公開読み取りに設定する際はご注意ください。 | CannedAccessControlList.PublicRead |
公開読み書き | 匿名ユーザーを含むすべてのユーザーがオブジェクトの読み書きを行えます。 警告 オブジェクトの ACL をこの値に設定すると、すべてのユーザーがインターネット経由でオブジェクトにアクセスし、データを書き込むことができます。これにより、バケット内のデータへの不正アクセスや高額な料金が発生する可能性があります。ユーザーが禁止されているデータや情報をバケットにアップロードした場合、お客様の正当な利益や権利が侵害される可能性があります。したがって、必要でない限り、バケットの ACL を公開読み書きに設定しないことを推奨します。 | CannedAccessControlList.PublicReadWrite |
サンプルコード
次のコードは、特定のオブジェクトの ACL を設定およびクエリする方法の例を示しています:
using Aliyun.OSS;
using Aliyun.OSS.Common;
// バケットが所在するリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
var endpoint = "yourEndpoint";
// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// バケット名を指定します。例:examplebucket。
var bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例:exampledir/exampleobject.txt。
var objectName = "exampleobject.txt";
// バケットが所在するリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。
const string region = "cn-hangzhou";
// ClientConfiguration インスタンスを作成し、要件に基づいてデフォルトのパラメーターを変更します。
var conf = new ClientConfiguration();
// 署名アルゴリズム V4 を使用します。
conf.SignatureVersion = SignatureVersion.V4;
// OSSClient インスタンスを作成します。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
c.SetRegion(region);
// オブジェクトの ACL を設定します。
try
{
// SetObjectAcl を呼び出して、オブジェクトの ACL を設定します。
client.SetObjectAcl(bucketName, objectName, CannedAccessControlList.PublicRead);
Console.WriteLine("Set Object:{0} ACL succeeded ", objectName);
}
catch (Exception ex)
{
Console.WriteLine("Set Object ACL failed with error info: {0}", ex.Message);
}
// オブジェクトの ACL をクエリします。
try
{
// GetObjectAcl を呼び出して、オブジェクトの ACL をクエリします。
var result = client.GetObjectAcl(bucketName, objectName);
Console.WriteLine("Get Object ACL succeeded, Id: {0} ACL: {1}",
result.Owner.Id, result.ACL.ToString());
}
catch (OssException ex)
{
Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID: {2}\tHostID: {3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}関連ドキュメント
オブジェクトの ACL を管理するために使用される完全なサンプルコードについては、GitHub をご参照ください。
オブジェクトの ACL を設定するために呼び出すことができる API 操作の詳細については、PutObjectACL をご参照ください。
オブジェクトの ACL をクエリするために呼び出すことができる API 操作の詳細については、GetObjectACL をご参照ください。