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 |
|
同一リージョン内のバケット内またはバケット間でオブジェクトをコピーします。 |
|
|
||
|
|
versionId を通じてソースオブジェクトのバージョンを指定する場合、この権限も必要です。 |
|
|
|
x-oss-tagging を通じてオブジェクトタグをコピーする場合、これらの権限が必要です。 |
|
|
|
||
|
|
versionId を通じてソースオブジェクトの特定のバージョンのタグを指定する場合、この権限も必要です。 |
|
|
|
オブジェクトをコピーする際に、送信先オブジェクトのメタデータに X-Oss-Server-Side-Encryption: KMS が含まれている場合、これら 2 つの権限が必要です。 |
|
|
|
メソッドシグネチャ
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 |
送信先オブジェクトのタグをどのように設定するかを指定します。有効な値:
|
レスポンスパラメーター
|
戻り値 |
型 |
説明 |
|
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(®ion, "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 をご参照ください。