このトピックでは、OSS SDK for Go 2.0 の CopyObject メソッドを使用して、サイズが 5 GiB 未満のオブジェクトを、同じリージョン内のソースバケットからデスティネーションバケットにコピーする方法について説明します。 デスティネーションバケットは、ソースバケットと同じバケットでも、別のバケットでもかまいません。
使用上の注意
このトピックのサンプルコードでは、中国 (杭州) リージョンのリージョン ID
cn-hangzhouを使用しています。 デフォルトでは、パブリックエンドポイントを使用してバケット内のリソースにアクセスします。 バケットが配置されているのと同じリージョン内の他の Alibaba Cloud サービスを使用してバケット内のリソースにアクセスする場合は、内部エンドポイントを使用します。 OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。このトピックでは、アクセス認証情報は環境変数から取得されます。 アクセス認証情報を構成する方法の詳細については、「アクセス認証情報を構成する」をご参照ください。
オブジェクトをコピーするには、ソースオブジェクトに対する読み取り権限と、デスティネーションバケットに対する読み取りおよび書き込み権限が必要です。
ソースバケットとデスティネーションバケットは、同じリージョンに配置されている必要があります。 たとえば、中国 (杭州) リージョンにあるバケット内のオブジェクトを、中国 (青島) リージョンにある別のバケットにコピーすることはできません。
ソースバケットとデスティネーションバケットに保持ポリシーが構成されていないことを確認してください。 構成されている場合は、次のエラーメッセージが返されます: 指定したオブジェクトは変更不可です。
権限
デフォルトでは、Alibaba Cloud アカウントにはすべての権限があります。 Alibaba Cloud アカウントの 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 | 特定の API 操作のパラメーターを指定します。 詳細については、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", "", "バケットが配置されているリージョン。")
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)
// オブジェクトをコピーするリクエストを作成します。
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("オブジェクトのコピーに失敗しました %v", err)
}
log.Printf("オブジェクトのコピー結果: %#v\n", result)
}
関連情報
オブジェクトのコピーに使用される完全なサンプルコードについては、GitHub をご覧ください。
オブジェクトのコピーのために呼び出すことができる API 操作の詳細については、「CopyObject」をご参照ください。