Object Storage Service (OSS) では、オブジェクトにタグを追加して分類できます。このトピックでは、OSS SDK for Go V2 を使用してタグを追加する方法について説明します。
注記
このトピックのサンプルコードでは、中国 (杭州) リージョンのリージョン ID
cn-hangzhouを使用しています。デフォルトでは、パブリックエンドポイントを使用してバケット内のリソースにアクセスします。バケットが配置されているのと同じリージョン内の他の Alibaba Cloud サービスを使用してバケット内のリソースにアクセスする場合は、内部エンドポイントを使用します。Object Storage Service (OSS) でサポートされているリージョンとエンドポイントの詳細については、「OSS のリージョンとエンドポイント」をご参照ください。このトピックでは、アクセス認証情報は環境変数から取得されます。アクセス認証情報を設定する方法の詳細については、「アクセス認証情報を設定する」をご参照ください。
oss:PutObjectTagging権限は、オブジェクトにタグを付けるために必要です。詳細については、「RAM ユーザーにカスタム権限を付与する」をご参照ください。
オブジェクトのアップロード時にタグを追加する
シンプルアップロードタスクでオブジェクトにタグを追加する
次のコードは、オブジェクトのアップロード時にタグを追加する方法を示しています。
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", "", "バケットが配置されているリージョン。")
flag.StringVar(&bucketName, "bucket", "", "バケットの名前。")
flag.StringVar(&objectName, "object", "", "オブジェクトの名前。")
}
func main() {
// コマンドラインパラメータを解析します。
flag.Parse()
// バケットの名前が指定されているかどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。バケット名が必要です。")
}
// リージョンが指定されているかどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。リージョンが必要です。")
}
// オブジェクトの名前が指定されているかどうかを確認します。
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。オブジェクト名が必要です。")
}
// アップロードするコンテンツを指定します。
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("オブジェクトの配置に失敗しました %v", err)
}
// 結果を表示します。
log.Printf("オブジェクトの配置結果: %#v\n", result)
}
マルチパートアップロードを実行するときにオブジェクトにタグを追加する
次のコードは、マルチパートアップロードを実行するときにタグを追加する方法を示しています。
package main
import (
"bufio"
"bytes"
"context"
"flag"
"io"
"log"
"os"
"sync"
"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", "", "バケットが配置されているリージョン。")
flag.StringVar(&bucketName, "bucket", "", "ソースバケットの名前。")
flag.StringVar(&objectName, "object", "", "ソースオブジェクトの名前。")
}
func main() {
// コマンドラインパラメータを解析します。
flag.Parse()
// アップロード ID を指定します。
var uploadId string
// ソースバケットの名前が指定されているかどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。ソースバケット名が必要です。")
}
// リージョンが指定されているかどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。リージョンが必要です。")
}
// ソースオブジェクトの名前が指定されているかどうかを確認します。
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。ソースオブジェクト名が必要です。")
}
// デフォルト設定を読み込み、認証情報プロバイダとリージョンを指定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// マルチパートアップロードリクエストを初期化します。
initRequest := &oss.InitiateMultipartUploadRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
Tagging: oss.Ptr("tag1=value1&tag2=value2"), // オブジェクトのタグを指定します。
}
// マルチパートアップロードタスクを開始するリクエストを実行します。
initResult, err := client.InitiateMultipartUpload(context.TODO(), initRequest)
if err != nil {
log.Fatalf("マルチパートアップロードの開始に失敗しました %v", err)
}
// 初期化の結果を表示します。
log.Printf("マルチパートアップロードの開始結果: %#v\n", *initResult.UploadId)
uploadId = *initResult.UploadId
// 待機グループとミューテックスを初期化します。
var wg sync.WaitGroup
var parts []oss.UploadPart
count := 3
var mu sync.Mutex
// ローカルファイルからメモリにデータを読み込み、yourLocalFile をファイル名を含むローカルファイルの実際のパスに置き換えます。
file, err := os.Open("/Users/leyinhui/Downloads/iTerm2")
if err != nil {
log.Fatalf("ローカルファイルを開けませんでした %v", err)
}
defer file.Close()
bufReader := bufio.NewReader(file)
content, err := io.ReadAll(bufReader)
if err != nil {
log.Fatalf("ローカルファイルの読み取りに失敗しました %v", err)
}
log.Printf("ファイルサイズ: %d\n", len(content))
// 各パートのサイズを計算します。
chunkSize := len(content) / count
if chunkSize == 0 {
chunkSize = 1
}
// マルチパートアップロードタスクの複数のゴルーチンを開始します。
for i := 0; i < count; i++ {
start := i * chunkSize
end := start + chunkSize
if i == count-1 {
end = len(content)
}
wg.Add(1)
go func(partNumber int, start, end int) {
defer wg.Done()
// マルチパートアップロードリクエストを作成します。
partRequest := &oss.UploadPartRequest{
Bucket: oss.Ptr(bucketName), // デスティネーションバケットの名前。
Key: oss.Ptr(objectName), // デスティネーションオブジェクトの名前。
PartNumber: int32(partNumber), // パートの番号。
UploadId: oss.Ptr(uploadId), // アップロード ID。
Body: bytes.NewReader(content[start:end]), // パートのコンテンツ。
}
// パートをアップロードするリクエストを送信します。
partResult, err := client.UploadPart(context.TODO(), partRequest)
if err != nil {
log.Fatalf("パートのアップロードに失敗しました %d: %v", partNumber, err)
}
// リクエストの結果を表示します。
part := oss.UploadPart{
PartNumber: partRequest.PartNumber,
ETag: partResult.ETag,
}
// ミューテックスを使用して共有データを保護します。
mu.Lock()
parts = append(parts, part)
mu.Unlock()
}(i+1, start, end)
}
// すべてのゴルーチンが完了するまで待ちます。
wg.Wait()
// マルチパートアップロードタスクを完了します。
request := &oss.CompleteMultipartUploadRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
UploadId: oss.Ptr(uploadId),
CompleteMultipartUpload: &oss.CompleteMultipartUpload{
Parts: parts,
},
}
result, err := client.CompleteMultipartUpload(context.TODO(), request)
if err != nil {
log.Fatalf("マルチパートアップロードの完了に失敗しました %v", err)
}
// 結果を表示します。
log.Printf("マルチパートアップロードの完了結果: %#v\n", result)
}
追加アップロードを実行するときにオブジェクトにタグを追加する
次のコードは、追加アップロードを実行するときにタグを追加する方法を示しています。
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", "", "バケットが配置されているリージョン。")
flag.StringVar(&bucketName, "bucket", "", "バケットの名前。")
flag.StringVar(&objectName, "object", "", "オブジェクトの名前。")
}
func main() {
// コマンドラインパラメータを解析します。
flag.Parse()
// 追加操作を開始する位置を指定します。
var (
position = int64(0)
)
// バケットの名前が指定されているかどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。バケット名が必要です。")
}
// リージョンが指定されているかどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。リージョンが必要です。")
}
// オブジェクトの名前が指定されているかどうかを確認します。
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。オブジェクト名が必要です。")
}
// デフォルト設定を読み込み、認証情報プロバイダとリージョンを指定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// 追加するコンテンツを指定します。
content := "hi append object"
// 最初の追加操作を実行するための AppendObject リクエストを作成します。
request := &oss.AppendObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
Position: oss.Ptr(position),
Body: strings.NewReader(content),
Tagging: oss.Ptr("tag1=value1&tag2=value2"), // オブジェクトのタグを指定します。
}
// 最初の追加操作を実行し、結果を処理します。
// オブジェクトに初めて追加する場合、追加操作は 0 から開始します。次の追加操作の位置はレスポンスに含まれています。
result, err := client.AppendObject(context.TODO(), request)
if err != nil {
log.Fatalf("オブジェクトの追加に失敗しました %v", err)
}
// 2 番目の追加操作を実行するための AppendObject リクエストを作成します。
request = &oss.AppendObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
Position: oss.Ptr(result.NextPosition), // 最初の AppendObject の戻り値から NextPosition を取得します
Body: strings.NewReader("hi append object"),
}
// 2 番目の追加操作を実行し、結果を処理します。
result, err = client.AppendObject(context.TODO(), request)
if err != nil {
log.Fatalf("オブジェクトの追加に失敗しました %v", err)
}
log.Printf("オブジェクトの追加結果: %#v\n", result)
}
オブジェクトをコピーするときにオブジェクトにタグを追加する
次のコードは、オブジェクトをコピーするときにタグを追加する方法を示しています。
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 // バケットが配置されているリージョン。
srcBucketName string // ソースバケットの名前。
srcObjectName string // ソースオブジェクトの名前。
destBucketName string // デスティネーションバケットの名前。
destObjectName string // デスティネーションオブジェクトの名前。
)
// コマンドラインパラメータを初期化するために使用する init 関数を指定します。
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&srcBucketName, "src-bucket", "", "ソースバケットの名前。")
flag.StringVar(&srcObjectName, "src-object", "", "ソースオブジェクトの名前。")
flag.StringVar(&destBucketName, "dest-bucket", "", "デスティネーションバケットの名前。")
flag.StringVar(&destObjectName, "dest-object", "", "デスティネーションオブジェクトの名前。")
}
func main() {
// コマンドラインパラメータを解析します。
flag.Parse()
// ソースバケットの名前が指定されているかどうかを確認します。
if len(srcBucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。ソースバケット名が必要です。")
}
// リージョンが指定されているかどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。リージョンが必要です。")
}
// デスティネーションバケット名が指定されていない場合は、ソースバケット名が使用されます。
if len(destBucketName) == 0 {
destBucketName = srcBucketName
}
// ソースオブジェクトの名前が指定されているかどうかを確認します。
if len(srcObjectName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。ソースオブジェクト名が必要です。")
}
// デスティネーションオブジェクトの名前が指定されているかどうかを確認します。
if len(destObjectName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。デスティネーションオブジェクト名が必要です。")
}
// デフォルト設定を読み込み、認証情報プロバイダとリージョンを指定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// オブジェクトをコピーするリクエストを作成します。
copyRequest := &oss.CopyObjectRequest{
Bucket: oss.Ptr(destBucketName), // デスティネーションバケットの名前。
Key: oss.Ptr(destObjectName), // デスティネーションオブジェクトの名前。
SourceKey: oss.Ptr(srcObjectName), // ソースオブジェクトの名前。
SourceBucket: oss.Ptr(srcBucketName), // ソースバケットの名前。
StorageClass: oss.StorageClassStandard, // ストレージクラスを Standard に設定します。
TaggingDirective: oss.Ptr("Replace"), // ソースオブジェクトのタグを無視します。
Tagging: oss.Ptr("tag1=value1&tag2=value2"), // オブジェクトのタグを指定します。
}
// ソースオブジェクトをコピーし、結果を処理します。
copyResult, err := client.CopyObject(context.TODO(), copyRequest)
if err != nil {
log.Fatalf("オブジェクトのコピーに失敗しました: %v", err)
}
// 結果を表示します。
log.Printf("オブジェクトのコピー結果: %#v\n", copyResult)
}
既存のオブジェクトにタグを追加、またはタグを変更する
既存のオブジェクトにタグを追加、またはタグを変更する
既存のオブジェクトにタグがない場合、またはオブジェクトに追加されたタグが要件を満たしていない場合は、オブジェクトにタグを追加したり、オブジェクトのタグを変更したりできます。
次のコードは、既存のオブジェクトにタグを追加、またはタグを変更する方法を示しています。
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 // バケットの名前。
objectName string // オブジェクトの名前。
)
// コマンドラインパラメータを初期化するために使用する init 関数を指定します。
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&bucketName, "bucket", "", "バケットの名前。")
flag.StringVar(&objectName, "object", "", "オブジェクトの名前。")
}
func main() {
// コマンドラインパラメータを解析します。
flag.Parse()
// リージョンが指定されているかどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。リージョンが必要です。")
}
// バケットの名前が指定されているかどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。バケット名が必要です。")
}
// オブジェクトの名前が指定されているかどうかを確認します。
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータです。オブジェクト名が必要です。")
}
// デフォルト設定を読み込み、認証情報プロバイダとリージョンを指定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// タグを追加するリクエストを作成します。
putRequest := &oss.PutObjectTaggingRequest{
Bucket: oss.Ptr(bucketName), // バケットの名前。
Key: oss.Ptr(objectName), // オブジェクトの名前。
Tagging: &oss.Tagging{
TagSet: &oss.TagSet{
Tags: []oss.Tag{
{
Key: oss.Ptr("k1"), // タグキー。
Value: oss.Ptr("v1"), // タグ値。
},
{
Key: oss.Ptr("k2"), // タグキー。
Value: oss.Ptr("v2"), // タグ値。
},
},
},
},
}
// リクエストを送信します。
putResult, err := client.PutObjectTagging(context.TODO(), putRequest)
if err != nil {
log.Fatalf("オブジェクトタグ付けの配置に失敗しました %v", err)
}
// 結果を表示します。
log.Printf("オブジェクトタグ付けの配置結果: %#v\n", putResult)
}
関連情報
オブジェクトタグ付けの設定に使用される完全なサンプルコードについては、GitHub をご覧ください。
オブジェクトタグ付けの設定のために呼び出すことができる API 操作の詳細については、「PutObjectTagging」をご参照ください。