删除通用存储桶 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

删除通用存储桶

您可以删除空的 Amazon S3 通用存储桶。有关清空通用存储桶的信息,请参阅清空通用存储桶

可以使用 Amazon S3 控制台、Amazon Command Line Interface(Amazon CLI)、Amazon SDK 或 Amazon S3 REST API 删除存储桶。

重要

在删除通用存储桶之前,请注意以下事项:

  • 通用存储桶名称在全局命名空间中是唯一的。如果删除存储桶,请注意,另一个 Amazon Web Services 账户可以使用相同的通用存储桶名称来表示新存储桶,因此可能会收到针对已删除存储桶的请求。如果需要防止出现这种情况,或者如果您希望继续使用相同的存储桶名称,请不要删除该存储桶。我们建议您清空并保留存储桶,同时根据需要阻止任何存储桶请求。对于不再活跃使用的存储桶,我们建议清空存储桶中的所有对象,以最大限度地降低成本,同时保留存储桶本身。

  • 删除通用存储桶时,可能不会立即移除存储桶。相反,Amazon S3 会将存储桶排队以等待删除。由于 Amazon S3 分布在各个 Amazon Web Services 区域中,因此删除过程需要一些时间,才能在整个系统中完全传播并实现一致性。

  • 如果存储桶托管静态网站,并且您如 教程:使用注册到 Route 53 的自定义域配置静态网站 中所述创建并配置了 Amazon Route 53 托管区域,则必须清理与该存储桶相关的 Route 53 托管区域设置。有关更多信息,请参阅 步骤 2:删除 Route 53 托管区域

  • 如果存储桶收到来自弹性负载均衡(ELB)的日志数据,建议您先停止将 ELB 日志传输到该存储桶,然后再删除该存储桶。删除该存储桶后,如果其他用户创建使用相同名称的存储桶,则日志数据可能会传输到此同名存储桶。有关 ELB 访问日志的信息,请参阅《User Guide for Classic Load Balancers》中的 Access logs for your Classic Load Balancer 和《User Guide for Application Load Balancers》中的 Access logs for your Application Load Balancer

故障排除

如果您无法删除 Amazon S3 通用存储桶,请考虑以下事项:

  • 确保存储桶为空:仅当存储桶中没有任何对象时,才能删除存储桶。确保存储桶为空。有关清空存储桶的信息,请参阅清空通用存储桶

  • 确保没有附加任何接入点:只有当存储桶在同一个账户中未附加任何 S3 接入点或多区域接入点时,您才能删除存储桶。在删除存储桶之前,请删除附加到该存储桶的任何同账户接入点。

  • 确保您拥有 s3:DeleteBucket 权限:如果您无法删除存储桶,请与 IAM 管理员协作来确认您拥有 s3:DeleteBucket 权限。有关如何查看或更新 IAM 权限的信息,请参阅《IAM 用户指南》中的更改 IAM 用户的权限。有关问题排查信息,请参阅排查 Amazon S3 中的拒绝访问(403 Forbidden)错误

  • 检查 Amazon Organizations 服务控制策略(SCP)和资源控制策略(RCP)中的 s3:DeleteBucket Deny 语句:SCP 和 RCP 可以拒绝对存储桶的删除权限。有关更多信息,请参阅《Amazon Organizations User Guide》中的 service control policiesresource control policies

  • 检查存储桶策略中的 s3:DeleteBucket Deny 语句:如果您在 IAM 用户或角色策略中拥有 s3:DeleteBucket 权限,但无法删除存储桶,则存储桶策略可能对于 s3:DeleteBucket 包含 Deny 语句。默认情况下,由 Amazon Elastic Beanstalk 创建的存储桶具有包含此语句的策略。您必须先删除此语句或存储桶策略,然后才能删除存储桶。

先决条件

您必须先清空通用存储桶,然后才能删除该存储桶。有关清空存储桶的信息,请参阅清空通用存储桶

删除 S3 存储桶
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 在左侧导航窗格中,选择通用存储桶

  3. 在存储桶列表中,选择要删除的存储桶名称旁边的选项按钮,然后选择页面顶部的删除

  4. 删除存储桶页面上,通过在文本字段中输入存储桶名称来确认要删除存储桶,然后选择删除存储桶

    注意

    如果存储桶包含任何对象,请在删除存储桶之前清空存储桶,具体操作如下:在此存储桶不为空错误提醒中选择清空存储桶按钮,然后按照清空存储桶页面上的说明操作。然后,返回到 Delete bucket(删除存储桶)页面并删除存储桶。

  5. 要验证您是否已删除存储桶,请打开通用存储桶列表,并输入您删除的存储桶的名称。如果无法找到此存储桶,则表示删除成功。

