このトピックでは、Harmony 向け OSS SDK の CopyObject メソッドを使用して、サイズが 5 GiB 未満のオブジェクトを同一リージョン内のソースバケットから宛先バケットにコピーする方法について説明します。宛先バケットは、ソースバケットと同じバケット、または異なるバケットを指定できます。
注意事項
サポートされているリージョンとエンドポイントの詳細については、「OSS のリージョンとエンドポイント」をご参照ください。
オブジェクトをコピーするには、ソースオブジェクトに対する読み取り権限と、宛先バケットに対する読み取りおよび書き込み権限が必要です。
ソースバケットと宛先バケットは、同一リージョンに配置する必要があります。例えば、中国 (杭州) リージョンにあるバケット内のオブジェクトを、中国 (青島) リージョンにあるバケットにコピーすることはできません。
ソースバケットと宛先バケットに保持ポリシーが設定されていないことを確認してください。設定されている場合、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 つの権限が必要です。 | |
|
サンプルコード
以下は、同一バケット内でオブジェクトをコピーするコード例です。
import Client, { RequestError } from '@aliyun/oss';
// OSSClient インスタンスを作成します。
const client = new Client({
// Security Token Service (STS) から取得した AccessKey ID を指定します。
accessKeyId: 'yourAccessKeyId',
// STS から取得した AccessKey Secret を指定します。
accessKeySecret: 'yourAccessKeySecret',
// STS から取得したセキュリティトークンを指定します。
securityToken: 'yourSecurityToken',
// バケットが配置されているリージョンを指定します。例えば、バケットが中国 (杭州) リージョンにある場合、リージョンを oss-cn-hangzhou に設定します。
region: 'oss-cn-hangzhou',
});
/**
* 同一バケットにオブジェクトをコピーします。
* copyObject メソッドを使用して、ソースオブジェクトを宛先オブジェクトにコピーします。
*/
const copyObject = async () => {
try {
// copyObject メソッドを使用して、同一バケットにオブジェクトをコピーします。
const res = await client.copyObject({
bucket: 'targetBucket', // 宛先バケットの名前。
key: 'targetKey', // 宛先オブジェクトの名前。
copySourceKey: 'sourceKey', // ソースオブジェクトの名前。
});
// 結果を出力します。
console.log(JSON.stringify(res));
} catch (err) {
// 例外をキャッチします。
if (err instanceof RequestError) {
console.log('code: ', err.code); // エラーコード。
console.log('message: ', err.message); // エラーメッセージ。
console.log('requestId: ', err.requestId); // リクエスト ID。
console.log('status: ', err.status); // HTTP ステータスコード。
console.log('ec: ', err.ec); // EC
} else {
console.log('unknown error: ', err);
}
}
};
// copyObject 関数を呼び出して、オブジェクトを同一バケットにコピーします。
copyObject();