このトピックでは、同一リージョン内の同一バケット内またはバケット間でオブジェクトをコピーする方法について説明します。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。同一リージョン内の他の Alibaba Cloud サービスから OSS にアクセスするには、内部エンドポイントを使用します。サポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス認証情報は環境変数から取得します。アクセス認証情報の設定方法の詳細については、「アクセス認証情報の設定」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「一般的なシナリオの設定例」をご参照ください。
オブジェクトをコピーするには、ソースオブジェクトに対する読み取り権限と、宛先バケットに対する読み取り/書き込み権限が必要です。
ソースバケットと宛先バケットに保持ポリシーが設定されていないことを確認してください。設定されている場合、エラーメッセージ The object you specified is immutable. が返されます。
ソースバケットと宛先バケットは、同じリージョンにある必要があります。たとえば、中国 (杭州) リージョンにあるバケットから中国 (青島) リージョンにある別のバケットにオブジェクトをコピーすることはできません。
権限
デフォルトでは、Alibaba Cloud アカウントは完全な権限を持っています。Alibaba Cloud アカウントに属する RAM ユーザーまたは RAM ロールは、デフォルトでは何の権限も持っていません。Alibaba Cloud アcount またはアカウント管理者は、RAM ポリシーまたはバケットポリシーを通じて操作権限を付与する必要があります。
API | アクション | 定義 |
CopyObject |
| 同一リージョン内のバケット内またはバケット間でオブジェクトをコピーします。 |
| ||
| `versionId` を通じてソースオブジェクトのバージョンを指定する場合、この権限も必要です。 | |
| `x-oss-tagging` を通じてオブジェクトタグをコピーする場合、これらの権限が必要です。 | |
| ||
| `versionId` を通じてソースオブジェクトの特定バージョンのタグを指定する場合、この権限も必要です。 | |
| オブジェクトをコピーする際に、宛先オブジェクトのメタデータに `X-Oss-Server-Side-Encryption: KMS` が含まれている場合、これら 2 つの権限が必要です。 | |
|
小さいオブジェクトのコピー
サイズが 1 GB 以下のオブジェクトは、`copy` メソッドを使用して、同一バケット内または同一リージョン内の別バケットにコピーできます。
同一バケット内でのオブジェクトのコピー
次のサンプルコードは、同一バケット内でオブジェクトをコピーする方法を示しています。
const OSS = require('ali-oss'); const client = new OSS({ // バケットが所在するリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを oss-cn-hangzhou に設定します。 region: 'yourRegion', // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 accessKeyId: process.env.OSS_ACCESS_KEY_ID, accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET, authorizationV4: true, // バケット名を指定します。例: examplebucket。 bucket: 'examplebucket', // HTTPS を有効にするかどうかを指定します。secure を true に設定すると、HTTPS が有効になります。 // secure: true }) // バケット内でオブジェクトをコピーします。 async function copySmallObjecInSameBucket() { try { // 宛先オブジェクトとソースオブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。 // 宛先オブジェクトの HTTP ヘッダーとカスタムメタデータを指定します。 const result = await client.copy('destexampleobject.txt', 'srcexampleobject.txt', { // headers パラメーターを設定して、宛先オブジェクトの HTTP ヘッダーを指定します。headers パラメーターを設定しない場合、宛先オブジェクトの HTTP ヘッダーはソースオブジェクトの HTTP ヘッダーと同じになります。ソースオブジェクトの HTTP ヘッダーがコピーされます。 headers: { 'Cache-Control': 'no-cache', // ソースオブジェクトの ETag 値がリクエストで指定された ETag 値と同じ場合、OSS はオブジェクトをコピーし、200 OK を返します。 'if-match': '5B3C1A2E053D763E1B002CC607C5****', // リクエストで指定した ETag 値がソースオブジェクトの ETag 値と異なる場合、OSS はオブジェクトをコピーし、200 OK を返します。 'if-none-match': '5B3C1A2E053D763E1B002CC607C5****', // リクエストで指定された時刻がオブジェクトの変更時刻より前の場合、OSS はオブジェクトをコピーし、200 OK を返します。 'if-modified-since': '2021-12-09T07:01:56.000Z', // 指定された時刻以降にソースオブジェクトが変更されていない場合、オブジェクトはコピーされ、200 OK が返されます。 'if-unmodified-since': '2021-12-09T07:01:56.000Z', // 宛先オブジェクトのアクセス制御リスト (ACL) を指定します。この例では、ACL は private に設定されており、オブジェクト所有者と承認されたユーザーのみがオブジェクトに対する読み取り/書き込み権限を持つことを示します。他のユーザーはオブジェクトにアクセスする権限がありません。 'x-oss-object-acl': 'private', // オブジェクトのタグを指定します。オブジェクトに複数のタグを同時に指定できます。 'x-oss-tagging': 'Tag1=1&Tag2=2', // CopyObject 操作が同名の既存オブジェクトを上書きするかどうかを指定します。この例では、このパラメーターは true に設定されており、CopyObject 操作が同名の既存オブジェクトを上書きしないことを指定します。 'x-oss-forbid-overwrite': 'true', }, // meta パラメーターを設定して、宛先オブジェクトのメタデータを指定します。meta パラメーターを設定しない場合、宛先オブジェクトのメタデータはソースオブジェクトのメタデータと同じになります。ソースオブジェクトのメタデータがコピーされます。 meta: { location: 'hangzhou', year: 2015, people: 'mary', }, }); console.log(result); } catch (e) { console.log(e); } } copySmallObjecInSameBucket()同一リージョン内のバケット間でのオブジェクトのコピー
次のサンプルコードは、同一リージョン内のバケット間でオブジェクトをコピーする方法の例を示しています。
const OSS = require('ali-oss'); const client = new OSS({ // バケットが所在するリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを oss-cn-hangzhou に設定します。 region: 'yourRegion', // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 accessKeyId: process.env.OSS_ACCESS_KEY_ID, accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET, authorizationV4: true, // 宛先バケットの名前を指定します。 bucket: 'destexamplebucket', }); async function copySmallObjectBetweenBuckets() { try { // 宛先オブジェクト名 destobject.txt、ソースオブジェクト名 srcobject.txt、およびソースオブジェクトが属するバケット名を指定します。 const result = await client.copy('destobject.txt', 'srcobject.txt', 'srcbucket', { // headers パラメーターを設定して、宛先オブジェクトの HTTP ヘッダーを指定します。headers パラメーターを設定しない場合、宛先オブジェクトの HTTP ヘッダーはソースオブジェクトの HTTP ヘッダーと同じになります。ソースオブジェクトの HTTP ヘッダーがコピーされます。 headers: { 'Cache-Control': 'no-cache', }, // meta パラメーターを設定して、宛先オブジェクトのメタデータを指定します。meta パラメーターを設定しない場合、宛先オブジェクトのメタデータはソースオブジェクトのメタデータと同じになります。ソースオブジェクトのメタデータがコピーされます。 meta: { location: 'hangzhou', year: 2015, people: 'mary', }, }); console.log(result); } catch (e) { console.log(e); } } copySmallObjectBetweenBuckets()
大きいオブジェクトのコピー
1 GB を超えるオブジェクトの場合は、multipartUploadCopy メソッドを使用してマルチパートコピーを実行できます。
次のサンプルコードは、同一リージョン内のバケット間でオブジェクトをコピーする方法を示しています。
const OSS = require("ali-oss");
const client = new OSS({
// バケットが所在するリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを oss-cn-hangzhou に設定します。
region: 'yourregion',
// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// 宛先バケットの名前を指定します。
bucket: "destexamplebucket",
});
async function copyLargeObjectBetweenDifferentBuckets() {
try {
const copyheaders = {
// ソースオブジェクトの ETag 値がリクエストで指定された ETag 値と同じ場合、OSS はオブジェクトをコピーします。それ以外の場合、OSS は HTTP ステータスコード 412 (PreconditionFailed) を返します。
"x-oss-copy-source-if-match": "5B3C1A2E053D763E1B002CC607C5****",
// ソースオブジェクトの ETag 値がリクエストで指定された ETag 値と異なる場合、OSS はオブジェクトをコピーして 200 OK を返します。それ以外の場合、OSS は HTTP ステータスコード 304 (NotModified) を返します。
"x-oss-copy-source-if-none-match": "5B3C1A2E053D763E1B002CC607C5****",
// リクエストで指定された時刻がオブジェクトの変更時刻以降である場合、OSS はオブジェクトをコピーして 200 OK を返します。それ以外の場合、OSS は HTTP ステータスコード 412 (PreconditionFailed) を返します。
"x-oss-copy-source-if-unmodified-since": "2022-12-09T07:01:56.000Z",
// リクエストで指定された時刻がオブジェクトの変更時刻より前の場合、OSS はオブジェクトをコピーして 200 OK を返します。それ以外の場合、OSS は HTTP ステータスコード 304 (NotModified) を返します。
"x-oss-copy-source-if-modified-since": "2022-12-09T07:01:56.000Z",
};
const headers = {
// オブジェクトのダウンロード時の Web ページのキャッシュ動作を指定します。
"Cache-Control": "no-cache",
// オブジェクトのダウンロード時のオブジェクト名を指定します。
"Content-Disposition": "somename",
// 有効期限をミリ秒単位で指定します。
Expires: "1000",
};
let savedCpt;
// 宛先オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: destexampleobject1.txt。
const r1 = await client.multipartUploadCopy("destexampleobject1.txt", {
// ソースオブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: srcexampleobject.txt。
sourceKey: "srcexampleobject.txt",
// ソースバケットの名前を指定します。例: sourcebucket。
sourceBucketName: "sourcebucket",
copyheaders: copyheaders,
});
console.log(r1);
// 宛先オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: destexampleobject2.txt。
const r2 = await client.multipartUploadCopy("destexampleobject2.txt", {
// ソースオブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: srcexampleobject.txt。
sourceKey: "srcexampleobject.txt",
// ソースバケットの名前を指定します。例: sourcebucket。
sourceBucketName: "sourcebucket",
}, {
// 並列アップロードできるパート数を設定します。
parallel: 4,
// パートサイズを設定します。
partSize: 1024 * 1024,
progress: function (p, cpt, res) {
console.log(p);
savedCpt = cpt;
console.log(cpt);
console.log(res.headers["x-oss-request-id"]);
},
headers: headers,
copyheaders: copyheaders,
});
console.log(r2);
// 宛先オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: destexampleobject3.txt。
const r3 = await client.multipartUploadCopy("destexampleobject3.txt", {
// ソースオブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: srcexampleobject.txt。
sourceKey: "srcexampleobject.txt",
// ソースバケットの名前を指定します。例: sourcebucket。
sourceBucketName: "sourcebucket",
}, {
checkpoint: savedCpt,
progress: function (p, cpt, res) {
console.log(p);
console.log(cpt);
console.log(res.headers["x-oss-request-id"]);
},
});
console.log(r3);
} catch (e) {
console.log(e);
}
}
copyLargeObjectBetweenDifferentBuckets()関連ドキュメント
小さいオブジェクトのコピー
小さいオブジェクトをコピーするための完全なサンプルコードについては、GitHub の例をご参照ください。
小さいオブジェクトをコピーするための API 操作の詳細については、「CopyObject」をご参照ください。
大きいオブジェクトのコピー
大きいオブジェクトをコピーするための完全なサンプルコードについては、GitHub の例をご参照ください。
大きいオブジェクトをコピーするための API 操作の詳細については、「UploadPartCopy」をご参照ください。