以下示例展示了如何使用适用于 Java 的 Amazon SDK 清空和删除通用存储桶。该代码首先删除通用存储桶中的所有对象,然后删除该存储桶。

有关其它语言的示例,请参阅《Amazon Simple Storage Service API Reference》中的 Use DeleteBucket with an Amazon SDK or CLI。有关使用其它 Amazon SDK 的信息,请参阅用于 Amazon Web Services 的工具

Java

以下 Java 示例删除包含对象的存储桶。该示例将删除所有对象,然后删除存储桶。该示例适用于已启用版本控制或未启用版本控制的存储桶。

注意

对于未启用版本控制的存储桶,您可以直接删除所有对象,然后删除存储桶。对于启用了版本控制的存储桶,您必须先删除所有对象版本,然后再删除存储桶。

有关创建和测试有效示例的说明,请参阅 Amazon SDK for Java 2.x Developer Guide

import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.*; import java.util.Iterator; public class DeleteBucket2 { public static void main(String[] args) { Regions clientRegion = Regions.DEFAULT_REGION; String bucketName = "*** Bucket name ***"; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); // Delete all objects from the bucket. This is sufficient // for unversioned buckets. For versioned buckets, when you attempt to delete // objects, Amazon S3 inserts // delete markers for all objects, but doesn't delete the object versions. // To delete objects from versioned buckets, delete all of the object versions // before deleting // the bucket (see below for an example). ObjectListing objectListing = s3Client.listObjects(bucketName); while (true) { Iterator<S3ObjectSummary> objIter = objectListing.getObjectSummaries().iterator(); while (objIter.hasNext()) { s3Client.deleteObject(bucketName, objIter.next().getKey()); } // If the bucket contains many objects, the listObjects() call // might not return all of the objects in the first listing. Check to // see whether the listing was truncated. If so, retrieve the next page of // objects // and delete them. if (objectListing.isTruncated()) { objectListing = s3Client.listNextBatchOfObjects(objectListing); } else { break; } } // Delete all object versions (required for versioned buckets). VersionListing versionList = s3Client.listVersions(new ListVersionsRequest().withBucketName(bucketName)); while (true) { Iterator<S3VersionSummary> versionIter = versionList.getVersionSummaries().iterator(); while (versionIter.hasNext()) { S3VersionSummary vs = versionIter.next(); s3Client.deleteVersion(bucketName, vs.getKey(), vs.getVersionId()); } if (versionList.isTruncated()) { versionList = s3Client.listNextBatchOfVersions(versionList); } else { break; } } // After all objects and object versions are deleted, delete the bucket. s3Client.deleteBucket(bucketName); } catch (AmazonServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it, so it returned an error response. e.printStackTrace(); } catch (SdkClientException e) { // Amazon S3 couldn't be contacted for a response, or the client couldn't // parse the response from Amazon S3. e.printStackTrace(); } } }

如果包含对象的通用存储桶没有启用版本控制,则可以使用 Amazon CLI 删除该存储桶。当您删除一个包含对象的存储桶时,该存储桶中的所有对象都将被永久删除,包括已转换为 S3 Glacier Flexible Retrieval 存储类的对象。

如果存储桶未启用版本控制,则可将 rb(移除存储桶)Amazon CLI 命令和 --force 参数结合使用,来删除存储桶及其中的所有对象。此命令先删除所有对象,然后再删除存储桶。

如果启用了版本控制,则将 rb 命令与 --force 参数结合使用不会删除受版本控制的对象,因此存储桶删除失败,因为存储桶不为空。有关删除受版本控制的对象的更多信息,请参阅删除对象版本

要使用以下命令,请将 amzn-s3-demo-bucket 替换为您要删除的存储桶的名称:

$ aws s3 rb s3://amzn-s3-demo-bucket --force

有关更多信息,请参阅《Amazon Command Line Interface 用户指南》中的将高级别 S3 命令与 Amazon Command Line Interface结合使用