このトピックでは、バージョン管理が有効なバケットから、1 つ以上のファイル (オブジェクト) または指定されたプレフィックスを持つファイルを削除する方法について説明します。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 同じリージョン内の他の Alibaba Cloud サービスから Object Storage Service (OSS) にアクセスする場合は、内部エンドポイントを使用します。 OSS のリージョンとエンドポイントの詳細については、リージョンとエンドポイントをご参照ください。
このトピックでは、アクセス認証情報は環境変数から取得されます。 アクセス認証情報の設定方法の詳細については、Python 1.0 用 OSS SDK を使用したアクセス認証情報の設定をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。 カスタムドメイン名またはセキュリティトークンサービス (STS) を使用して OSSClient インスタンスを作成する場合は、初期化をご参照ください。
オブジェクトを削除するには、
oss:DeleteObject権限が必要です。 詳細については、RAM ユーザーへのカスタムアクセスポリシーの付与をご参照ください。
バージョン管理が有効なバケットでの削除動作
削除動作は次のとおりです:
versionId を指定しない場合 (論理削除):
versionId を指定せずに削除操作を実行すると、OSS はオブジェクトを削除する代わりに、オブジェクトの現在のバージョンに削除マーカーを挿入します。 その後、GetObject 操作を実行すると、OSS は削除マーカーを検出し、
404 Not Foundエラーを返します。 応答では、x-oss-delete-marker = trueヘッダーと、x-oss-version-idヘッダーに新しい削除マーカーのバージョン番号も返されます。x-oss-delete-markerの値が true の場合、返されたx-oss-version-idに対応するバージョンが削除マーカーであることを示します。versionId を指定した場合 (完全削除):
削除操作を実行して versionId を指定すると、OSS は
paramsオブジェクトのversionIdパラメーターに基づいて、そのバージョンのオブジェクトを完全に削除します。 ID が "null" のバージョンを削除するには、paramsパラメーターを使用し、params['versionId'] = "null"と設定します。 OSS は文字列 "null" を versionId "null" として扱い、この versionId を持つオブジェクトを削除します。
単一ファイルの削除
次の例では、単一のオブジェクトを完全に削除または論理削除する方法を示します。
完全削除
次のコードは、versionId を指定してオブジェクトを完全に削除する方法を示しています:
# -*- coding: utf-8 -*- import os import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider()) # バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 endpoint = "https://oss-cn-hangzhou.aliyuncs.com" # エンドポイントに対応するリージョン情報を指定します。たとえば、cn-hangzhou です。 このパラメーターは V4 署名に必要であることにご注意ください。 region = "cn-hangzhou" # yourBucketName をバケットの名前に設定します。 bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region) # yourObjectName をオブジェクトの完全なパスに設定します。 バケット名は含めないでください。 例:example/test.txt。 object_name = 'yourObjectName' # オブジェクトの versionId を指定します。 これは削除マーカーの versionId にすることもできます。 params = dict() params['versionId'] = 'yourObjectVersionIdOrDeleteMarkerVersionId' # 指定された versionId を持つオブジェクト、または削除マーカーに関連付けられたオブジェクトを削除します。 result = bucket.delete_object(object_name, params=params) print("delete object name: ", object_name) # オブジェクトの versionId が指定されている場合、返される delete_marker は None で、返される versionId は指定されたオブジェクトの versionId です。 # 削除マーカーの versionId が指定されている場合、返される delete_marker は True で、返される versionId は指定された削除マーカーの versionId です。 if result.delete_marker: print("delete del-marker versionid: ",result.versionid) else: print("delete object versionid:", result.versionid)論理削除
次のコードは、versionId を指定せずにオブジェクトを論理削除する方法を示しています:
# -*- coding: utf-8 -*- import os import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider()) # バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 endpoint = "https://oss-cn-hangzhou.aliyuncs.com" # エンドポイントに対応するリージョン情報を指定します。たとえば、cn-hangzhou です。 このパラメーターは V4 署名に必要であることにご注意ください。 region = "cn-hangzhou" # yourBucketName をバケットの名前に設定します。 bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region) # yourObjectName をオブジェクトの完全なパスに設定します。 バケット名は含めないでください。 例:example/test.txt。 object_name = 'yourObjectName' # versionId を指定せずにオブジェクトを論理削除します。 この操作により、オブジェクトに削除マーカーが追加されます。 result = bucket.delete_object(object_name) # 削除マーカーを表示します。 print("delete marker: ", result.delete_marker) # 返された削除マーカーの versionId を表示します。 print("delete marker versionid: ", result.versionid)
複数ファイルの削除
次の例では、複数のオブジェクトを完全に削除または論理削除する方法を示します。
完全削除
次のコードは、versionId を指定して複数のオブジェクトと削除マーカーを完全に削除する方法を示しています:
# -*- coding: utf-8 -*- import os import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider from oss2.models import BatchDeleteObjectVersion from oss2.models import BatchDeleteObjectVersionList # 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider()) # バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 endpoint = "https://oss-cn-hangzhou.aliyuncs.com" # エンドポイントに対応するリージョン情報を指定します。たとえば、cn-hangzhou です。 このパラメーターは V4 署名に必要であることにご注意ください。 region = "cn-hangzhou" # yourBucketName をバケットの名前に設定します。 bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region) version_list = BatchDeleteObjectVersionList() # オブジェクトまたは削除マーカーの versionId を渡すことができます。 obj1_versionid = 'yourObject1VersionId' obj1_del_marker_versionid = 'yourObject1DelMarkerVersionId' obj2_versionid = 'yourObject2VersionId' obj2_del_marker_versionid = 'yourObject2DelMarkerVersionId' version_list.append(BatchDeleteObjectVersion(key='yourObject1Name', versionid=obj1_versionid)) version_list.append(BatchDeleteObjectVersion(key='yourObject1Name', versionid=obj1_del_marker_versionid)) version_list.append(BatchDeleteObjectVersion(key='yourObject2Name', versionid=obj2_versionid)) version_list.append(BatchDeleteObjectVersion(key='yourObject2Name', versionid=obj2_del_marker_versionid)) # 指定された versionId を持つオブジェクトまたは削除マーカーをバッチで削除します。 result = bucket.delete_object_versions(version_list) # 削除されたオブジェクトまたは削除マーカーの versionId を表示します。 for del_version in result.delete_versions: print('del object name:', del_version.key) # 削除マーカーが削除されたかどうかを確認します。 print('Is del marker:', del_version.delete_marker) # 削除マーカーが削除された場合は、削除された削除マーカーの versionId を出力します。 それ以外の場合は、削除されたオブジェクトの versionId を出力します。 if del_version.delete_marker: print('del object del_marker.versionid', del_version.delete_marker_versionid) else: print('del object versionid:', del_version.versionid)論理削除
次のコードは、versionId を指定せずに複数のオブジェクトを論理削除する方法を示しています:
# -*- coding: utf-8 -*- import os import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider from oss2.models import BatchDeleteObjectVersion from oss2.models import BatchDeleteObjectVersionList # 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider()) # バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 endpoint = "https://oss-cn-hangzhou.aliyuncs.com" # エンドポイントに対応するリージョン情報を指定します。たとえば、cn-hangzhou です。 このパラメーターは V4 署名に必要であることにご注意ください。 region = "cn-hangzhou" # yourBucketName をバケットの名前に設定します。 bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region) key_list = ['yourObject1Name', 'yourObject2Name'] # versionId を指定せずに削除操作を実行すると、オブジェクトに削除マーカーが追加されます。 result = bucket.batch_delete_objects(key_list) for del_version in result.delete_versions: print('key name:', del_version.key) # 返された削除マーカーを出力します。 print('Is del marker:', del_version.delete_marker) print('key del_marker.versionid', del_version.delete_marker_versionid)
指定されたプレフィックスを持つファイルの削除
次のコードは、指定されたプレフィックスを持つファイルを削除する方法を示しています:
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
# yourBucketName をバケットの名前に設定します。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')
prefix = "yourKeyPrefix"
# 指定されたプレフィックスを持つすべてのファイルの versionId をリストし、これらのファイルを削除します。
next_key_marker = None
next_versionid_marker = None
while True:
result = bucket.list_object_versions(prefix=prefix, key_marker=next_key_marker, versionid_marker=next_versionid_marker)
for version_info in result.versions:
bucket.delete_object(version_info.key, params={'versionId': version_info.versionid})
for del_marker_info in result.delete_marker:
bucket.delete_object(del_marker_info.key, params={'versionId': del_marker_info.versionid})
is_truncated = result.is_truncated
if is_truncated:
next_key_marker = result.next_key_marker
next_versionid_marker = result.next_versionid_marker
else:
break関連ドキュメント
単一ファイルを削除する API 操作の詳細については、DeleteObject をご参照ください。
複数ファイルを削除する API 操作の詳細については、DeleteMultipleObjects をご参照ください。