問題の説明
Alibaba Cloud Object Storage Service (OSS) を使用する際、不要になったバケットを削除できない場合があります。この問題は、OSS コンソール、または OSS ソフトウェア開発キット (SDK) や ossutil などのツールを使用した場合に発生する可能性があります。次のようなエラーメッセージが返されることがあります。
OSS SDK または ossutil を使用してバケットを削除する際、「The bucket you tried to delete is not empty」というエラーメッセージが返されます。
OSS コンソールでバケットを削除する際、「The bucket is not empty. Check whether the bucket contains undeleted objects or incomplete multipart upload parts」というエラーメッセージが返されます。
原因
削除しようとしているバケットに、未削除のオブジェクト、パート、LiveChannel、または未完了のマルチパートアップロードタスクが含まれています。誤削除を防ぐため、OSS では空でないバケットの削除は許可されていません。
ソリューション
バケットを削除すると、データは復元できません。バケットを削除する前に、データがバックアップされていることを確認してください。その後、バケット内のすべてのオブジェクト、パート、LiveChannel を削除します。バケットを削除するには、次の手順を実行します。
未削除のファイルとパートの確認
バケットからファイルとパートを削除するには、次の手順を実行します。
OSS コンソールにログインします。
オブジェクト タブで、ファイルが存在するかどうかを確認します。
ファイルが存在する場合、1 つ以上のファイルを選択し、完全に削除 をクリックして削除します。また、ossutil を使用してファイルを削除することもできます。詳細については、「ossutil を使用してバケット、ファイル、およびパートを削除する」をご参照ください。
ファイルが存在しない場合は、次の手順に進んでください。
ossutil を使用して次のコマンドを実行し、バケットを削除します。「Bucket is not empty」エラーが引き続き発生する場合は、次の手順に進んでください。
./ossutil rm oss://[$Bucket_Name] -bar説明[$Bucket_Name] はバケットの名前です。
オブジェクトの以前のバージョンの確認
バージョニングは、バケットレベルのデータ保護機能です。バージョニングを有効にすると、オブジェクトの上書きや削除が以前のバージョンとして保存されます。誤ってオブジェクトを上書きまたは削除した場合でも、以前のバージョンに復元できます。ただし、コンソールまたはツールでオブジェクトを表示する際、バージョン番号を指定しない場合は、最新バージョンのみが表示されます。以前のバージョンは表示されません。オブジェクトの以前のバージョンを削除するには、次のいずれかの方法を使用します。
OSSコンソールの使用
OSS コンソールにログインします。
バケット をクリックし、目的のバケットの名前をクリックします。
左側のナビゲーションペインで、コンテンツセキュリティ > バージョン管理 を選択し、バージョニング機能が有効になっているかどうかを確認します。 バージョニング機能が有効になっている場合は、次の操作を実行して、以前のバージョンのオブジェクトを削除します。
ossutilの使用
次のコマンドを実行して、バージョニングが有効になっているかどうかを確認します。詳細については、「bucket-versioning」をご参照ください。
./ossutil bucket-versioning --method get oss://[$Bucket_Name]次のようなコマンド出力が表示されます。
bucket versioning status:Enabledバージョニングが有効になっている場合、結果は
Enabledです。次のコマンドを実行して、バケット内のオブジェクトの以前のバージョンを削除します。./ossutil rm oss://[$Bucket_Name]/ --all-versions -r次のようなコマンド出力が表示されます。

バージョニングが無効になっている場合、結果は
Disabledです。
バケット内にLiveChannelが存在するかどうかの確認
コンソールまたはツールから、バケット内の LiveChannel を表示または削除することはできません。これらの操作を実行するには、API または SDK を使用する必要があります。詳細については、「DeleteLiveChannel」をご参照ください。以下のサンプルコードをご参照ください。
import java.util.List;
import com.alibaba.fastjson.JSON;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.CreateLiveChannelRequest;
import com.aliyun.oss.model.CreateLiveChannelResult;
import com.aliyun.oss.model.ListLiveChannelsRequest;
import com.aliyun.oss.model.LiveChannelGenericRequest;
import com.aliyun.oss.model.LiveChannelListing;
import com.aliyun.oss.model.LiveChannelStatus;
import com.aliyun.oss.model.LiveChannelTarget;
import com.aliyun.oss.model.LiveChannel;
import com.aliyun.oss.common.auth.*;
public class DeleteLiveChannel {
private static String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
/**
* 環境変数からアクセス認証情報を取得します。
*/
private static final EnvironmentVariableCredentialsProvider CREDENTIALS_PROVIDER = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
private static String bucketName = "bucketname";
public static void createLiveChannel() {
// OSSClientインスタンスを作成します。
// OSSClientインスタンスが不要になったら、shutdownメソッドを呼び出してリソースを解放します。
String liveChannelName = "liveChannelName1";
OSS oss = new OSSClientBuilder().build(endpoint, CREDENTIALS_PROVIDER);
CreateLiveChannelRequest request = new CreateLiveChannelRequest(bucketName,
liveChannelName, "desc", LiveChannelStatus.Enabled, new LiveChannelTarget());
CreateLiveChannelResult result = oss.createLiveChannel(request);
// 取り込みURLを取得します。
List<String> publishUrls = result.getPublishUrls();
for (String item : publishUrls) {
System.out.println(item);
}
// 再生URLを取得します。
List<String> playUrls = result.getPlayUrls();
for (String item : playUrls) {
System.out.println(item);
}
oss.shutdown();
}
public static void listLiveChannels() {
// OSSClientインスタンスを作成します。
OSS oss = new OSSClientBuilder().build(endpoint, CREDENTIALS_PROVIDER);
ListLiveChannelsRequest request = new ListLiveChannelsRequest(bucketName);
LiveChannelListing liveChannelListing = oss.listLiveChannels(request);
List<LiveChannel> list = liveChannelListing.getLiveChannels();
for(LiveChannel i:list){
deleteLiveChannel(i.getName());
}
oss.shutdown();
}
public static void deleteLiveChannel(String liveChannelName) {
// OSSClientインスタンスを作成します。
OSS oss = new OSSClientBuilder().build(endpoint, CREDENTIALS_PROVIDER);
LiveChannelGenericRequest request = new LiveChannelGenericRequest(bucketName, liveChannelName);
System.out.println("Delete liveChannel "+liveChannelName+" Done");
try {
oss.deleteLiveChannel(request);
} catch (OSSException ex) {
ex.printStackTrace();
} catch (ClientException ex) {
ex.printStackTrace();
} finally {
oss.shutdown();
}
}
public static void main(String[] args) {
// TODO: 自動生成されたメソッドスタブ
DeleteLiveChannel.listLiveChannels();
}
}