このトピックでは、Object Storage Service (OSS) SDK for Go V2 の新しい Copier モジュールを使用してラージオブジェクトをコピーする方法について説明します。
使用上の注意
このトピックのサンプルコードでは、リージョン ID
cn-hangzhouを使用しています。これは、中国 (杭州) リージョンを指定します。デフォルトでは、パブリックエンドポイントを使用してバケット内のリソースにアクセスします。バケットと同じリージョンにある他の Alibaba Cloud サービスからバケット内のリソースにアクセスする場合は、内部エンドポイントを使用します。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。このトピックでは、アクセス資格情報は環境変数から取得されます。アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
オブジェクトをコピーするには、ソースオブジェクトに対する読み取り権限と、コピー先バケットに対する読み取りおよび書き込み権限が必要です。
ソースバケットとコピー先バケットは同じリージョンに配置する必要があります。たとえば、中国 (杭州) リージョンにあるバケット内のオブジェクトを、中国 (青島) リージョンにあるバケットにコピーすることはできません。
ソースバケットとコピー先バケットにリテンションポリシーが設定されていないことを確認してください。設定されている場合、次のエラーメッセージが返されます: The object you specified is immutable.
メソッド
コピーマネージャーの概要
あるバケットから別のバケットにオブジェクトをコピーしたり、オブジェクトの属性を変更したりする場合は、CopyObject 操作または UploadPartCopy 操作を呼び出すことができます。この 2 つの操作は、異なるシナリオに適しています。
CopyObject 操作は、5 GiB 未満のオブジェクトのコピーにのみ適しています。
UploadPartCopy 操作は、5 GiB 以上のサイズのオブジェクトのコピーに適しています。この操作は x-oss-metadata-directive および x-oss-tagging-directive ディレクティブをサポートしていないことに注意してください。マルチパートコピー操作中にメタデータとタグ付けを構成するには、追加の実装が必要です。
Copier モジュールは、操作の違いと実装の詳細を隠し、オブジェクトをコピーするための普遍的なソリューションを提供します。Copier は、指定されたリクエストパラメーターに従って、オブジェクトをコピーするための適切な操作を自動的に選択します。次の行は、Copier モジュールの一般的なメソッドを示しています。
type Copier struct {
...
}
// Copier を作成します。
func (c *Client) NewCopier(optFns ...func(*CopierOptions)) *Copier
// // オブジェクトをコピーします。
func (c *Copier) Copy(ctx context.Context, request *CopyObjectRequest, optFns ...func(*CopierOptions)) (*CopyResult, error)リクエストパラメーター
パラメーター | タイプ | 説明 |
ctx | context.Context | リクエストのコンテキスト。リクエストの合計期間を指定するために使用できます。 |
request | *CopyObjectRequest | 特定の API 操作のパラメーター。詳細については、「CopyObjectRequest」をご参照ください。 |
optFns | ...func(*CopierOptions) | オプションのパラメーター。詳細については、「CopierOptions」をご参照ください。 |
CopyObjectRequest の共通パラメーター
パラメーター | タイプ | 説明 |
Bucket | *string | コピー先バケットの名前。 |
Key | *string | コピー先オブジェクトの名前。 |
SourceBucket | *string | ソースバケットの名前。 |
SourceKey | *string | ソースオブジェクトの名前。 |
ForbidOverwrite | *string | CopyObject 操作で同じ名前のオブジェクトの上書きを無効にするかどうかを指定します。 |
Tagging | *string | コピー先オブジェクトのタグ。コピー先オブジェクトに複数のタグを設定できます。例: TagA=A&TagB=B。 |
TaggingDirective | *string | コピー先オブジェクトにタグを設定するために使用されるメソッド。値:
|
CopierOptions の共通パラメーター
パラメーター | タイプ | 説明 |
PartSize | int64 | パートサイズ。デフォルトのパートサイズは 64 MiB です。 |
ParallelNum | int | 並列アップロードタスクの数。デフォルト値は 3 です。この設定はこの呼び出しにのみ固有であり、グローバルには適用されません。 |
MultipartCopyThreshold | int64 | マルチパートコピー操作を呼び出すための最小オブジェクトサイズ。デフォルトサイズは 200 MiB です。 |
LeavePartsOnError | bool | コピーが失敗した場合にコピーされたパートを保持するかどうかを指定します。デフォルトでは、コピーされたパートは保持されません。 |
DisableShallowCopy | bool | シャローコピーを無効にするかどうかを指定します。デフォルトでは、シャローコピーは有効になっています。 |
応答パラメーター
パラメーター | タイプ | 説明 |
result | *CopyResult | 操作への応答。このパラメーターは、err の値が nil の場合に利用できます。詳細については、「CopyResult」をご参照ください。 |
err | error | リクエストのステータス。リクエストが失敗した場合、err の値は nil ではありません。 |
サンプルコード
次のサンプルコードは、ソースバケットからコピー先バケットにオブジェクトをコピーし、オブジェクト属性を変更する方法の例を示しています。
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, 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, src object name required")
}
// コピー先オブジェクト名が空かどうかを確認します。
if len(destObjectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, destination object name required")
}
// OSS クライアント構成を作成します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// Copier を作成します。
c := client.NewCopier()
// オブジェクトをコピーするリクエストを作成します。
request := &oss.CopyObjectRequest{
Bucket: oss.Ptr(destBucketName), // コピー先バケットの名前。
Key: oss.Ptr(destObjectName), // コピー先オブジェクトの名前。
SourceKey: oss.Ptr(srcObjectName), // ソースオブジェクトの名前。
SourceBucket: oss.Ptr(srcBucketName), // ソースバケットの名前。
StorageClass: oss.StorageClassStandard, // コピー先オブジェクトのストレージクラスを標準に設定します。
MetadataDirective: oss.Ptr("Replace"), // ソースオブジェクトのメタデータを無視します。
TaggingDirective: oss.Ptr("Replace"), // ソースオブジェクトのタグを無視します。
}
// オブジェクトをコピーします。
result, err := c.Copy(context.TODO(), request)
if err != nil {
log.Fatalf("failed to copy object %v", err) // エラーが発生した場合は、エラーをログに記録して操作を終了します。
}
// 操作の結果を表示します。
log.Printf("copy object result:%#v\n", result)
}
参考資料
コピーマネージャーの API 操作の詳細については、「Copy」をご参照ください。