権限要件が変更された場合、バケット ACL を変更すると、継承するすべてのオブジェクトの権限が自動的に同期され、ポリシーの一貫性が確保されます。明示的な ACL なしでアップロードされたオブジェクトは、デフォルトでバケット ACL 構成を継承します。
使用上の注意
バケットの所有者のみがバケットの ACL を変更できます。
バケットの ACL を変更すると、バケット ACL を継承するすべてのオブジェクトの ACL がそれに応じて変更されます。
オブジェクトをバケットにアップロードするときにオブジェクトの ACL を指定しない場合、オブジェクトの ACL はバケットの ACL を継承します。
ACL の種類
次の表は、バケット ACL の種類について説明しています。
ACL | 説明 |
public-read-write | 匿名ユーザーを含むすべてのユーザーが、バケットからデータを読み取り、バケットにデータを書き込むことができます。 警告 バケットの ACL を公開読み取り/書き込みに設定すると、すべてのユーザーがインターネット経由でバケット内のオブジェクトにアクセスし、バケットにデータを書き込むことができます。これにより、バケット内のデータへの不正アクセスや高額な費用が発生する可能性があります。ユーザーが禁止されているデータまたは情報をアップロードした場合、あなたの正当な利益と権利が侵害される可能性があります。したがって、必要な場合を除き、バケットの ACL を public-read-write に設定しないことをお勧めします。 |
public-read | バケット所有者のみがバケット内のオブジェクトにデータを書き込むことができます。匿名ユーザーを含む他のユーザーは、バケット内のオブジェクトを読み取るしかできません。 警告 これにより、バケット内のデータへの予期しないアクセスや予期せず高額な費用が発生する可能性があります。バケット ACL をこの値に設定する場合は注意してください。 |
private | バケット所有者のみがバケット内のオブジェクトからデータを読み取り、バケット内のオブジェクトにデータを書き込むことができます。他のユーザーはバケット内のオブジェクトにアクセスできません。これはデフォルト値です。 |
方法
OSS コンソールを使用する
OSS コンソール にログインします。
左側のナビゲーションウィンドウで、バケット をクリックします。[バケット] ページで、目的のバケットを見つけてクリックします。
左側のナビゲーションツリーで、権限管理 > [ACL] を選択します。
[ACL] タブで、設定 をクリックして、バケットの ACL を変更します。
設定 をクリックします。
ossbrowser を使用する
ossbrowser を使用して、OSS コンソールで実行できるのと同じバケットレベルの操作を実行できます。 ossbrowser の画面上の指示に従って、バケットの ACL を変更できます。詳細については、「一般的な操作」をご参照ください。
OSS SDK を使用する
次のサンプルコードは、一般的なプログラミング言語の OSS SDK を使用してバケットの ACL を変更する方法の例を示しています。他のプログラミング言語の OSS SDK を使用してバケットの ACL を変更する方法の詳細については、「概要」をご参照ください。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.CannedAccessControlList;
public class Demo {
public static void main(String[] args) throws Exception {
// この例では、中国 (杭州) リージョンのエンドポイントが使用されています。実際のエンドポイントを指定してください。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケットの名前を指定します。例: examplebucket。
String bucketName = "examplebucket";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// OSS クライアントインスタンスを作成します。
// OSS クライアントが不要になったら、shutdown メソッドを呼び出して関連付けられているリソースを解放します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// バケットの ACL を指定します。この例では、examplebucket バケットの ACL は private に設定されています。
ossClient.setBucketAcl(bucketName, CannedAccessControlList.Private);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}const OSS = require('ali-oss');
const client = new OSS({
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを oss-cn-hangzhou に設定します。
region: '<Your region>',
// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// バケットの名前を指定します。
bucket: 'yourBucketName',
});
async function putBucketACL() {
// バケットの ACL を private に設定します。
const acl = 'private'
try {
await client.putBucketACL('<Your Bucket Name>', acl)
} catch (error) {
console.log(error)
}
}
putBucketACL()#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS にアクセスするために使用されるアカウントに関する情報を初期化します。 */
/* バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
std::string Endpoint = "yourEndpoint";
/* バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。 */
std::string Region = "yourRegion";
/* バケットの名前を指定します。例: examplebucket。 */
std::string BucketName = "examplebucket";
/* ネットワークリソースなどのリソースを初期化します。 */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。 */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* バケットの ACL を private に設定します。 */
SetBucketAclRequest request(BucketName, CannedAccessControlList::Private);
auto outcome = client.SetBucketAcl(request);
if (outcome.isSuccess()) {
std::cout << " setBucketAcl successfully " << std::endl;
}
else {
/* 例外を処理します。 */
std::cout << "SetBucketAcl fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* ネットワークリソースなどのリソースを解放します。 */
ShutdownSdk();
return 0;
}#include "oss_api.h"
#include "aos_http_io.h"
/* バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
const char *endpoint = "yourEndpoint";
/* バケットの名前を指定します。例: examplebucket。 */
const char *bucket_name = "examplebucket";
/* バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。 */
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* char* 文字列を使用して、aos_string_t 型のデータを初期化します。 */
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 を使用して OSS にアクセスするかどうかを指定します。値 0 は、CNAME が使用されていないことを示します。 */
options->config->is_cname = 0;
/* タイムアウト期間などのネットワークパラメーターを構成します。 */
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* main() で aos_http_io_initialize メソッドを呼び出して、ネットワークリソースやメモリリソースなどのグローバルリソースを初期化します。 */
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* メモリを管理するためのメモリプールを作成します。 aos_pool_t は 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_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
/* char* データを aos_string_t 型のバケットに割り当てます。 */
aos_str_set(&bucket, bucket_name);
/* バケットの ACL を public-read (OSS_ACL_PUBLIC_READ) に設定します。 */
resp_status = oss_put_bucket_acl(oss_client_options, &bucket, OSS_ACL_PUBLIC_READ, &resp_headers);
if (aos_status_is_ok(resp_status)) {
printf("set bucket acl succeeded\n");
} else {
printf("set bucket acl failed\n");
}
/* メモリプールを解放します。この操作により、リクエストに割り当てられたメモリリソースが解放されます。 */
aos_pool_destroy(pool);
/* 割り当てられたグローバルリソースを解放します。 */
aos_http_io_deinitialize();
return 0;
}require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
// この例では、中国 (杭州) リージョンのエンドポイントが使用されています。実際のエンドポイントを指定してください。
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
access_key_id: ENV['OSS_ACCESS_KEY_ID'],
access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
// バケットの名前を指定します。例: examplebucket。
bucket = client.get_bucket('examplebucket')
bucket.acl = Aliyun::OSS::ACL::PUBLIC_READ
puts bucket.aclpackage main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// グローバル変数を定義します。
var (
region string // バケットが配置されているリージョン。
bucketName string // バケットの名前。
)
// コマンドラインパラメーターを初期化するために使用される init 関数を指定します。
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&bucketName, "bucket", "", "バケットの名前。")
}
func main() {
// コマンドラインパラメーターを解析します。
flag.Parse()
// バケットの名前が指定されているかどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// リージョンが指定されているかどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// デフォルトの構成を読み込み、認証情報プロバイダーとリージョンを指定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// バケットの ACL を構成するためのリクエストを作成します。
putRequest := &oss.PutBucketAclRequest{
Bucket: oss.Ptr(bucketName), // バケットの名前。
Acl: oss.BucketACLPrivate, // ACL を private に設定します。
}
// ACL を構成するための操作を実行します。
putResult, err := client.PutBucketAcl(context.TODO(), putRequest)
if err != nil {
log.Fatalf("failed to put bucket acl %v", err)
}
// 結果を表示します。
log.Printf("put bucket acl result: %#v\n", putResult)
// ACL を照会するためのリクエストを作成します。
getRequest := &oss.GetBucketAclRequest{
Bucket: oss.Ptr(bucketName), // バケットの名前
}
// ACL を照会するための操作を実行します。
getResult, err := client.GetBucketAcl(context.TODO(), getRequest)
if err != nil {
log.Fatalf("failed to get bucket acl %v", err)
}
// 結果を表示します。
log.Printf("get bucket acl result:%#v\n", getResult)
}
import argparse
import alibabacloud_oss_v2 as oss
# コマンドライン引数パーサーを作成し、説明情報を追加します
parser = argparse.ArgumentParser(description="put bucket acl sample")
# 必須のコマンドライン引数を追加します: region、bucket、acl
parser.add_argument('--region', help='バケットが配置されているリージョン。', required=True)
parser.add_argument('--bucket', help='バケットの名前。', required=True)
# オプションのコマンドライン引数を追加します: endpoint、他のサービスが OSS にアクセスするために使用するドメイン名を指定するために使用されます
parser.add_argument('--endpoint', help='他のサービスが OSS にアクセスするために使用できるドメイン名')
# 必須のコマンドライン引数を追加します: acl、バケットのアクセス許可 ACL を指定するために使用されます。例: private、public-read、public-read-write
parser.add_argument('--acl', help='バケットのアクセス許可 ACL を指定します。', required=True)
def main():
# コマンドライン引数を解析します
args = parser.parse_args()
# 環境変数から認証情報をロードします
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# SDK のデフォルト構成を使用します
cfg = oss.config.load_default()
# 認証情報プロバイダーを設定します
cfg.credentials_provider = credentials_provider
# リージョンを設定します
cfg.region = args.region
# endpoint が提供されている場合は、構成の endpoint を更新します
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# OSS クライアントを作成します
client = oss.Client(cfg)
# put_bucket_acl メソッドを呼び出して、バケット ACL を設定します
result = client.put_bucket_acl(oss.PutBucketAclRequest(
bucket=args.bucket,
acl=args.acl,
))
# リクエストのステータスコードとリクエスト ID を出力します
print(f'status code: {result.status_code}, request id: {result.request_id}')
# 指定されたバケットの ACL を取得します
result = client.get_bucket_acl(oss.GetBucketAclRequest(
bucket=args.bucket,
))
# 結果のステータスコード、リクエスト ID、および ACL 情報を出力します
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' acl: {result.acl},'
)
if __name__ == "__main__":
main()
<?php
// 依存ライブラリを読み込むために autoload ファイルを導入します。
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
// コマンドラインパラメーターの説明を指定します。
$optsdesc = [
"region" => ['help' => 'バケットが配置されているリージョン。', 'required' => True], // (必須) バケットが配置されているリージョンを指定します。
"endpoint" => ['help' => '他のサービスが OSS にアクセスするために使用できるドメイン名', 'required' => False], // (オプション) 他のサービスが OSS にアクセスするために使用できるエンドポイントを指定します。
"bucket" => ['help' => 'バケットの名前', 'required' => True], // (必須) バケットの名前を指定します。
];
// コマンドラインパラメーターを解析するために、長いオプションリストを生成します。
$longopts = \array_map(function ($key) {
return "$key:"; // 各パラメーターの末尾にコロン (:) を追加して、値が必要であることを示します。
}, array_keys($optsdesc));
// コマンドラインパラメーターを解析します。
$options = getopt("", $longopts);
// 必須パラメーターが構成されているかどうかを確認します。
foreach ($optsdesc as $key => $value) {
if ($value['required'] === True && empty($options[$key])) {
$help = $value['help'];
echo "Error: the following arguments are required: --$key, $help"; // 必須パラメーターが構成されていないことを指定します。
exit(1);
}
}
// コマンドラインパラメーターの値を取得します。
$region = $options["region"]; // バケットが配置されているリージョン。
$bucket = $options["bucket"]; // バケットの名前。
// 環境変数を使用して AccessKey ID と AccessKey シークレットを読み込みます。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
// SDK のデフォルトの構成を使用します。
$cfg = Oss\Config::loadDefault();
// 認証情報プロバイダーを指定します。
$cfg->setCredentialsProvider($credentialsProvider);
// リージョンを指定します。
$cfg->setRegion($region);
// エンドポイントが提供されている場合は、エンドポイントを指定します。
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]);
}
// OSSClient インスタンスを作成します。
$client = new Oss\Client($cfg);
// PutBucketAclRequest オブジェクトを作成し、バケット ACL を private に設定します。
$request = new Oss\Models\PutBucketAclRequest(
bucket: $bucket,
acl: Oss\Models\BucketACLType::PRIVATE);
// putBucketAcl メソッドを使用して、バケット ACL を指定します。
$result = $client->putBucketAcl($request);
// 結果を表示します。
printf(
'status code:' . $result->statusCode . PHP_EOL . // 返された HTTP ステータスコード。
'request id:' . $result->requestId // リクエストのリクエスト ID。これはリクエストの一意の識別子です。
);
ossutil を使用する
ossutil を使用して、バケットの ACL を構成できます。 ossutil のインストール方法の詳細については、「ossutil のインストール」をご参照ください。
次のコマンドを実行して、オブジェクトの ACL を private に設定します。
ossutil api put-bucket-acl --bucket examplebucket --acl private詳細については、「put-bucket-acl」をご参照ください。
関連 API 操作
上記で説明した操作は、基本的に RESTful API に基づいて実装されており、ビジネスで高度なカスタマイズが必要な場合は、直接呼び出すことができます。API を直接呼び出すには、コードに署名計算を含める必要があります。詳細については、「PutBucketAcl」をご参照ください。
よくある質問
Alibaba Cloud CDN から OSS への back-to-origin ルーティングのオリジンサーバーは、public-read または public-read-write バケットに制限されていますか?
いいえ、Alibaba Cloud CDN から OSS への back-to-origin ルーティングのオリジンサーバーは、public-read または public-read-write バケットに制限されていません。プライベートバケットを Alibaba Cloud CDN から OSS への back-to-origin ルーティングのオリジンサーバーとして構成することもできます。詳細については、「プライベート OSS バケットへのアクセスを構成する」をご参照ください。
参考資料
バケットポリシーまたは RAM ポリシーを使用して、バケット内の名前が特定のプレフィックスを含むオブジェクトに対する読み取り専用または書き込み専用権限など、ユーザーに長期的な詳細権限を付与できます。詳細については、「例」および「RAM ポリシーの一般的な例」をご参照ください。
Security Token Service ( STS ) によって提供される一時的なアクセス認証情報を使用して、バケット内のすべてのオブジェクトを一覧表示する権限など、ユーザーに短期間の詳細権限を付与できます。詳細については、「STS によって提供される一時的なアクセス認証情報を使用して OSS にアクセスする」をご参照ください。