Object Storage Service (OSS) では、バケットレベルのアクセス制御リスト (ACL) に加えて、オブジェクトレベルの ACL も提供しています。オブジェクトのアップロード時に ACL を設定したり、既存のオブジェクトの ACL をいつでも変更したりできます。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。OSS と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用します。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「初期化 (C SDK)」をご参照ください。
オブジェクトの ACL を設定するには、
oss:PutObjectAcl権限が必要です。オブジェクトの ACL をクエリするには、oss:GetObjectAcl権限が必要です。詳細については、「RAM ユーザーへのカスタムポリシーのアタッチ」をご参照ください。
ACL の種類
オブジェクトには、次の 4 種類の ACL があります:
オブジェクト ACL はバケット ACL よりも優先されます。たとえば、オブジェクトが公開読み取りに設定されている場合、そのオブジェクトを含むバケットが非公開であっても、匿名ユーザーを含むすべてのユーザーがそのオブジェクトを読み取ることができます。
権限の種類 | 説明 | 権限の値 |
バケットから継承 (デフォルト) | オブジェクトに ACL がない場合、そのバケットの ACL を継承します。 | OSS_ACL_DEFAULT |
非公開 | オブジェクト所有者のみがオブジェクトの読み書きを行えます。他のユーザーはオブジェクトにアクセスできません。 | OSS_ACL_PRIVATE |
公開読み取り | オブジェクト所有者のみがオブジェクトへの書き込みを行えます。匿名ユーザーを含むすべてのユーザーがオブジェクトを読み取ることができます。 警告 インターネット上のすべてのユーザーがオブジェクトにアクセスできます。これにより、データ漏洩や料金の増加につながる可能性があります。この権限は慎重に使用してください。 | OSS_ACL_PUBLIC_READ |
公開読み書き | 匿名ユーザーを含むすべてのユーザーがオブジェクトの読み書きを行えます。 警告 インターネット上のすべてのユーザーがこのオブジェクトにアクセスし、データを書き込むことができます。これにより、データ漏洩や料金の増加につながる可能性があります。悪意のあるユーザーがオブジェクトに不正な情報を書き込んだ場合、法的な権利が侵害される可能性があります。絶対に必要な場合を除き、公開読み書き権限を設定しないでください。 | OSS_ACL_PUBLIC_READ_WRITE |
サンプルコード
次のサンプルコードは、指定されたオブジェクトの ACL を設定および取得する方法を示しています:
#include "oss_api.h"
#include "aos_http_io.h"
/* yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
const char *endpoint = "yourEndpoint";
/* バケット名を指定します。例:examplebucket */
const char *bucket_name = "examplebucket";
/* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例:exampledir/exampleobject.txt */
const char *object_name = "exampledir/exampleobject.txt";
/* yourRegion を、バケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。 */
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* aos_string_t 型を char* 文字列で初期化します。 */
aos_str_set(&options->config->endpoint, endpoint);
/* 環境変数からアクセス認証情報を取得します。このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 */
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
// 次の 2 つのパラメーターも設定する必要があります。
aos_str_set(&options->config->region, region);
options->config->signature_version = 4;
/* CNAME を使用するかどうかを指定します。0 は CNAME を使用しないことを示します。 */
options->config->is_cname = 0;
/* タイムアウト期間などのネットワークパラメーターを設定します。 */
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* プログラムの入口で aos_http_io_initialize メソッドを呼び出して、ネットワークやメモリなどのグローバルリソースを初期化します。 */
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* メモリプール (pool) はメモリ管理に使用され、apr_pool_t と同等です。実装コードは apr ライブラリにあります。 */
aos_pool_t *pool;
/* 新しいメモリプールを作成します。2 番目のパラメーターは NULL で、新しいメモリプールが他のメモリプールから継承しないことを示します。 */
aos_pool_create(&pool, NULL);
/* オプションを作成して初期化します。このパラメーターには、endpoint、access_key_id、access_key_secret、is_cname、curl などのグローバル構成情報が含まれます。 */
oss_request_options_t *oss_client_options;
/* メモリプール内のオプションにメモリを割り当てます。 */
oss_client_options = oss_request_options_create(pool);
/* クライアントオプション oss_client_options を初期化します。 */
init_options(oss_client_options);
/* パラメーターを初期化します。 */
aos_string_t bucket;
aos_string_t object;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
oss_acl_e oss_acl = OSS_ACL_PRIVATE;
/* オブジェクトの ACL を設定します。 */
resp_status = oss_put_object_acl(oss_client_options, &bucket, &object, oss_acl, &resp_headers);
if (aos_status_is_ok(resp_status)) {
printf("put object acl success!\n");
} else {
printf("put object acl failed!\n");
}
/* オブジェクトの ACL を取得します。 */
aos_string_t oss_acl_string;
resp_status = oss_get_object_acl(oss_client_options, &bucket, &object, &oss_acl_string, &resp_headers);
if (aos_status_is_ok(resp_status)) {
printf("get object acl success!\n");
printf("acl: %s \n", oss_acl_string.data);
} else {
printf("get object acl failed!\n");
}
/* メモリプールを解放します。これにより、リクエスト中にリソースに割り当てられたメモリが解放されます。 */
aos_pool_destroy(pool);
/* 割り当てられたグローバルリソースを解放します。 */
aos_http_io_deinitialize();
return 0;
}関連ドキュメント
オブジェクトのアクセス権限を設定するために使用される API 操作の詳細については、「PutObjectACL」をご参照ください。
オブジェクトのアクセス権限を取得するために使用される API 操作の詳細については、「GetObjectACL」をご参照ください。