Object Storage Service (OSS) は、バケット内のオブジェクトを分類するためのオブジェクトタグ付けをサポートしています。同じタグを持つオブジェクトに対して、ライフサイクルルールとアクセス権限を設定できます。
タグ付けルール
オブジェクトタグは、オブジェクトをマークするために使用できるキーと値のペアです。オブジェクトのアップロード時または既存のオブジェクトにタグを追加できます。
オブジェクトには最大 10 個のタグを追加できます。タグのキーは一意である必要があります。
キーの長さは最大 128 文字、値の長さは最大 256 文字です。
キーと値では大文字と小文字が区別されます。
タグには、文字、数字、スペース、および次の特殊文字を含めることができます:
+‑=._:/。HTTP ヘッダーを使用してタグを設定する場合、タグのキーと値を URL エンコードする必要があります。
注意事項
バケットのオーナーと
oss:PutObjectTagging権限を付与された Resource Access Management (RAM) ユーザーのみがオブジェクトタグの読み取りと書き込みを行えます。単純なアップロード、マルチパートアップロード、追加アップロード、またはコピー操作中にオブジェクトにタグを追加できます。既存のオブジェクトにタグを追加することもできます。
オブジェクトにタグを追加すると、OSS はタグの時間単位の数に基づいて料金を請求します。詳細については、「オブジェクトタグ付け料金」をご参照ください。
オブジェクトのタグを変更しても、オブジェクトの最終更新日時は更新されません。
クロスリージョンレプリケーション中、ソースオブジェクトのタグも宛先バケットにコピーされます。
シナリオ
ライフサイクルルールでオブジェクトタグを使用する
定期的に生成され、長期保存を必要としないオブジェクトの場合、アップロード時にタグを追加できます。その後、ライフサイクルルールを使用してこれらのオブジェクトを定期的に削除し、ストレージコストを節約できます。たとえば、`dir1` プレフィックスと `key1:value1` タグを持つオブジェクトを最終更新日から 30 日後に削除するライフサイクルルールを設定できます。次のコードは設定例です:
<LifecycleConfiguration> <Rule> <ID>rule1</ID> <Prefix>dir1</Prefix> <Tag><Key>key1</Key><Value>value1</Value></Tag> <Status>Enabled</Status> <Expiration> <Days>30</Days> </Expiration> </Rule> </LifecycleConfiguration>特定のタグを持つオブジェクトにアクセスする権限を RAM ユーザーに付与する
たとえば、次の RAM ポリシーを設定して、`key2:value2` タグを持つオブジェクトにアクセスする権限を RAM ユーザーに付与できます。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:GetObject", "Resource": "*", "Condition": { "StringEquals": { "oss:ExistingObjectTag/key2": [ "value2" ] } } } ] }また、特定のタグを持つオブジェクトへのデータ書き込み権限やオブジェクト情報の表示権限など、他の権限 (`Action`) をユーザーに付与することもできます。RAM ポリシーでサポートされているアクションの詳細については、「RAM ポリシー」をご参照ください。
メソッド
OSS コンソールを使用する
OSS コンソールにログインします。
左側のナビゲーションウィンドウで、バケット をクリックします。[バケット] ページで、目的のバケットを見つけてクリックします。
左側のナビゲーションツリーで、オブジェクト管理 > オブジェクト を選択します。
オブジェクトにタグを追加します。
タグを追加するオブジェクトを選択します。
バケットのバージョン管理が無効になっている場合
オブジェクトの [操作] 列で、
> タグ を選択します。バケットのバージョン管理が有効になっている場合
オブジェクトバージョンの [操作] 列で、
> タグ を選択します。
タグ パネルで、タグ付けルールに基づいてタグの キー と 値 を指定します。
OK をクリックします。
Alibaba Cloud SDK を使用する
次のコードは、ソフトウェア開発キット (SDK) を使用して単純なアップロード中にオブジェクトタグを設定する方法の例を示しています。他の SDK を使用した単純なアップロード、マルチパートアップロード、追加アップロード、およびコピー操作中にオブジェクトタグを設定する方法の詳細については、「SDK の概要」をご参照ください。
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
import java.io.ByteArrayInputStream;
import java.util.HashMap;
import java.util.Map;
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.common.comm.SignVersion;
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";
// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例: exampledir/exampleobject.txt。
String objectName = "exampledir/exampleobject.txt";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// OSSClient インスタンスを作成します。
// OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
Map<String, String> tags = new HashMap<String, String>();
// オブジェクトタグのキーと値を指定します。たとえば、キーを owner に、値を John に設定します。
tags.put("owner", "John");
tags.put("type", "document");
// HTTP ヘッダーにタグ情報を設定します。
ObjectMetadata metadata = new ObjectMetadata();
metadata.setObjectTagging(tags);
// ファイルのアップロード時にタグ情報を設定します。
String content = "<yourtContent>";
ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()), metadata);
} 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: 'yourregion',
// 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// バケット名を指定します。
bucket: 'yourbucketname'
});
// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。
const objectName = 'exampledir/exampleobject.txt'
// ローカルファイルの完全なパスを指定します。例: D:\\localpath\\examplefile.txt。
// デフォルトでは、ローカルパスを指定せずに examplefile.txt などのローカルファイル名のみを指定した場合、ローカルファイルはサンプルプログラムが属するプロジェクトのパスからアップロードされます。
const localFilepath = 'D:\\localpath\\examplefile.txt'
// リクエストヘッダーを設定します。
const headers = {
// オブジェクトタグのキーと値を指定します。たとえば、キーを owner に、値を John に設定します。
'x-oss-tagging': 'owner=John&type=document',
}
client.put(objectName, localFilepath, {
headers
})using System.Text;
using Aliyun.OSS;
using System.Text;
using Aliyun.OSS.Util;
using Aliyun.OSS.Common;
// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
var endpoint = "yourEndpoint";
// 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// バケット名を指定します。
var bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。
var objectName = "exampleobject.txt";
var objectContent = "More than just cloud.";
String UrlEncodeKey(String key)
{
const string CharsetName = "utf-8";
const char separator = '/';
var segments = key.Split(separator);
var encodedKey = new StringBuilder();
encodedKey.Append(HttpUtils.EncodeUri(segments[0], CharsetName));
for (var i = 1; i < segments.Length; i++)
encodedKey.Append(separator).Append(HttpUtils.EncodeUri(segments[i], CharsetName));
if (key.EndsWith(separator.ToString()))
{
// String#split は末尾の空の文字列を無視します。たとえば、"a/b/" は 2 つのエントリの配列として分割されます。
// そのため、末尾のスラッシュをすべて URI に追加する必要があります。
foreach (var ch in key)
{
if (ch == separator)
encodedKey.Append(separator);
else
break;
}
}
return encodedKey.ToString();
}
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
const string region = "cn-hangzhou";
// ClientConfiguration インスタンスを作成し、要件に基づいてデフォルトのパラメーターを変更します。
var conf = new ClientConfiguration();
// 署名アルゴリズム V4 を使用します。
conf.SignatureVersion = SignatureVersion.V4;
// OSSClient インスタンスを作成します。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
byte[] binaryData = Encoding.ASCII.GetBytes(objectContent);
MemoryStream requestContent = new MemoryStream(binaryData);
var meta = new ObjectMetadata();
// HTTP ヘッダーでタグを設定します。
string str = UrlEncodeKey("key1") + "=" + UrlEncodeKey("value1") + "&" + UrlEncodeKey("key2") + "=" + UrlEncodeKey("value2");
meta.AddHeader("x-oss-tagging", str);
var putRequest = new PutObjectRequest(bucketName, objectName, requestContent);
putRequest.Metadata = meta;
// オブジェクトをアップロードし、オブジェクトにタグを追加します。
client.PutObject(putRequest);
Console.WriteLine("Put object succeeded");
}
catch (Exception ex)
{
Console.WriteLine("Put object failed, {0}", ex.Message);
}#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";
/* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。 */
std::string ObjectName = "exampledir/exampleobject.txt";
/* ネットワークリソースなどのリソースを初期化します。 */
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);
std::shared_ptr<std::iostream> content = std::make_shared<std::stringstream>();
*content << "test cpp sdk";
PutObjectRequest request(BucketName, ObjectName, content);
/* タグを指定します。 */
Tagging tagging;
tagging.addTag(Tag("key1", "value1"));
tagging.addTag(Tag("key2", "value2"));
request.setTagging(tagging.toQueryParameters());
/* オブジェクトをアップロードします。 */
auto outcome = client.PutObject(request);
if (!outcome.isSuccess()) {
/* 例外を処理します。 */
std::cout << "PutObject fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* ネットワークリソースなどのリソースを解放します。 */
ShutdownSdk();
return 0;
}package main
import (
"context"
"flag"
"log"
"strings"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// グローバル変数を定義します。
var (
region string // バケットが配置されているリージョン。
bucketName string // バケットの名前。
objectName string // オブジェクトの名前。
)
// コマンドラインパラメーターの初期化に使用される init 関数を指定します。
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
flag.StringVar(&objectName, "object", "", "The name of the object.")
}
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")
}
// オブジェクト名が指定されているかどうかを確認します。
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, object name required")
}
// アップロードするコンテンツを指定します。
content := "hi oss"
// デフォルトの構成をロードし、資格情報プロバイダーとリージョンを指定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// オブジェクトをアップロードするリクエストを作成します。
request := &oss.PutObjectRequest{
Bucket: oss.Ptr(bucketName), // バケットの名前。
Key: oss.Ptr(objectName), // オブジェクトの名前。
Body: strings.NewReader(content), // アップロードするコンテンツ。
Tagging: oss.Ptr("tag1=value1&tag2=value2"), // オブジェクトのタグを指定します。
}
// リクエストを実行します。
result, err := client.PutObject(context.TODO(), request)
if err != nil {
log.Fatalf("failed to put object %v", err)
}
// 結果を表示します。
log.Printf("put object result:%#v\n", result)
}
<?php
// autoload ファイルを導入して、依存ライブラリをロードします。
require_once __DIR__ . '/../../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
// コマンドラインパラメーターの説明を指定します。
$optsdesc = [
"region" => ['help' => The region in which the bucket is located.', 'required' => True], // (必須) バケットが配置されているリージョンを指定します。
"endpoint" => ['help' => The domain names that other services can use to access OSS.', 'required' => False], // (オプション) 他のサービスが OSS にアクセスするために使用できるエンドポイントを指定します。
"bucket" => ['help' => The name of the bucket, 'required' => True], // (必須) バケットの名前を指定します。
"key" => ['help' => The name of the object, 'required' => True], // (必須) オブジェクトの名前を指定します。
];
// パラメーターの説明を getopt で必要な長いオプションのリストに変換します。
$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" . PHP_EOL;
exit(1); // 必須パラメーターが設定されていない場合は、プログラムを終了します。
}
}
// 解析されたパラメーターから値を取得します。
$region = $options["region"]; // バケットが配置されているリージョン。
$bucket = $options["bucket"]; // バケットの名前。
$key = $options["key"]; // オブジェクトの名前。
// 環境変数からアクセス資格情報を取得します。
// EnvironmentVariableCredentialsProvider 環境変数から AccessKey ID と AccessKey Secret を取得します。
$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);
// アップロードするコンテンツを指定します。
$data = 'Hello OSS';
// オブジェクトをアップロードするための PutObjectRequest オブジェクトを作成します。
$request = new Oss\Models\PutObjectRequest(
bucket: $bucket,
key: $key,
tagging: "key1=value1&key2=value2"); // タグ情報を指定します。
$request-> body=Oss\Utils::streamFor($data); // HTTP リクエストボディのデータがバイナリストリームであることを指定します。
// 単純なアップロード操作を実行します。
$result = $client->putObject($request);
// アップロード結果を表示します。
printf(
'status code: %s' . PHP_EOL . // HTTP ステータスコード。
'request id: %s' . PHP_EOL . // リクエスト ID。
'etag: %s' . PHP_EOL, // オブジェクトの ETag。
$result->statusCode,
$result->requestId,
$result->etag
);
import argparse
import alibabacloud_oss_v2 as oss
# コマンドラインパラメーターパーサーを作成し、パラメーターを定義します。
parser = argparse.ArgumentParser(description="put object tagging sample")
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
parser.add_argument('--key', help='The name of the object.', required=True)
parser.add_argument('--tag_key', help='The name of the tag key.', required=True)
parser.add_argument('--tag_value', help='The name of the tag value.', 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
# エンドポイントが提供されている場合は、エンドポイントを指定します。
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# OSS クライアントを作成します。
client = oss.Client(cfg)
# タグを指定します。
# 複数のタグを設定する必要がある場合は、次の形式で oss.Tag オブジェクトを追加します。
# tags = [oss.Tag(key=args.tag_key, value=args.tag_value), oss.Tag(key=args.tag_key2, value=args.tag_value2)]
tags = [oss.Tag(
key=args.tag_key,
value=args.tag_value,
)]
# オブジェクトのタグを設定します。
result = client.put_object_tagging(oss.PutObjectTaggingRequest(
bucket=args.bucket,
key=args.key,
tagging=oss.Tagging(
tag_set=oss.TagSet(
tags=tags,
),
),
))
# 応答を出力します。
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' version id: {result.version_id},'
)
if __name__ == "__main__":
main()
ossutil コマンドラインツールを使用する
ossutil コマンドラインツールを使用して、タグを追加または変更できます。ossutil のインストール方法の詳細については、「ossutil をインストールする」をご参照ください。
次のコマンドは、examplebucket バケット内の exampleobject オブジェクトのタグを追加または変更します。
ossutil api put-object-tagging --bucket examplebucket --key exampleobject --tagging "{\"TagSet\":{\"Tag\":[{\"Key\":\"key1\",\"Value\":\"value1\"},{\"Key\":\"key2\",\"Value\":\"value2\"}]}}"このコマンドの詳細については、「put-object-tagging」をご参照ください。
関連 API 操作
このトピックで説明されているメソッドは、API 操作に基づいています。アプリケーションで高度なカスタマイズが必要な場合は、REST API リクエストを直接行うことができます。REST API リクエストを行う場合、署名を計算するためのコードを手動で記述する必要があります。詳細については、「PutObjectTagging」をご参照ください。