すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:オブジェクトのコピー (Go V2 用 SDK)

最終更新日:Aug 26, 2026

SDK for Go V2 の CopyObject メソッドを使用して、同一リージョン内のソースバケットと送信先バケット間で 5 GiB 未満のオブジェクトをコピーします。ソースバケットと送信先バケットは、同じでも異なっていてもかまいません。

注意事項

  • このトピックのサンプルコードでは、デフォルトで中国 (杭州) リージョンの ID cn-hangzhou とパブリックエンドポイントを使用します。同一リージョン内の別の Alibaba Cloud サービスから Object Storage Service (OSS) にアクセスする場合は、代わりに内部エンドポイントを使用してください。OSS のリージョンとエンドポイントのマッピングについては、リージョンとエンドポイントをご参照ください。

  • このトピックでは、環境変数を例としてアクセス認証情報を読み取ります。アクセス認証情報の設定方法については、アクセス認証情報の設定をご参照ください。

  • オブジェクトをコピーするには、ソースオブジェクトに対する読み取り権限と、送信先バケットに対する読み取りおよび書き込み権限が必要です。

  • リージョン間のコピーはサポートされていません。たとえば、中国 (杭州) リージョンのバケットから中国 (青島) リージョンのバケットにオブジェクトをコピーすることはできません。

  • オブジェクトをコピーする際は、ソースバケットと送信先バケットのいずれにも保持ポリシーが設定されていないことを確認してください。設定されている場合、操作は失敗し、The object you specified is immutable. というエラーが返されます。

権限

デフォルトでは、Alibaba Cloud アカウント (root ユーザー) は完全な権限を持っています。Alibaba Cloud アカウントに属する Resource Access Management (RAM) ユーザーまたは RAM ロールは、デフォルトではいかなる権限も持っていません。Alibaba Cloud アカウントまたはアカウント管理者は、RAM ポリシーまたはバケットポリシーを通じて操作権限を付与する必要があります。

API

アクション

説明

CopyObject

oss:GetObject

同一リージョン内のバケット内またはバケット間でオブジェクトをコピーします。

oss:PutObject

oss:GetObjectVersion

versionId を通じてソースオブジェクトのバージョンを指定する場合、この権限も必要です。

oss:GetObjectTagging

x-oss-tagging を通じてオブジェクトタグをコピーする場合、これらの権限が必要です。

oss:PutObjectTagging

oss:GetObjectVersionTagging

versionId を通じてソースオブジェクトの特定のバージョンのタグを指定する場合、この権限も必要です。

kms:GenerateDataKey

オブジェクトをコピーする際に、送信先オブジェクトのメタデータに X-Oss-Server-Side-Encryption: KMS が含まれている場合、これら 2 つの権限が必要です。

kms:Decrypt

メソッドシグネチャ

func (c *Client) CopyObject(ctx context.Context, request *CopyObjectRequest, optFns ...func(*Options)) (*CopyObjectResult, error)

リクエストパラメーター

パラメーター

型

説明

ctx

context.Context

リクエストコンテキスト。リクエスト全体のタイムアウトを設定するために使用できます。

request

*CopyObjectRequest

この操作のリクエストパラメーター。詳細については、CopyObjectRequest をご参照ください。

optFns

...func(*Options)

(オプション) 設定オプション。詳細については、Options をご参照ください。

次の表に、CopyObjectRequest の共通パラメーターを示します。

パラメーター

型

説明

Bucket

*string

送信先バケットの名前を指定します。

Key

*string

送信先オブジェクトの名前を指定します。

SourceBucket

*string

ソースバケットの名前を指定します。

SourceKey

*string

ソースオブジェクトの名前を指定します。

ForbidOverwrite

*string

CopyObject 操作中に同じ名前の送信先オブジェクトを上書きするかどうかを指定します。

Tagging

*string

オブジェクトのタグを指定します。複数のタグを同時に指定できます。例:TagA=A&TagB=B。

TaggingDirective

*string

送信先オブジェクトのタグをどのように設定するかを指定します。有効な値:

  • Copy (デフォルト):ソースオブジェクトのタグを送信先オブジェクトにコピーします。

  • Replace:ソースオブジェクトのタグを無視し、リクエストで指定されたタグを使用します。

レスポンスパラメーター

戻り値

型

説明

result

*CopyObjectResult

操作の戻り値。この値は err が nil の場合に有効になります。詳細については、CopyObjectResult をご参照ください。

err

error

リクエストのステータス。リクエストが失敗した場合、err は nil ではありません。

サンプルコード

ソースバケットから送信先バケットへ5 GiB 未満のオブジェクトをコピーするには、次のサンプルコードを使用します。

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(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&srcBucketName, "src-bucket", "", "The name of the source bucket.")
	flag.StringVar(&srcObjectName, "src-object", "", "The name of the source object.")
	flag.StringVar(&destBucketName, "dest-bucket", "", "The name of the destination bucket.")
	flag.StringVar(&destObjectName, "dest-object", "", "The name of the destination object.")
}

func main() {
	// コマンドラインパラメーターを解析します。
	flag.Parse()

	// ソースバケット名が空かどうかを確認します。
	if len(srcBucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, source bucket name required")
	}

	// リージョンが空かどうかを確認します。
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// 送信先バケット名が指定されていない場合は、ソースバケット名を使用します。
	if len(destBucketName) == 0 {
		destBucketName = srcBucketName
	}

	// ソースオブジェクト名が空かどうかを確認します。
	if len(srcObjectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, source object name required")
	}

	// 送信先オブジェクト名が空かどうかを確認します。
	if len(destObjectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, destination object name required")
	}

	// デフォルトの構成をロードし、認証情報プロバイダーとリージョンを指定します。
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// OSS クライアントを作成します。
	client := oss.NewClient(cfg)

	// オブジェクトをコピーするためのリクエストを作成します。
	request := &oss.CopyObjectRequest{
		Bucket:       oss.Ptr(destBucketName), // 送信先バケットの名前。
		Key:          oss.Ptr(destObjectName), // 送信先オブジェクトの名前。
		SourceKey:    oss.Ptr(srcObjectName),  // ソースオブジェクトの名前。
		SourceBucket: oss.Ptr(srcBucketName),  // ソースバケットの名前。
	}

	// オブジェクトのコピー操作を実行し、結果を処理します。
	result, err := client.CopyObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to copy object %v", err)
	}
	log.Printf("copy object result:%#v\n", result)
}

参考

  • オブジェクトのコピーに関する完全なサンプルコードについては、GitHub サンプルをご参照ください。

  • オブジェクトのコピーに使用される API オペレーションについては、CopyObject をご参照ください。