このトピックでは、同じリージョン内のソースバケットから、同じまたは異なる宛先バケットにオブジェクトをコピーする方法について説明します。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスするには、内部エンドポイントを使用します。 サポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、環境変数からアクセス認証情報を取得します。 アクセス認証情報の設定方法の詳細については、「アクセス認証情報の設定」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。 カスタムドメイン名またはセキュリティトークンサービス (STS) を使用して OSSClient インスタンスを作成する場合は、「一般的なシナリオの設定例」をご参照ください。
オブジェクトをコピーするには、ソースオブジェクトに対する読み取り権限と、宛先バケットに対する読み取りおよび書き込み権限が必要です。
ソースバケットと宛先バケットに保存ポリシーが設定されていないことを確認してください。 設定されている場合、エラーメッセージ The object you specified is immutable. が返されます。
ソースバケットと宛先バケットは、同じリージョンにある必要があります。 たとえば、中国 (杭州) リージョンにあるバケットから中国 (青島) リージョンにある別のバケットにオブジェクトをコピーすることはできません。
権限
デフォルトでは、Alibaba Cloud アカウントは完全な権限を持っています。 Alibaba Cloud アカウント配下の RAM ユーザーまたは RAM ロールは、デフォルトではいかなる権限も持っていません。 Alibaba Cloud アカウントまたはアカウント管理者は、RAM ポリシーまたはバケットポリシーを通じて操作権限を付与する必要があります。
API | アクション | 定義 |
CopyObject |
| 同じリージョン内のバケット内またはバケット間でオブジェクトをコピーします。 |
| ||
| versionId を通じてソースオブジェクトのバージョンを指定する場合、この権限も必要です。 | |
| x-oss-tagging を通じてオブジェクトタグをコピーする場合、これらの権限が必要です。 | |
| ||
| versionId を通じてソースオブジェクトの特定バージョンのタグを指定する場合、この権限も必要です。 | |
| オブジェクトをコピーする際に、宛先オブジェクトのメタデータに X-Oss-Server-Side-Encryption: KMS が含まれている場合、これら 2 つの権限が必要です。 | |
|
サンプルコード
bucket.copy_object を使用してオブジェクトをコピーし、:meta_directive パラメーターを使用してオブジェクトのメタデータを指定できます。 コピー操作中に、次のいずれかの方法でオブジェクトのメタデータを処理できます。
meta パラメーターを指定しない場合、宛先オブジェクトのメタデータはソースオブジェクトのメタデータと同じになります。
meta パラメーターを指定した場合、ソースオブジェクトのメタデータは新しいメタデータで上書きされます。
次のコードは、オブジェクトをコピーする方法を示しています。
require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
access_key_id: ENV['OSS_ACCESS_KEY_ID'],
access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
# バケット名を指定します。 例: examplebucket。
bucket = client.get_bucket('examplebucket')
# オブジェクトとそのメタデータをコピーします。
bucket.copy_object(
# この例では、srcobject.txt が destobject.txt としてコピーされます。
'destobject.txt', 'srcobject.txt',
:meta_directive => Aliyun::OSS::MetaDirective::COPY)
# オブジェクトをコピーし、そのメタデータを上書きします。
bucket.copy_object(
'destobject.txt', 'srcobject.txt',
:metas => {'year' => '2017'},
:meta_directive => Aliyun::OSS::MetaDirective::REPLACE) 関連ドキュメント
CopyObject API 操作の詳細については、「CopyObject」をご参照ください。