バケットタグは、プロジェクト、環境、またはチームごとに OSS バケットをグループ化するために、OSS バケットにアタッチするキーと値のペアです。タグ付けすると、Resource Access Management (RAM) ポリシーでこれらのタグを参照して、きめ細かなアクセスの制御を適用できます。これにより、どのユーザーがどのバケットのデータを読み書きできるかを制限します。
一般的な使用例:
アクセスの制御: バケットタグに基づいてアクセスを許可または拒否する RAM ポリシーを作成し、プロジェクト間のデータアクセスを防ぎます。
リソースのグループ化: 各バケットを開かずに、バケットの所有権を一目で識別します。
前提条件
開始する前に、以下があることを確認してください。
oss:PutBucketTagging権限、またはバケット所有者としてのアクセス
この権限を持たないユーザーは、403 ForbiddenとAccessDeniedエラーコードを伴う応答を受け取ります。
制限事項
| 制約事項 | 詳細 |
|---|---|
| バケットあたりの最大タグ数 | 20 |
| エンコーディング | UTF-8 |
| タグキーの長さ | 最大 64 文字。大文字と小文字を区別。空欄不可 |
| 制限付きキープレフィックス | http://、https://、および Aliyun(大文字・小文字を区別しない)で始まらないこと |
| タグ値の長さ | 最大 128 文字。空欄可 |
| リージョン属性のないバケット | 非対応 |
バケットへのタグ追加
OSS コンソールの使用
OSS コンソールにログインしてください。OSS コンソール
左側のナビゲーションウィンドウで、[バケット] をクリックします。バケットページで、対象のバケットを検索してクリックします。
左側のナビゲーションツリーで、バケット設定 > バケットタグ付け を選択します。
[バケットタグ付け] ページで、[タグの作成] をクリックします。
[+ Tag] をクリックし、タグキーと値を入力するか、既存のタグを選択します。複数のタグを追加するには、追加するタグごとに [+ Tag] をクリックします。
「[保存]」をクリックします。
OSS SDK の使用
以下のすべての例では、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数から認証情報をロードします。examplebucket およびリージョンを、実際の値に置き換えてください。
<details> <summary>Python</summary>
import argparse
import alibabacloud_oss_v2 as oss
parser = argparse.ArgumentParser(description="Put bucket tags")
parser.add_argument('--region', help='The region where the bucket is located.', required=True)
parser.add_argument('--bucket', help='The bucket name.', required=True)
parser.add_argument('--endpoint', help='Custom endpoint (optional).')
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint:
cfg.endpoint = args.endpoint
client = oss.Client(cfg)
result = client.put_bucket_tags(
oss.PutBucketTagsRequest(
bucket=args.bucket,
tagging=oss.Tagging(
tag_set=oss.TagSet(
tags=[
oss.Tag(key='test_key', value='test_value'),
oss.Tag(key='test_key2', value='test_value2'),
],
),
),
)
)
print(f'status code: {result.status_code}, request id: {result.request_id}')
if __name__ == "__main__":
main()</details>
<details> <summary>Java</summary>
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.SetBucketTaggingRequest;
public class Demo {
public static void main(String[] args) throws Exception {
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
EnvironmentVariableCredentialsProvider credentialsProvider =
CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
String bucketName = "examplebucket";
String region = "cn-hangzhou";
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
SetBucketTaggingRequest request = new SetBucketTaggingRequest(bucketName);
request.setTag("owner", "John");
request.setTag("location", "hangzhou");
ossClient.setBucketTagging(request);
} catch (OSSException oe) {
System.out.println("Error code: " + oe.getErrorCode());
System.out.println("Request ID: " + oe.getRequestId());
} catch (ClientException ce) {
System.out.println("Error: " + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}</details>
<details> <summary>Go</summary>
package 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
)
func init() {
flag.StringVar(®ion, "region", "", "The region where the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The bucket name.")
}
func main() {
flag.Parse()
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("bucket name is required")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("region is required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := oss.NewClient(cfg)
request := &oss.PutBucketTagsRequest{
Bucket: oss.Ptr(bucketName),
Tagging: &oss.Tagging{
&oss.TagSet{
[]oss.Tag{
{Key: oss.Ptr("k1"), Value: oss.Ptr("v1")},
{Key: oss.Ptr("k2"), Value: oss.Ptr("v2")},
{Key: oss.Ptr("k3"), Value: oss.Ptr("v3")},
},
},
},
}
result, err := client.PutBucketTags(context.TODO(), request)
if err != nil {
log.Fatalf("failed to put bucket tags: %v", err)
}
log.Printf("put bucket tags result: %#v\n", result)
}</details>
<details> <summary>PHP</summary>
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
$optsdesc = [
"region" => ['help' => 'The region where the bucket is located.', 'required' => true],
"endpoint" => ['help' => 'Custom endpoint (optional).', 'required' => false],
"bucket" => ['help' => 'The bucket name.', 'required' => true],
];
$longopts = array_map(fn($key) => "$key:", array_keys($optsdesc));
$options = getopt("", $longopts);
foreach ($optsdesc as $key => $value) {
if ($value['required'] && empty($options[$key])) {
echo "Error: --$key is required. " . $value['help'];
exit(1);
}
}
$region = $options["region"];
$bucket = $options["bucket"];
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider);
$cfg->setRegion($region);
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]);
}
$client = new Oss\Client($cfg);
$tagging = new Oss\Models\Tagging(
tagSet: new Oss\Models\TagSet(
tags: [
new Oss\Models\Tag(key: 'key1', value: 'value1'),
new Oss\Models\Tag(key: 'key2', value: 'value2'),
]
)
);
$request = new Oss\Models\PutBucketTagsRequest(bucket: $bucket, tagging: $tagging);
$result = $client->putBucketTags($request);
printf(
'status code: %s' . PHP_EOL .
'request id: %s' . PHP_EOL,
$result->statusCode,
$result->requestId
);</details>
<details> <summary>Node.js</summary>
const OSS = require('ali-oss');
const client = new OSS({
region: 'oss-cn-hangzhou',
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
bucket: 'examplebucket',
});
async function putBucketTags(bucketName, tags) {
try {
const result = await client.putBucketTags(bucketName, tags);
console.log(result);
} catch (e) {
console.log(e);
}
}
const tags = { owner: 'John', location: 'hangzhou' };
putBucketTags('examplebucket', tags);</details>
<details> <summary>C#</summary>
using Aliyun.OSS;
using Aliyun.OSS.Common;
var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
var bucketName = "examplebucket";
const string region = "cn-hangzhou";
var conf = new ClientConfiguration();
conf.SignatureVersion = SignatureVersion.V4;
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
var setRequest = new SetBucketTaggingRequest(bucketName);
setRequest.AddTag(new Tag { Key = "project", Value = "projectone" });
setRequest.AddTag(new Tag { Key = "user", Value = "jsmith" });
client.SetBucketTagging(setRequest);
Console.WriteLine("Bucket tags set successfully.");
}
catch (OssException ex)
{
Console.WriteLine("Error code: {0}, Message: {1}, RequestID: {2}",
ex.ErrorCode, ex.Message, ex.RequestId);
}
catch (Exception ex)
{
Console.WriteLine("Error: {0}", ex.Message);
}</details>
<details> <summary>C++</summary>
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
std::string Endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
std::string Region = "cn-hangzhou";
std::string BucketName = "examplebucket";
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
SetBucketTaggingRequest request(BucketName);
Tag tag1("key1", "value1");
Tag tag2("key2", "value2");
TagSet tagset;
tagset.push_back(tag1);
tagset.push_back(tag2);
Tagging tagging;
tagging.setTags(tagset);
request.setTagging(tagging);
auto outcome = client.SetBucketTagging(request);
if (outcome.isSuccess()) {
std::cout << "SetBucketTagging succeeded." << std::endl;
} else {
std::cout << "SetBucketTagging failed. Code: " << outcome.error().Code()
<< ", Message: " << outcome.error().Message()
<< ", RequestId: " << outcome.error().RequestId() << std::endl;
return -1;
}
ShutdownSdk();
return 0;
}</details>
他の言語の SDK の例については、「OSS SDK の概要」をご参照ください。
ossutil の使用
ossutil を使用してバケットタグを追加または更新する手順については、「バケットにタグを追加するか、バケットのタグを変更する」をご参照ください。
OSS API の使用
API を直接呼び出すには、リクエストに署名計算を含めます。詳細については、「PutBucketTags」をご参照ください。
例: プロジェクトごとの RAM ベースのアクセスの制御を適用する
各プロジェクトが専用の OSS バケットを使用する企業では、各バケットにプロジェクト名でタグ付けし、特定のタグに一致するバケットへのアクセスを制限する RAM ポリシーを作成できます。これにより、チームが誤って別のプロジェクトのバケットのデータを読み書きするのを防ぎます。ステップバイステップガイドについては、「特定のタグを持つバケット内のデータを読み書きするように RAM ユーザーを承認する」をご参照ください。
次のステップ
RAM ポリシーの一般的な例 – きめ細かなアクセスの制御のために RAM でバケットタグを使用する