All Products
Search
Document Center

Object Storage Service:Bucket tagging (C++ SDK)

Last Updated:Mar 20, 2026

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_ID and OSS_ACCESS_KEY_SECRET environment variables set

  • The 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://, or Aliyun (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 OSSClient instance 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:PutBucketTagging for the target bucket.

  • Confirm you are using the correct AccessKey credentials for the authorized identity.

References