このトピックでは、Python バージョン 2.0 の OSS SDK の 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 つの権限が必要です。 | |
|
メソッド
copy_object(request: CopyObjectRequest, **kwargs) → CopyObjectResultリクエストパラメーター
パラメーター | タイプ | 説明 |
request | CopyObjectRequest | リクエストパラメーター。 詳細については、「CopyObjectRequest」をご参照ください。 |
CopyObjectRequest の共通パラメーター
パラメーター | タイプ | 説明 |
bucket | str | デスティネーションバケットの名前。 |
key | str | デスティネーションオブジェクトの名前。 |
source_bucket | str | ソースバケットの名前。 |
source_key | str | ソースオブジェクトの名前。 |
forbid_overwrite | str | CopyObject 操作で、同じ名前の既存のオブジェクトを上書きするかどうかを指定します。 |
tagging | str | デスティネーションオブジェクトのタグ。 デスティネーションオブジェクトには複数のタグを構成できます。 例: TagA=A&TagB=B。 |
tagging_directive | str | デスティネーションオブジェクトのタグを構成するために使用されるメソッド。 有効な値:
|
レスポンスパラメーター
タイプ | 説明 |
CopyObjectResult | 戻り値。 詳細については、「CopyObjectResult」をご参照ください。 |
オブジェクトコピーメソッドの完全な定義については、「copy_object」をご参照ください。
サンプルコード
次のサンプルコードは、サイズが 5 GiB 未満のオブジェクトをソースバケットからデスティネーションバケットにコピーする方法の例を示しています。
import argparse
import alibabacloud_oss_v2 as oss
# コマンドラインパラメーターパーサーを作成します。
parser = argparse.ArgumentParser(description="copy object sample")
# --region パラメーターを指定して、バケットが配置されているリージョンを示します。 このパラメーターは必須です。
parser.add_argument('--region', help='バケットが配置されているリージョン。', required=True)
# --bucket パラメーターを指定します。これは、デスティネーションバケットの名前を指定します。 このパラメーターは必須です。
parser.add_argument('--bucket', help='デスティネーションバケットの名前。', required=True)
# --endpoint パラメーターを指定して、バケットが配置されているリージョンのエンドポイントを示します。 このパラメーターはオプションです。
parser.add_argument('--endpoint', help='他のサービスが OSS にアクセスするために使用できるドメイン名')
# --key パラメーターを指定します。これは、デスティネーションオブジェクトの名前を指定します。 このパラメーターは必須です。
parser.add_argument('--key', help='デスティネーションオブジェクトの名前。', required=True)
# --source_key パラメーターを指定します。これは、ソースオブジェクトの名前を指定します。 このパラメーターは必須です。
parser.add_argument('--source_key', help='ソースオブジェクトの名前。', required=True)
# --source_bucket パラメーターを指定します。これは、ソースバケットの名前を指定します。 このパラメーターは必須です。
parser.add_argument('--source_bucket', help='ソースバケットの名前。', required=True)
def main():
# コマンドラインパラメーターを解析します。
args = parser.parse_args()
# 認証のために環境変数からアクセス認証情報を取得します。
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# SDK のデフォルト構成を読み込み、認証情報プロバイダーを指定します。
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# バケットが配置されているリージョンを指定します。
cfg.region = args.region
# endpoint パラメーターが指定されている場合は、エンドポイントを指定します。
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# 構成を使用して OSSClient インスタンスを作成します。
client = oss.Client(cfg)
# オブジェクトをコピーします。
result = client.copy_object(oss.CopyObjectRequest(
bucket=args.bucket, # デスティネーションバケットの名前。
key=args.key, # デスティネーションオブジェクトのキー名。
source_key=args.source_key, # ソースオブジェクトのキー名。
source_bucket=args.source_bucket, # ソースバケットの名前。
))
# コピー操作の結果情報を出力します。
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' version id: {result.version_id},'
f' hash crc64: {result.hash_crc64},'
f' source version id: {result.source_version_id},'
f' server side encryption: {result.server_side_encryption},'
f' server side data encryption: {result.server_side_data_encryption},'
f' last modified: {result.last_modified},'
f' etag: {result.etag},'
)
# スクリプトが直接実行されたときに main 関数を呼び出します。
if __name__ == "__main__":
main() # スクリプトが直接実行されたときに、スクリプトの main 関数にエントリポイントを指定します。関連情報
オブジェクトをコピーするための完全なサンプルコードについては、「copy_object.py」をご参照ください。