Bucket tags are key-value pairs you attach to an OSS bucket to categorize buckets by team, environment, or project. Use them to filter costs in billing reports or enforce tag-based access policies.
Prerequisites
Before you begin, ensure that you have:
The OSS C++ SDK installed and initialized
An OSS bucket (for example,
examplebucket)The
OSS_ACCESS_KEY_IDandOSS_ACCESS_KEY_SECRETenvironment variables setThe required RAM permissions for the operations you plan to perform (see each operation below)
Usage notes
Each bucket supports up to 20 tags.
Tag keys and values must be UTF-8 encoded.
A tag key can be up to 64 characters. Keys are case-sensitive and cannot be empty. Keys cannot start with
http://,https://, orAliyun(these prefixes are case-insensitive).A tag value can be up to 128 characters and can be empty.
All examples use the public endpoint for the China (Hangzhou) region (
https://oss-cn-hangzhou.aliyuncs.com). To access OSS from another Alibaba Cloud service in the same region, use the internal endpoint instead.To create an
OSSClientinstance using a custom domain name or Security Token Service (STS), see Create an OSSClient instance.
Set bucket tags
Required permission: oss:PutBucketTagging
Only the bucket owner and RAM users or roles explicitly granted oss:PutBucketTagging can set bucket tags. Without this permission, OSS returns a 403 Forbidden error with the error code AccessDenied.
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
std::string Endpoint = "yourEndpoint"; // e.g., https://oss-cn-hangzhou.aliyuncs.com
std::string Region = "yourRegion"; // e.g., cn-hangzhou
std::string BucketName = "examplebucket";
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
// Load credentials from OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
// Build the tag set
SetBucketTaggingRequest request(BucketName);
Tag tag1("yourTagkey1", "yourTagValue1");
Tag tag2("yourTagkey2", "yourTagValue2");
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 success" << std::endl;
} else {
std::cout << "SetBucketTagging fail"
<< ", code: " << outcome.error().Code()
<< ", message: " << outcome.error().Message()
<< ", requestId: " << outcome.error().RequestId() << std::endl;
ShutdownSdk();
return -1;
}
ShutdownSdk();
return 0;
}Replace yourTagkey1, yourTagValue1, yourTagkey2, and yourTagValue2 with your actual tag keys and values.
Get bucket tags
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
std::string Endpoint = "yourEndpoint";
std::string Region = "yourRegion";
std::string BucketName = "examplebucket";
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
// Load credentials from OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
GetBucketTaggingRequest request(BucketName);
auto outcome = client.GetBucketTagging(request);
if (outcome.isSuccess()) {
std::cout << "GetBucketTagging success" << std::endl;
for (const auto& tag : outcome.result().Tagging().Tags()) {
std::cout << "key: " << tag.Key()
<< ", value: " << tag.Value() << std::endl;
}
} else {
std::cout << "GetBucketTagging fail"
<< ", code: " << outcome.error().Code()
<< ", message: " << outcome.error().Message()
<< ", requestId: " << outcome.error().RequestId() << std::endl;
ShutdownSdk();
return -1;
}
ShutdownSdk();
return 0;
}List buckets with a specified tag
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
std::string Endpoint = "yourEndpoint";
std::string Region = "yourRegion";
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
// Load credentials from OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
// Filter buckets by tag key and value
ListBucketsRequest request;
Tag tag1("yourTagkey1", "yourTagValue1");
request.setTag(tag1);
auto outcome = client.ListBuckets(request);
if (outcome.isSuccess()) {
std::cout << "ListBuckets success" << std::endl;
for (const auto& bucket : outcome.result().Buckets()) {
std::cout << "bucket name: " << bucket.Name() << std::endl;
}
} else {
std::cout << "ListBuckets fail"
<< ", code: " << outcome.error().Code()
<< ", message: " << outcome.error().Message()
<< ", requestId: " << outcome.error().RequestId() << std::endl;
ShutdownSdk();
return -1;
}
ShutdownSdk();
return 0;
}Delete all tags from a bucket
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
std::string Endpoint = "yourEndpoint";
std::string Region = "yourRegion";
std::string BucketName = "examplebucket";
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
// Load credentials from OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
// Calling DeleteBucketTagging without setTagging() removes all tags
DeleteBucketTaggingRequest request(BucketName);
auto outcome = client.DeleteBucketTagging(request);
if (outcome.isSuccess()) {
std::cout << "DeleteBucketTagging success" << std::endl;
} else {
std::cout << "DeleteBucketTagging fail"
<< ", code: " << outcome.error().Code()
<< ", message: " << outcome.error().Message()
<< ", requestId: " << outcome.error().RequestId() << std::endl;
ShutdownSdk();
return -1;
}
ShutdownSdk();
return 0;
}Delete specified tags from a bucket
To remove specific tags instead of all tags, pass a Tagging object that contains only the keys to delete.
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
std::string Endpoint = "yourEndpoint";
std::string Region = "yourRegion";
std::string BucketName = "examplebucket";
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
// Load credentials from OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
// Specify the tag keys to delete
DeleteBucketTaggingRequest request(BucketName);
Tagging tagging;
TagSet tagset;
Tag tag("project", "projectone");
tagset.push_back(tag);
tagging.setTags(tagset);
request.setTagging(tagging);
auto outcome = client.DeleteBucketTagging(request);
if (outcome.isSuccess()) {
std::cout << "DeleteBucketTagging success" << std::endl;
} else {
std::cout << "DeleteBucketTagging fail"
<< ", code: " << outcome.error().Code()
<< ", message: " << outcome.error().Message()
<< ", requestId: " << outcome.error().RequestId() << std::endl;
ShutdownSdk();
return -1;
}
ShutdownSdk();
return 0;
}Troubleshooting
403 Forbidden (AccessDenied) on SetBucketTagging or DeleteBucketTagging
Only the bucket owner and RAM users or roles explicitly granted oss:PutBucketTagging can set or delete bucket tags. If you receive a 403 AccessDenied error:
Verify that your RAM policy includes
oss:PutBucketTaggingfor the target bucket.Confirm you are using the correct AccessKey credentials for the authorized identity.
References
PutBucketTags — REST API reference for setting bucket tags
GetBucketTags — REST API reference for querying bucket tags
DeleteBucketTags — REST API reference for deleting bucket tags